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:

For that 40%, you'll see expired_card and have to recover it manually.

Recovery playbook (when it's already failed)

  1. Email within 1 hour — subject: "Your [product] card is expired" with a Billing Portal link
  2. Do NOT retry — Stripe Smart Retries will waste attempts. Disable auto-retry for expired_card specifically.
  3. Second email at +24h — remind about service interruption if not resolved
  4. SMS at +48h — short and direct: "Your card on file expired. Update here: [link]"
  5. Final email at +7d — then pause or cancel subscription

Better: prevent it before it fires (pre-dunning)

Pre-dunning changes the math. If you email customers 30–60 days before their card expires, 50–70% update the card before the failure ever happens. The payment never fails, the customer never gets a scary "payment failed" email, and your recovery rate goes up because you're not starting from a failed state.

How to do it manually:

  1. Every week, query all Stripe customers with cards expiring in the next 30 days
  2. For each one, send a friendly email with a Billing Portal link: "Your card ending 4242 expires next month. Update now — 20 seconds."
  3. 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 →