Invoice refunded
Fires when money paid on an invoice is refunded, as a credit note: one made with Create a credit note or in the dashboard, or a refund made in Stripe's dashboard on a payment Stripe collected for an invoice. Sent once per credit note; a partial refund sends it for its own amount. data.creditNote is the credit note, as Get a credit note returns it.
Headers
- Type: stringX
- Webhook - Signature requiredt=<timestamp>,s=<signature>.tis when the delivery was signed, in Unix milliseconds; each attempt is signed afresh, so a retry has a newt.sis the Base64 (standard alphabet, padded) HMAC-SHA256 of the string<t>.<raw request body>, keyed with your signing secret: the wholewhsec_…string as UTF-8. To verify, recompute it over the raw body exactly as received and compare in constant time, then reject attoo far from now (5 minutes is a good limit) so an old delivery can't be replayed.scan end in=, so split each part on its first=only.
Body
Every delivery's body.
- Type:datarequiredProperties: 1
The event's payload, under the key the event names.
- enumeventconst:billing-invoice-refundedrequired
A billing event you can receive.
billing-invoice-paid,billing-invoice-posted,billing-invoice-refunded,billing-checkout-created,billing-checkout-completed,billing-checkout-expired,billing-payment-succeeded,billing-payment-failed,billing-credits-depleted,billing-overage-incurredandbilling-credit-cap-reached; each is described in the Webhooks section.values- billing
-invoice -paid - billing
-invoice -posted - billing
-invoice -refunded - billing
-checkout -created - billing
-checkout -completed - billing
-checkout -expired - billing
-payment -succeeded - billing
-payment -failed - billing
-credits -depleted - billing
-overage -incurred - billing
-credit -cap -reached
- billing
- Type: stringidrequired
The delivery's ID (
whd_…), the same on every retry of it: keep the IDs you've handled and ignore a delivery whose ID you've seen. A test delivery has an ID of its own. - Type: booleanis
Test requiredtruefor a delivery sent with Send a test delivery, whosedatais placeholder;falseotherwise. - Type: stringFormat: date-timetimestamprequired
When the event happened, and the delivery was first queued; the same on every retry.
Responses
- 200
Return any 2xx to acknowledge. Any other status, a redirect (redirects aren't followed), or no answer within 5 seconds is a failed attempt, recorded in the webhook's
lastStatus. A failed delivery is retried 1 minute, 5 minutes, 30 minutes, 2 hours and then 12 hours after each failed attempt in turn (retries are sent by a sweep that runs every minute, so each can be up to a minute later), and dropped after the sixth failed attempt. A retry carries the sameidandtimestampand goes to the webhook's current URL; a delivery whose webhook has since been switched off is dropped. Because of retries, an event can arrive more than once or after a later one: useidto ignore repeats. The response body is ignored.
{
"id": "whd_Rk3Tn8Wc1Yb6Hm2Q",
"event": "billing-invoice-refunded",
"timestamp": "2026-11-10T15:02:44.131Z",
"isTest": false,
"data": {
"creditNote": {
"id": "cn_8Tq2Wv5Yn1Hk7Rb4",
"displayNumber": "INV-0042-CN1",
"invoiceId": "inv_3Rk8Wq1Zp6Ty0Xm2",
"customerId": "cus_Q2x9vB7mK4pT1sLw",
"amount": 1499,
"currency": "GBP",
"reason": "Money-back guarantee",
"refundMethod": "stripe",
"stripeRefundId": "re_3QmN8b2eZvKYlo2C1a9Xw0Pt",
"createdAt": "2026-11-10T15:02:44.118Z"
}
}
}