Skip to main content
Grow CRM emits webhook events across the full expense lifecycle. Your endpoint may receive five event keys: expense.created, expense.updated, expense.deleted, expense.sundry, and expense.activity. Use expense.updated to react to significant changes such as editing core fields, updating recurring settings, or attaching an expense to a project; use expense.sundry for lower-significance field edits such as category changes; and use expense.activity to track file attachments added or removed from an expense. Both cloning an expense and creating one from scratch fire expense.created, so you can rely on that single event to capture the full object at the point of entry.
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 expense object

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

expense.created

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

expense.updated

Fires when a significant change is made to an expense. Read data.change to determine what changed; data.expense contains the full expense object.

expense.sundry

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

expense.activity

Fires when a child record on the expense changes. Expenses produce only type: "attachment". Read data.action to distinguish additions from deletions.
Unlike invoices, expense attachment deletion uses a pre-delete hook, so the full item shape (including filename and created) is reliably present in both added and deleted deliveries.

expense.deleted

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