Skip to main content
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