subscription.past_due
Fired when a recurring payment fails and the subscription becomes past due. Access is cut immediately.
Payload
All webhook payloads follow a consistent top-level structure with event-specific data nested within the data object.
The subscription ID.
The customer ID. Returns your externalId if you provided one when creating the customer, otherwise returns the Commet publicId.
Always "past_due" for this event.
The invoice whose payment failure triggered the status.
The human-readable invoice number.
{
"event": "subscription.past_due",
"timestamp": "2026-04-25T00:05:00.000Z",
"organizationId": "org_abc123",
"mode": "live",
"apiVersion": "2026-05-25",
"data": {
"subscriptionId": "sub_1a2b3c4d",
"customerId": "user_123",
"status": "past_due",
"invoiceId": "inv_n4o5p6",
"invoiceNumber": "INV-0043"
}
}When this fires
A recurring charge failed on a subscription that has been paid before. Commet sets the status to past_due and access checks (features, usage, seats) start denying immediately — there is no grace period.
payment.failed fires alongside this event with the charge failure details (failureCode, failureMessage). Use subscription.past_due to drive your access state and payment.failed to drive recovery messaging.
First-checkout card declines do NOT trigger this event — a subscription that was never paid moves back to pending_payment instead.
How is this guide?