Skip to content

Invoice webhooks (V2)

Create an invoice webhook registration through /api/v2/management/webhook-registrations/. Its payload uses the same invoice representation as /api/v2/management/invoices/{id}/, without expansions. Invoice identifiers are UUIDs.

Event Trigger
invoice.created An invoice is inserted.
invoice.updated An invoice is updated, or one of its line items is inserted, updated, or deleted.

Moving a line item to another invoice notifies both invoices. Each notification belongs to the company that issued that invoice, even when its client or a line item's cached company field belongs to another company.

Each delivery attempt reads the invoice's current state, including its line items. The payload is not a snapshot of the invoice when the change occurred. Retries can therefore contain newer state. A transaction that changes several rows can produce several notifications; consumers should synchronize by invoice ID and handle duplicate delivery identities.

Renaming what a line sells, such as a product or a class pass, changes that line's description and produces invoice.updated for every invoice that bills it. Changing a company's currency does not by itself produce an invoice notification; the next invoice or line-item notification includes the then-current representation. Deleting an invoice does not emit an invoice.deleted event; a pending notification whose invoice no longer exists is discarded.

Payment, finalization, and refund flows produce invoice.updated when they update the invoice. This event does not mean that payment succeeded. Read status, paid_amount, and outstanding_amount from the payload instead of treating every update as a payment transition. Detect invoice lifecycle steps shows the change that marks each step.

Existing Backoffice invoice webhooks retain their separate lifecycle events and payloads. Existing Public API V1 registrations cannot subscribe to the new invoice events.