
stripe expired card recovery
Stripe Expired Card Recovery: Why Retries Don't Work
Why Expired Cards Break Stripe's Retry Logic
Stripe's retry system works brilliantly for one type of payment failure: timing problems. When a customer's card declines because of insufficient funds or a temporary authorization hold, retry logic makes sense. The customer has money, the card is valid, the timing was just wrong. Wait a few days, try again, problem solved.
Expired cards don't work that way. No amount of retry logic will make an expired card valid again. The card number itself hasn't changed, but Stripe can't process it. The only person who can fix this is your customer, and they need to know there's a problem.
Most SaaS founders discover this after watching their MRR drain for weeks. They see the card_expired decline code in their Stripe dashboard, assume the retry system will handle it, and wait. The retries happen on schedule. Every single one fails. The subscription eventually cancels. The customer never knew anything was wrong.
What Happens When a Card Expires
Credit and debit cards have expiration dates printed on them for a reason. Banks issue new cards before the old ones expire, usually mailing them 30–60 days in advance. Your customer receives the new card, activates it, and starts using it for in-person purchases. But their Stripe subscription? Still pointing to the old card number with the old expiration date.
When Stripe attempts to charge an expired card, the response is immediate and definitive: expired_card. This isn't a soft decline that might work later. The card is no longer valid in the payment network. Stripe will retry according to your dunning settings, but each retry hits the same wall. The card is expired. It will stay expired. Stripe has no mechanism to update it automatically.
Some founders confuse expired cards with card number changes. Both require customer action, but they're slightly different scenarios. An expired card typically means the customer has a new card with a new expiration date—and often a new security code—but the same card number. A card that's been reported lost or stolen gets replaced with an entirely new number. Either way, Stripe can't fix it. Only your customer can.
The Communication Gap Nobody Talks About
Here's what typically happens when a card expires on a subscription:
Stripe attempts the charge on the renewal date. The charge fails with expired_card. Stripe sends a customer.subscription.updated webhook and marks the subscription status as past_due. Your customer receives no notification at this point—Stripe doesn't send customer-facing emails for expired cards by default. You probably don't either, unless you've built custom webhook handlers.
Stripe retries the payment based on your retry schedule. Could be three days later, could be a week. Same result: expired_card. More webhooks. Still no customer communication. Your customer is using your product, completely unaware their payment method is dead.
After several failed retries—usually three or four depending on your settings—Stripe cancels the subscription. At this point, you've lost 2–3 weeks of revenue and your customer finally discovers something is wrong when they can't log in. They're confused, possibly annoyed, and you're scrambling to recover the relationship.
The tragic part? Your customer wanted to pay you. They didn't intentionally let their card expire. They just didn't connect the new card in their wallet with the subscription billing their old card. Nobody told them there was a problem.
Why Founders Rely on Retries That Can't Work
It's natural to trust Stripe's retry system. For many failure types, it's incredibly effective. A customer with insufficient funds on Monday might have a paycheck clear by Friday. A temporary authorization hold from a hotel stay gets released. These scenarios resolve themselves with time, and retries work exactly as designed.
Expired cards create a false sense of security. The retries happen on schedule. Your Stripe dashboard shows activity. It looks like the system is working on the problem. You're busy building product, closing deals, hiring your next engineer. You assume Stripe has this handled.
But retry logic can't update payment methods. It can only attempt to charge existing payment methods. When the payment method itself is the problem—when it's expired, or replaced, or canceled—retries just burn time. Every retry cycle is another few days of lost revenue and zero customer communication.
The solution isn't better retry logic. It's accepting that expired cards represent a communication problem, not a timing problem. Your customer needs to know their card is expired. They need a way to update it. And they need to know before the subscription cancels.
What Actually Works for Expired Card Recovery
Successful expired card recovery starts with immediate notification. When Stripe returns expired_card, that's your signal to contact the customer right away. Email is the minimum. SMS improves response rates. In-app notifications work if your customers log in regularly.
The message should be clear and actionable: your card on file has expired, here's a link to update it, your service will continue once you update your payment method. No guilt, no pressure, just information and a clear path forward.
Timing matters enormously. Contact your customer within 24 hours of the first expired card decline and you'll recover 60–70% of that revenue. Wait a week and that number drops to 30–40%. Wait until Stripe cancels the subscription and you're looking at 10–15% recovery rates. The longer you wait, the more likely your customer has mentally moved on or found an alternative.
Some customers won't respond to email alone. They're busy, the email gets buried, or they don't check that inbox regularly. Multiple channels and multiple touches significantly improve recovery rates. An email immediately after the decline, another email three days later, an SMS on day five, an in-app prompt—every additional touchpoint recovers customers who would have churned otherwise.
The goal isn't to retry the payment. The goal is to help your customer update their payment method so future charges succeed.
Building a System That Works
Expired card recovery requires infrastructure that Stripe doesn't provide out of the box. You need webhook handlers that listen for specific decline codes. You need email templates that explain the problem clearly. You need logic that determines when to send which message through which channel. You need a way to track which customers have been contacted and when.
Many founders build this themselves. It's not technically complex, but it requires ongoing maintenance and monitoring. Webhook payloads change. Email deliverability requires constant attention. SMS providers have their own integration quirks. What starts as a weekend project becomes a permanent tax on your engineering resources.
The alternative is accepting that some percentage of expired card failures will result in churn. Maybe that's acceptable for your business. But understanding the real cost helps you make that decision consciously rather than discovering it months later when you analyze your churn data.
The Real Cost of Expired Cards
A typical SaaS company loses 15–25% of potential MRR to failed payments. Expired cards represent roughly 30–40% of those failures. For a company doing $50K MRR, that's $2,000–$4,000 in monthly revenue lost to a problem that customer communication could solve.
Compound that over a year and you're looking at $25K–$50K in recovered revenue just from better expired card handling. That's runway. That's a hire. That's the difference between profitable and not profitable for many early-stage companies.
The harder cost to measure is customer relationships. An expired card that leads to involuntary churn doesn't just cost you that customer's subscription revenue. It costs you their potential expansion, their referrals, their testimonials, their feature feedback. You lose the relationship because of a communication breakdown, not because they stopped wanting your product.
The Takeaway
Stripe's retry system is powerful for timing problems. Expired cards aren't timing problems. They're communication problems disguised as payment failures. No retry schedule will ever turn an expired card into a valid card. Only your customer can do that, and only if they know there's a problem. The faster you reach them with clear information and an easy update path, the more revenue you recover and the more customers you keep.
Related
Free diagnostic
See exactly what's happening in your Stripe account
Connect your Stripe account and get a breakdown of every failed payment — which ones can be retried, which ones need customer outreach, and how much is recoverable. Takes 5 minutes. No credit card required until we recover $49.
Run free diagnostic