Stripe Outage: What a 5xx Means for Your Payments and How to Detect and Recover
Failure facts checked on the vendor’s docs on Nov 8, 2026.
Stripe says its 5xx errors are rare. When they happen, the cost is not the error itself. It is that you may not know whether the charge went through. A payments outage page has to be about correctness first and uptime second.
What a Stripe outage returns
Stripe's HTTP table groups 500, 502, 503 and 504 as server errors on Stripe's side, and 424 as a failure in a dependency outside Stripe. Connection resets and timeouts are a separate class: Stripe calls them network errors, where the connection closed before your client saw a response.
For both classes the rule is the same: you cannot assume the request failed. Stripe tells you to treat a 500 as an indeterminate outcome, because the operation might already have produced side effects. For API v1 it also caches the 500 for a POST that used an idempotency key, so retrying with that key replays the error while Stripe keeps it.
What to do with the request
- Send an idempotency key on every
POST. Keys can be up to 255 characters and Stripe retains them for at least 24 hours. - Retry with the same key and the same parameters, within 24 hours of the original request. A different key can start a second operation.
- Honor
Stripe-Should-Retry.truemeans retry with exponential backoff,falsemeans stop. If it is absent, decide from the status code. SDKs do this for you. - Stop at the window and reconcile. Retrieve the object, check the Dashboard and use webhook events.
- Put your own identifier in
metadatawhen you create anything. Stripe says reconciliation can produce objects your integration never saw in an API response, and a local identifier lets you match them.
Example: one checkout, two outcomes
This is an example, not output from a real project.
2026-11-08T20:14:02Z op=payment_intent.create order=o_7781 idem=o_7781-a1 status=503 attempt=1 ms=2010
2026-11-08T20:14:04Z op=payment_intent.create order=o_7781 idem=o_7781-a1 status=503 attempt=2 ms=1980
2026-11-08T20:14:09Z op=payment_intent.create order=o_7781 idem=o_7781-a1 status=200 attempt=3 ms=340
2026-11-08T20:14:11Z op=payment_intent.create order=o_7782 idem=o_7782-a1 status=500 attempt=1 ms=1500Order 7781 recovered on the third attempt with the same key. Order 7782 got a 500 with no retry logged afterward. That order needs reconciliation: look up the payment intent by your metadata order ID before showing the customer an error or charging again.
What to log and watch
Log operation, idempotency key, attempt, status, Stripe-Should-Retry and duration. Then watch three numbers:
- The share of calls answered with 5xx or a timeout. Start at 2% over five minutes, with enough volume to mean something.
- Calls that ended in 5xx with no later success for the same key. These are your reconciliation backlog.
- Successful payments per hour against the same hour on previous weeks. If your checkout fails before it calls Stripe, error counts stay flat while revenue drops.
Getting told
Stripe publishes a notification when it creates, updates or resolves an incident. You can subscribe by email, SMS or Slack, follow the RSS or Atom feed, and pick the product areas you use. Choose only the areas that matter, or you will learn to ignore the feed.
Telling an outage from your own bug
A Stripe-side incident hits every operation that touches the affected product at once, from every code path and every region you run in. A bug in your code usually hits one operation, one parameter shape or one deploy. Compare the failing share per operation: if payment_intent.create fails while customer.retrieve is fine, look at what changed in your request. If everything fails and a rollback changes nothing, open the Stripe status site for the product area.
Checklist
- Every
POSTcarries a stored idempotency key. - 5xx results are queued for reconciliation, not shown as failures.
- Orders carry an identifier in Stripe
metadata. - Webhook handlers accept objects your API calls never returned.
- Revenue per hour is tracked next to error rate.
For the general method see vendor degradation detection and third-party failure monitoring; Stripe with Sazabi covers the connector options. For webhook silence during an incident, see webhook gaps. Sazabi can flag the 5xx share and the revenue dip in one issue.
Stripe outages facts
- A 500 leaves the outcome unknown: Stripe tells you to treat the outcome of a request that returned 500 as indeterminate, because the operation might already have caused side effects. (Stripe docs, accessed Nov 8, 2026)
- Retry with the same idempotency key for 24 hours: After a network failure, retry with the same idempotency key and parameters within 24 hours of the original request, then stop and reconcile. (Stripe docs, accessed Nov 8, 2026)
- Reconciliation after an incident: During incident recovery Stripe attempts to reconcile failed operations and sends webhook events for objects created during reconciliation, which is not guaranteed to resolve every operation. (Stripe docs, accessed Nov 8, 2026)
- Stripe-Should-Retry header: The Stripe-Should-Retry response header says true to retry with exponential backoff, false to stop, and SDKs honor it automatically. (Stripe docs, accessed Nov 8, 2026)
- Status notifications by product area: Stripe publishes a notification when it creates, updates or resolves an incident, and you can subscribe by email, SMS, Slack or RSS and choose product areas. (Stripe docs, accessed Nov 8, 2026)
With Sazabi
The Sazabi agent automatically sets up sensors for your project and maintains them over time. When your code calls Stripe, it watches a question like this one:
Tell me when the share of Stripe API calls answered with a 5xx or a timeout is well above its usual level, and when the number of successful charges per hour falls well below the usual level.
When the answer turns abnormal, Sazabi investigates and opens an issue. Vendor degradation covers the signal behind it.
Frequently Asked Questions
Should I retry a Stripe request that returned 500?
Only with the same idempotency key and the same parameters. Stripe says to treat a 500 as an indeterminate outcome and not to retry with a new key until you have worked out what happened to the original request.
How long can I keep retrying with the same idempotency key?
Stripe says to limit retries of an unresolved operation to the first 24 hours after the original request, because keys are retained for at least 24 hours and can be removed afterward.
Will Stripe finish payments that failed during an incident?
Stripe says it attempts to reconcile failed operations during recovery and sends webhook events for objects created that way, but it does not guarantee every operation is resolved. Check the objects yourself.
How do I find out about a Stripe incident?
Subscribe on the Stripe status site by email, SMS or Slack, or use the RSS or Atom feed, and pick the product areas you use.
Sources
- Server error handling, cached 500 for POST with an idempotency key, 24-hour retry window, Stripe-Should-Retry, status code table with 500, 502, 503, 504 (accessed Nov 8, 2026)
- Idempotency keys up to 255 characters, removable after at least 24 hours, parameter comparison (accessed Nov 8, 2026)
- 5xx codes indicate an error with Stripe servers and are rare (accessed Nov 8, 2026)
- Incident notifications by email, SMS, Slack and RSS or Atom feed, product area selection (accessed Nov 8, 2026)