Is Stripe Down? How to Check and What to Do
Is Stripe Down? How to Check and What to Do
Stripe processes hundreds of billions of dollars in payments annually for millions of businesses. When Stripe goes down, it doesn't just mean a dashboard won't load — it means revenue stops flowing. Shopping carts fail, subscriptions don't renew, payouts don't land, and every second of downtime has a direct dollar cost.
With 390+ monthly searches for "is Stripe down," payment failures are a regular source of developer panic.
Here's how to figure out what's happening and keep the money moving.
How to Check if Stripe is Actually Down
Step 1: Check Official Status
Stripe Status Page: status.stripe.com
Stripe breaks down their status by component:
- API (core payments processing)
- Dashboard (management console)
- Stripe.js / Checkout (client-side)
- Connect (platform/marketplace payments)
- Billing (subscriptions and invoicing)
- Terminal (in-person payments)
- Identity (verification)
- Radar (fraud detection)
- Webhooks (event delivery)
- Payouts (bank transfers)
⚠️ API vs. Dashboard: Stripe's API can be healthy while the Dashboard is down (and vice versa). If you can't log into the Dashboard but payments are still processing, don't panic — check both independently.
Step 2: Check API Status Check
Real-time monitoring: apistatuscheck.com/api/stripe
Independent monitoring catches issues before Stripe's status page updates — critical when money is on the line.
Step 3: Check Community Reports
- Twitter/X: Search "Stripe down" — merchants report fast
- Reddit: r/stripe for developer reports
- Hacker News: Stripe outages always make the front page
- Stripe Developer Discord: Community reports from other integrators
Step 4: Test Your Integration
# Check if Stripe's API is responding
curl -s -o /dev/null -w "%{http_code}" https://api.stripe.com/v1/charges \
-u sk_test_YOUR_TEST_KEY:
# Check with a minimal request (list 1 customer)
curl -s https://api.stripe.com/v1/customers?limit=1 \
-u sk_test_YOUR_TEST_KEY: | python3 -m json.tool | head -5
# Check Stripe.js CDN (client-side)
curl -s -o /dev/null -w "%{http_code}" https://js.stripe.com/v3/
# Check webhook endpoint health
curl -s https://api.stripe.com/v1/webhook_endpoints \
-u sk_test_YOUR_TEST_KEY: | python3 -c "
import json, sys
data = json.load(sys.stdin)
for ep in data.get('data', []):
print(f\"{ep['url']}: status={ep['status']}\")
"
Common Stripe Issues (That Aren't Platform Outages)
Payment Declines ≠ Stripe Down
The most common false alarm. A payment declined doesn't mean Stripe is down. Check the decline code:
| Decline Code | Meaning | Stripe's Fault? |
|---|---|---|
card_declined |
Card issuer rejected | No — cardholder's bank |
insufficient_funds |
Not enough money | No — cardholder issue |
expired_card |
Card expired | No — cardholder needs new card |
incorrect_cvc |
Wrong security code | No — user error |
processing_error |
Stripe/bank processing issue | Maybe — retry in a moment |
rate_limit |
Too many API requests | No — your integration |
api_connection_error |
Can't reach Stripe API | Maybe — check your network |
If all payments suddenly fail with processing_error: That's likely a Stripe-side issue. Check the status page.
Webhook Delivery Failures
- Symptom: Webhooks stop arriving, events pile up
- Check: Dashboard → Developers → Webhooks → check for failed deliveries
- Common causes: Your server is returning non-2xx responses, SSL certificate expired, firewall blocking Stripe IPs
- Not Stripe's fault: 95% of webhook failures are on the receiving end
API Key Issues
- Symptom: All requests return 401 Unauthorized
- Check: Are you using the right key (test vs. live)? Did someone rotate keys?
- Restricted keys: If using restricted keys, verify the key has permissions for the endpoint you're calling
Stripe.js Loading Issues
- Symptom: Checkout form doesn't render, payment fields are blank
- Common causes: Content Security Policy (CSP) blocking
js.stripe.com, adblockers, browser extensions - Fix: Ensure your CSP allows
js.stripe.com,api.stripe.com, and*.stripe.network
<!-- Required CSP for Stripe.js -->
<meta http-equiv="Content-Security-Policy" content="
script-src 'self' js.stripe.com;
frame-src js.stripe.com hooks.stripe.com;
connect-src api.stripe.com;
">
Connect Platform Issues
- Symptom: Connected account payments fail but direct charges work
- Check: Is the connected account restricted, under review, or missing capabilities?
- Dashboard: Check the connected account's status in Connect → Accounts
What to Do When Stripe is Actually Down
Immediate Response (First 5 Minutes)
- Confirm it's Stripe: Check status.stripe.com AND apistatuscheck.com/api/stripe
- Identify scope: Is it API, Dashboard, Webhooks, or everything?
- Don't retry aggressively: If the API is down, hammering it makes recovery slower for everyone
- Communicate: Tell your team and prepare a customer-facing message
Payment Processing is Down
This is the nightmare scenario. Revenue is directly impacted.
For e-commerce / one-time payments:
- Show a graceful error: "Payment processing is temporarily unavailable. Please try again in a few minutes."
- Save the cart: Don't lose the customer — persist cart state so they can return
- Offer alternatives: If you have PayPal, Apple Pay (via another processor), or invoice billing, surface those options
- Queue retry: Store the payment intent and auto-retry when Stripe recovers
// Graceful payment failure handling
async function processPayment(paymentData) {
try {
const paymentIntent = await stripe.paymentIntents.create({
amount: paymentData.amount,
currency: 'usd',
payment_method: paymentData.paymentMethodId,
confirm: true,
idempotency_key: paymentData.orderId, // Prevent duplicate charges on retry
});
return { success: true, paymentIntent };
} catch (error) {
if (error.type === 'StripeConnectionError' || error.type === 'StripeAPIError') {
// Stripe is likely down — queue for retry
await queuePaymentRetry({
...paymentData,
attemptedAt: Date.now(),
retryCount: 0,
});
return {
success: false,
queued: true,
message: 'Payment processing is temporarily delayed. You will NOT be charged twice.'
};
}
// Card decline or other non-outage error
return { success: false, error: error.message };
}
}
For subscriptions / recurring billing:
- Stripe auto-retries: Billing retries failed invoices automatically (1, 3, 5, 7 days by default)
- Don't cancel subscriptions: A brief outage doesn't mean the customer churned
- Check after recovery: Dashboard → Billing → Invoices → filter by "Past due"
Webhooks are Down
Webhook delivery failures during an outage are expected. Stripe handles this:
- Automatic retry: Stripe retries webhooks for up to 3 days with exponential backoff
- No data loss: Events are stored and will be delivered when your endpoint recovers
- Manual sync: After the outage, you can list missed events:
# Fetch events from the last hour that may have been missed
curl https://api.stripe.com/v1/events?created[gte]=$(date -d '1 hour ago' +%s)&limit=100 \
-u sk_live_YOUR_KEY:
Dashboard is Down (but API Works)
This is annoying but not critical:
- Payments still process: API and Stripe.js work independently of the Dashboard
- Use the API directly: Everything you can do in the Dashboard, you can do via API
- Stripe CLI:
stripe listenandstripe triggerwork without the Dashboard
Payouts are Delayed
- Check: Dashboard → Balance → Payouts or
stripe balance_transactions list - Stripe payout schedule: Standard is T+2 (business days). Delays during outages typically resolve within 24 hours
- Your bank: Sometimes the delay is on the receiving bank's end, not Stripe
Building Stripe Resilience
Idempotency Keys (Critical)
Always use idempotency keys to prevent duplicate charges during retries:
// ALWAYS include idempotency keys for create operations
const charge = await stripe.charges.create({
amount: 2000,
currency: 'usd',
source: 'tok_visa',
}, {
idempotencyKey: `order_${orderId}`, // Tied to your order, not random
});
// If you retry this exact call, Stripe returns the original result — no double charge
Multi-Payment Provider Setup
For high-revenue businesses, a single payment provider is a single point of failure:
| Primary | Backup | Switch Trigger |
|---|---|---|
| Stripe | Braintree/PayPal | 3 consecutive API failures |
| Stripe | Adyen | Status page shows major outage |
| Stripe Checkout | PayPal Checkout | Stripe.js fails to load |
Webhook Reliability
// Verify webhook signatures AND handle replay
app.post('/webhooks/stripe', async (req, res) => {
let event;
try {
event = stripe.webhooks.constructEvent(
req.body,
req.headers['stripe-signature'],
process.env.STRIPE_WEBHOOK_SECRET
);
} catch (err) {
return res.status(400).send(`Webhook Error: ${err.message}`);
}
// Idempotent processing — don't process the same event twice
const processed = await db.webhookEvents.findOne({ stripeEventId: event.id });
if (processed) {
return res.json({ received: true, duplicate: true });
}
// Process the event
await handleStripeEvent(event);
await db.webhookEvents.insertOne({
stripeEventId: event.id,
processedAt: new Date()
});
res.json({ received: true });
});
Monitor Proactively
Don't wait for customers to report failed payments:
// Alert on payment failure rate spikes
// Run every 5 minutes via cron
async function checkPaymentHealth() {
const fiveMinAgo = Math.floor(Date.now() / 1000) - 300;
const charges = await stripe.charges.list({ created: { gte: fiveMinAgo }, limit: 100 });
const total = charges.data.length;
const failed = charges.data.filter(c => c.status === 'failed').length;
const failRate = total > 0 ? failed / total : 0;
if (failRate > 0.3 && total > 5) { // >30% failure rate with meaningful sample
await alertTeam(`⚠️ Payment failure rate spike: ${(failRate * 100).toFixed(0)}% (${failed}/${total} in last 5min)`);
}
}
Notable Stripe Outages
July 2019 — Major API Degradation (2+ Hours)
Stripe's API experienced elevated error rates and slow response times affecting payment processing globally. Many merchants reported failed charges during peak business hours.
November 2021 — Dashboard and API Issues
Multiple degraded performance events within the same week, affecting both the Dashboard and API intermittently.
Stripe's Track Record
Stripe generally maintains excellent uptime (99.99%+ for the core API). Most "outages" are partial — affecting specific features (webhooks, Connect, Billing) rather than core payment processing. Full payment processing outages are extremely rare and usually resolved within 30-60 minutes.
Stripe Alternatives
| Service | Best For | Migration Effort | Pricing |
|---|---|---|---|
| Braintree (PayPal) | PayPal integration | Moderate | 2.59% + $0.49 |
| Adyen | Enterprise, global | High | Interchange++ |
| Square | In-person + online | Moderate | 2.6% + $0.10 |
| PayPal Commerce | Consumer recognition | Low (add alongside) | 2.59% + $0.49 |
| Paddle | SaaS / digital goods | Moderate | 5% + $0.50 (MoR) |
| Lemon Squeezy | Digital products | Low | 5% + $0.50 (MoR) |
| Razorpay | India-focused | High | 2% per transaction |
Stay Updated
- Monitor Stripe status: apistatuscheck.com/api/stripe
- Subscribe to alerts: Get notified the moment Stripe has issues — before your customers notice
- Stripe Status RSS: status.stripe.com → Subscribe
- @stripestatus on Twitter: Official incident communication
Last updated: February 2, 2026. We monitor Stripe and 50+ APIs 24/7 at API Status Check.
Monitor Your APIs
Check the real-time status of 100+ popular APIs used by developers.
View API Status →