Stripe decline codes,
explained in plain English
When a Stripe payment fails, you get a cryptic code like card_declined or insufficient_funds. This is a reference for founders: what each code means, why it fired, and the fastest path to recovering the payment.
Quick context: Stripe decline codes come from the customer's issuing bank, not Stripe itself. That's why the fix usually involves the cardholder — not your code. The playbook below tells you exactly when to retry, when to ask the customer, and when to move on.
Most common decline codes
card_declined
Generic decline
The issuer refused the charge without telling Stripe why. ~40% of failures.
insufficient_funds
Not enough money on the card
Retry in 3–5 days or ask the customer to update card.
expired_card
Card expired
Customer must provide a new card. Pre-dunning prevents this.
incorrect_cvc
Wrong security code
Customer typo or stale CVC. Re-collect the card.
processing_error
Temporary issuer glitch
Retry once, usually clears itself.
generic_decline
Issuer refused, no reason
Ask customer to contact their bank, then retry.
authentication_required
3D Secure challenge needed
Customer must approve in their banking app.
try_again_later
Temporary issuer block
Wait 24h and retry. Often self-resolves.
lost_card
Card reported lost
Customer needs to provide a new card. Do not retry.
stolen_card
Card reported stolen
Customer needs to provide a new card. Do not retry.
The universal recovery playbook
No matter what code fires, these four moves recover 60–70% of failed payments:
- Email the customer within 1 hour — fresh failures recover at 2–3x the rate of day-old ones.
- Include a one-click Billing Portal link — the Stripe-hosted page where they can update their card in 20 seconds.
- Send 3–4 follow-ups over 7 days — not spam, just persistent. Different tone each time (friendly → urgent → final).
- Include SMS in the sequence — SMS open rates are 98% vs ~20% for email. Adds 15–25% to recovery.
You can build this yourself with Stripe webhooks + SendGrid + a cron job. Or you can skip the 3 weeks of engineering and start recovering payments in 60 seconds with RecoverKit — which does all of this automatically.
Recover failed payments on autopilot
Connect Stripe in 60 seconds. AI writes each email. $19/mo. 7-day free trial, no card required.
Start Free Trial →