payment.recovered
A previously failed payment was recovered.
Payload
All webhook payloads follow a consistent top-level structure with event-specific data nested within the data object.
The recovered invoice ID.
The human-readable invoice number.
Invoice total in cents (100 = $1.00).
The customer ID. Returns your externalId if you provided one when creating the customer, otherwise returns the Commet publicId.
The subscription ID, if the invoice is linked to a subscription.
{
"event": "payment.recovered",
"timestamp": "2026-04-27T10:15:00.000Z",
"organizationId": "org_abc123",
"mode": "live",
"apiVersion": "2026-06-10",
"data": {
"invoiceId": "inv_n4o5p6",
"invoiceNumber": "INV-0043",
"invoiceTotal": 9900,
"customerId": "user_123",
"subscriptionId": "sub_1a2b3c4d"
}
}When this fires
After a payment failure put a subscription in past_due, a successful retry of the outstanding invoice fires this event — whether the charge succeeded automatically or the customer paid through the portal after updating their card.
The subscription returns to active at the same time, so customer.state_changed also fires. Restore access on either event; use this one specifically to close dunning flows you opened on payment.failed.
How is this guide?