Stripe card_declined — full recovery guide
The most common Stripe decline code. Here's what it actually means, why it fires, and the exact sequence to recover the payment.
TL;DR
The customer's bank refused the charge but didn't say why. Email the customer with a Stripe Billing Portal link, wait 24h, retry once, then retry again in 3 days if still failing. ~60% recover within 7 days with good follow-up.
What does card_declined mean?
card_declined is a generic refusal from the customer's issuing bank. Stripe passes this through unchanged — Stripe itself didn't decline the charge; the bank did. In most cases the bank refuses to share the specific reason (for privacy and fraud-prevention reasons).
This is by far the most common Stripe decline code, accounting for roughly 40% of all failed payments across SaaS businesses.
Why it happens
A bank can decline with card_declined for any of:
- Fraud suspicion — the bank's automated fraud system flagged the charge (unusual amount, new merchant, velocity patterns).
- Daily limit hit — the card has a per-day transaction cap that this charge would exceed.
- Temporary hold — the customer disputed a prior charge and the bank froze further activity.
- Pre-authorization not yet released — a hotel or car rental is still holding funds.
- Account flagged for review — the bank is manually reviewing activity.
You can't tell which from Stripe's API. That's why the fix has to come from the customer.
Recovery playbook
The sequence that maximizes recovery for card_declined:
| When | Action | Channel |
|---|---|---|
| +1 hour after failure | Notify customer of failure, include Billing Portal link, ask them to check with their bank | |
| +24 hours | Retry the charge (many fraud holds clear in 24h) | Stripe auto-retry |
| +48 hours | Second email — slightly firmer tone, remind about service interruption risk | |
| +3 days | Retry the charge again | Stripe auto-retry |
| +5 days | SMS the customer — 98% open rate vs 20% for email | SMS |
| +7 days | Final email, then cancel subscription if still failing |
The key insight: the bank's automated block usually clears itself inside 24–72 hours. Your job is to keep the customer engaged so they don't churn while it clears.
What to tell the customer
Stripe does not give you the specific reason, so don't guess in the email. The script that converts best:
Hi [name], your recent payment of $[amount] was declined by your bank. This is usually a temporary fraud-protection block. You can either contact your bank to approve the charge, or update your card using the secure link below — takes about 20 seconds.
Then one button: Update payment method → Stripe Billing Portal URL.
Should you retry automatically?
Yes, but sparingly. Stripe's Smart Retries does this by default if you enable it. Otherwise:
- Retry 1: ~24 hours after first failure
- Retry 2: ~3 days after first failure
- Retry 3: ~7 days after first failure, only if first two both said card_declined
More than 3 retries almost never works — if the bank is still declining after 7 days, the customer has to act.
Related decline codes
Want this playbook to run itself?
RecoverKit handles the emails, SMS, retries, and follow-ups automatically. $19/mo. 7-day free trial.
Start Free Trial →