Stripe expired_card — recover + prevent
The most preventable decline code. A small amount of proactive work eliminates it from your dunning funnel entirely.
TL;DR
Retrying is useless — the card is dead until replaced. Email the customer immediately with a Stripe Billing Portal link. And better yet: scan Stripe 30–60 days before cards expire and email customers pre-emptively. This is what "pre-dunning" means.
What expired_card means
expired_card is exactly what it sounds like: the card's printed expiration date has passed. The issuing bank rejects any authorization against an expired card, no matter the merchant or amount.
This is the only decline code where the fix is unambiguous: the customer must provide a new card number or have their bank reissue one. No amount of retrying will help.
Why Stripe's automated updater doesn't fix this
Stripe has a feature called Card Account Updater (CAU) that pulls replacement card details from Visa/Mastercard's updater networks automatically. When it works, your customer's renewed card is swapped in silently without them doing anything.
CAU catches about 60% of card renewals. The remaining 40% slip through because:
- The issuing bank doesn't participate in the updater network (common for credit unions, regional banks, international cards)
- The customer got a different new card (different number entirely), not a renewal of the same one
- The CAU pull fires after the expiration date and the charge has already failed
- The customer closed the account
For that 40%, you'll see expired_card and have to recover it manually.
Recovery playbook (when it's already failed)
- Email within 1 hour — subject: "Your [product] card is expired" with a Billing Portal link
- Do NOT retry — Stripe Smart Retries will waste attempts. Disable auto-retry for
expired_cardspecifically. - Second email at +24h — remind about service interruption if not resolved
- SMS at +48h — short and direct: "Your card on file expired. Update here: [link]"
- Final email at +7d — then pause or cancel subscription
Better: prevent it before it fires (pre-dunning)
How to do it manually:
- Every week, query all Stripe customers with cards expiring in the next 30 days
- For each one, send a friendly email with a Billing Portal link: "Your card ending 4242 expires next month. Update now — 20 seconds."
- Track who updated vs who didn't, and follow up with the holdouts 7 days before expiration
This is ~2 days of engineering work to build, or 60 seconds to turn on in RecoverKit (we scan every 6 hours and handle the emails automatically).
What to tell the customer
Hi [name], the card we have on file for [product] expired on [date]. It takes about 20 seconds to update — just click below and enter your new card details.
[Update payment method →]
If you don't update by [date + 7], we'll pause your subscription so you don't get charged incorrectly.
Related decline codes
Kill expired_card failures permanently
RecoverKit's pre-dunning scan catches expiring cards before they fail. Set once, forget forever. $19/mo.
Start Free Trial →