Is Stripe Down? How to Check and What to Do

by API Status Check

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)

  1. Confirm it's Stripe: Check status.stripe.com AND apistatuscheck.com/api/stripe
  2. Identify scope: Is it API, Dashboard, Webhooks, or everything?
  3. Don't retry aggressively: If the API is down, hammering it makes recovery slower for everyone
  4. 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:

  1. Show a graceful error: "Payment processing is temporarily unavailable. Please try again in a few minutes."
  2. Save the cart: Don't lose the customer — persist cart state so they can return
  3. Offer alternatives: If you have PayPal, Apple Pay (via another processor), or invoice billing, surface those options
  4. 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:

  1. Stripe auto-retries: Billing retries failed invoices automatically (1, 3, 5, 7 days by default)
  2. Don't cancel subscriptions: A brief outage doesn't mean the customer churned
  3. Check after recovery: Dashboard → Billing → Invoices → filter by "Past due"

Webhooks are Down

Webhook delivery failures during an outage are expected. Stripe handles this:

  1. Automatic retry: Stripe retries webhooks for up to 3 days with exponential backoff
  2. No data loss: Events are stored and will be delivered when your endpoint recovers
  3. 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:

  1. Payments still process: API and Stripe.js work independently of the Dashboard
  2. Use the API directly: Everything you can do in the Dashboard, you can do via API
  3. Stripe CLI: stripe listen and stripe trigger work 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 →