Skip to main content

invoice.expired

Fired when an invoice’s expiresAt timestamp is reached and the invoice has not been fully paid.
Manually cancelling an invoice via POST /api/v1/invoices/:id/cancel flips its status to expired but does not fire this webhook. If you cancel an invoice from your backend, you already know it’s gone — handle the cancellation flow synchronously.

When it fires

The invoice expiresAt timestamp is reached and the cumulative received amount is less than the invoice total. data.expiry_reason distinguishes two cases:

What to do

Mark the order as failed and release any reserved inventory. If data.expiry_reason === 'underpaid_unresolved', you may want to contact the customer — they likely intended to pay and may try again. Issue a new invoice for the same amount (or the shortfall) and send them the new paymentUrl.

Payload


Handler example

Node.js

  • invoice.settled — The happy path — full payment received and settled.
  • invoice.underpaid — Fired earlier when partial payment was received before expiry.