invoice.expired
Fired when an invoice’sexpiresAt 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 invoiceexpiresAt timestamp is reached and the cumulative received amount is less than the invoice total.
data.expiry_reason distinguishes two cases:
data.expiry_reason | Meaning |
|---|---|
no_payment | No payment was received. Customer abandoned the checkout. |
underpaid_unresolved | A partial payment was received but the customer did not complete it before expiry. The partial funds remain at the deposit address — contact Settlx support to recover them. |
What to do
Mark the order as failed and release any reserved inventory. Ifdata.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
Related events
invoice.settled— The happy path — full payment received and settled.invoice.underpaid— Fired earlier when partial payment was received before expiry.