Automatic retries
Stripe retries live webhook deliveries for up to three days with exponential backoff.
Stripe webhook retries
Stripe retries failed webhook deliveries automatically, but retry duration, duplicate events, event ordering, and downstream failures still affect how you design the receiver. This guide separates Stripe delivery behavior from the recovery jobs your application owns.
curl https://webhookscheduler.com/api/v1/schedule \
-H "Authorization: Bearer wh_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.example.com/billing/recovery",
"runAt": "2026-09-01T09:30:00.000Z",
"body": {
"event": "invoice.payment_failed",
"invoiceId": "in_123"
},
"idempotencyKey": "billing-recovery:in_123"
}'Stripe retries live webhook deliveries for up to three days with exponential backoff.
Record processed event IDs and make business side effects idempotent because duplicate events can occur.
Schedule a separate retryable job when work after the Stripe event must run later or survive an outage.
In live mode, Stripe retries failed webhook deliveries for up to three days with exponential backoff. In a sandbox, Stripe retries three times over a few hours. The exact timing is managed by Stripe rather than by a fixed interval you should reproduce in application code.
| Delivery path | Available window | Behavior |
|---|---|---|
| Automatic, live | Up to 3 days | Exponential backoff |
| Automatic, sandbox | A few hours | 3 retry attempts |
| Manual, Dashboard | Up to 15 days | Resend from the event page |
| Manual, Stripe CLI | Up to 30 days | Use stripe events resend |
These limits come from the current Stripe webhook documentation. Check it before relying on a specific recovery window.
Stripe treats a successful HTTP response as acknowledgement of the event. Verify the signature, persist the event, return a successful response, and move slow business work out of the request path. Long processing inside the webhook handler makes timeouts and repeated deliveries more likely.
A retry proves that Stripe did not receive the expected acknowledgement. It does not prove that your previous handler performed no side effect, so the receiver still needs idempotent processing.
Stripe does not guarantee event ordering and can deliver the same event more than once. Store processed event IDs and check current Stripe object state before changing access, sending a customer message, or updating billing records.
Use your own idempotency key for downstream jobs as well. A stable key such as an invoice ID plus the recovery action keeps a duplicate Stripe event from scheduling duplicate work.
Webhook Scheduler does not replace Stripe webhook delivery. It handles a different step: a future HTTP action your application creates after accepting the Stripe event. Examples include a payment follow-up tomorrow, a grace-period check next week, or a retry of a temporarily unavailable CRM endpoint.
That job can be canceled if the invoice is paid first, retried if the downstream endpoint fails, and inspected through a delivery timeline. For the broader workflow, see billing retries and payment follow-ups.
Stripe currently retries live-mode webhook deliveries for up to three days with exponential backoff. Sandbox retries use a shorter three-attempt schedule.
Yes. Stripe documents that duplicate events can occur. Record processed event IDs and make each business side effect idempotent.
No. Retrieve the latest object state when ordering matters instead of assuming events arrive in creation order.
No. Stripe still delivers its own events. Webhook Scheduler is for delayed or retryable downstream HTTP work created by your application.
Start with the free plan, test a real delivery, then upgrade when the workflow becomes production critical.
Try a downstream job