All the events below are delivered to your usual webhook endpoints (see
Webhooks: overview for setup, headers and signature
verification). Subscribe to the names as is.
The delivered body
The fields in data are camelCase (subscriptionId, currentPeriodEnd), the envelope is
snake_case (created_at). Do not assume a single convention.
Subscription events
Read data.status, never the event name alone. subscription.canceled with
status: "active" means “scheduled departure, rights maintained”. subscription.created with
status: "unpaid" means “the first payment did not go through”.
Invoice and payment events
invoice.paid and payment.completed are delivered at least once: on a successful
renewal, both may arrive twice. Deduplicate on data.invoiceId / data.orderId.
What is not emitted
So you do not wait for an event that will not come:
checkout.session.completed in subscription mode: only exists for one-off payments.
Listen to subscription.created.
invoice.created: never emitted. The first trace of an invoice is invoice.finalized.
invoice.overdue: reserved for manual invoices, never subscription invoices.
- Nothing at the end of a trial nor on a quantity change. For the trial, watch
invoice.finalized then invoice.paid.
A typical journey