Action guide

Know exactly which charge failed, when and why

POST/v1/events · invoice.payment_failed

Emit an `invoice.payment_failed` event whenever a charge attempt fails, at initial capture, on retry, or after the card was updated.

When to emit

Inside the webhook handler for `invoice.payment_failed` or `charge.failed`, scoped to the customer organization.

Example payload
await recalled.events.create({
  action: "invoice.payment_failed",
  actor: { id: user.id, email: user.email },
  organization: user.organizationId,
  metadata: {
    amount: "value",
    currency: "value",
    reason: "value"
  },
});
Metadata to include

Keep metadata flat and consistent across your service so it plays well with search and CSV exports.

KeyPurpose
amountAmount that failed, in smallest unit
currencyISO 4217 code
reasoncard_declined, insufficient_funds, expired_card, do_not_honor
providerEventIdStripe evt_xxx or equivalent
Suggested retention

Keep for at least 18 months to handle disputes and dunning investigations.

Related actions