Skip to main content
Grow CRM emits webhook events across the full invoice lifecycle. Your endpoint may receive any of five event keys: invoice.created, invoice.updated, invoice.deleted, invoice.sundry, and invoice.activity. Use invoice.updated to track significant state transitions such as publishing, payment, or cancellation; use invoice.sundry for lower-significance field edits such as category or tag changes; and use invoice.activity to react to file attachments. Note that recording a payment that fully settles an invoice fires both a payment.created event and an invoice.updated event with change: "paid" — subscribe to both if your integration needs to act on each fact separately.
The webhook envelope structure, delivery behaviour, and retry logic are documented in Introduction. Signature verification is covered in Verification. Those conventions apply to every event on this page and are not repeated here.

The invoice object

Every event key except invoice.deleted carries the full invoice object. In invoice.created the object appears flat inside data; in invoice.updated and invoice.sundry it is nested under data.invoice. Line item fields

invoice.created

Fires when an invoice is created, including when an existing invoice is cloned. data is the full invoice object.

invoice.updated

Fires when a significant change is made to an invoice. Read data.change to determine what changed; data.invoice contains the full invoice object reflecting its state after the change.
The paid change is co-fired by the payment recording action. Subscribe to Payments as well if you also need the payment amount and gateway details.

invoice.sundry

Fires when a minor or cosmetic field is edited. Read data.field to determine which field changed; data.invoice contains the full invoice object.

invoice.activity

Fires when a child record on the invoice changes. Invoices produce only type: "attachment" — invoices are not part of the core comment system. Read data.action to distinguish additions from deletions.
Unlike estimates, the invoice file-deletion event has no pre-delete hook. By the time the webhook listener runs, the file row may already be gone. The lookup is best-effort: if the record is still found the full item shape is delivered; if not, no invoice.activity delivery is queued for that deletion at all — not even a minimal { id }.

invoice.deleted

Fires after the invoice is permanently deleted. Because the record no longer exists, data contains only the invoice id.