Event catalogue
Choose lifecycle events and inspect every published webhook schema.
Browse the webhook contracts in the public API specification. Availability depends on
the product, endpoint subscriptions, and merchant configuration. A schema entry alone
is not proof that a workflow has emitted an event.
| Workflow | Guidance |
|---|
| Invoice fulfilment | invoice.paid; verify the current invoice state |
| Overdue follow-up | invoice.overdue; one notification per fixed step (0, 1, 7, 14, 30 days) |
| Payment reconciliation | payment.succeeded; avoid a second fulfilment if invoice processing owns it |
| Subscription access | Subscription state changes; choose published lifecycle events and reconcile status and effective dates |
| Direct Debit | mandate.activated concerns mandate readiness; collection outcome is separate |
| Usage | Review usage.threshold.reached and the relevant contract; not every usage event is billable |
Related events are notifications, not a delivery-order guarantee. Choose a single
fulfilment owner and use a business idempotency key. Mandate activation does not
itself authorise immediate collection; observe notice and collection rules.
Each link opens the generated schema and available example. Examples are fixtures.
See full and truncated envelopes.
credit_note.created is sent when a credit note is created for an invoice. credit_note.issued follows when that credit note is issued (finalised) and its PDF is generated. Use credit_note.issued if you need the final document; use credit_note.created only if you act on the credit note before it is issued.
checkout.session.completed is sent once when a checkout session is paid. checkout.session.expired is sent once when an open or pending session is expired with POST /v2/checkout-sessions/{id}/expire. A session that only reaches its expiry time without being paid is not sent as an event. Neither event is sent again if the same session is processed twice. A session that is already completed, or whose payment is in progress, cannot be expired, so it never sends checkout.session.expired.
In data.object, status is completed or expired, and amount_total and currency are in minor units and the session's currency. invoice_id is the invoice the session pays. success_url is included on a completed session when one was set.
Subscribing with a wildcard. One completed checkout produces two events: checkout.session.completed and commerce.checkout.completed. commerce.checkout.completed belongs to the commerce journey events and is not part of this catalogue. An endpoint subscribed to * receives both, and each has its own event id. checkout.* matches only the checkout.session.* events, and commerce.* matches only the commerce events. To act on a completed payment exactly once, subscribe to checkout.session.completed by name, or ignore commerce.checkout.completed in your handler.
Tolerate additive fields, validate required fields, and handle unknown event types
without applying business effects. Never infer emission or delivery order from a
catalogue label. Continue with receiving events.
Owner: david · Reviewed 10 Oct 2026 · Next review 30 Oct 2026