Writing
Guides to failed payments on Stripe
Everything here is checked against Stripe's own documentation before it goes up, and dated so you can tell how stale it is. There are no invented case studies and no recovery rate percentages we cannot stand behind, which means some of these articles end by telling you that Stripe's free features are enough.
The nine Stripe decline codes that stop retries dead
Stripe will not retry nine specific decline codes until a new card is added. The exact list, what each one means, and what to do instead of retrying.
How Stripe Smart Retries actually work
Stripe Smart Retries defaults to 8 attempts over 2 weeks, timed by a model. What you can configure, what you cannot, and when to turn it off.
Why retrying an expired card rarely works
expired_card is not on Stripe's hard decline list, so Stripe retries it. An expired card does not become unexpired. Here is what actually recovers these payments.
Stripe's dunning emails: what you control and what you do not
Stripe emails your customers about failed payments for free. You control branding and whether they send, but not the copy, the schedule or the sender.
How to measure involuntary churn without guessing
Involuntary churn is revenue lost to a failed payment, not a decision. How to calculate it from your own Stripe data, and why benchmarks are not worth much.
Is insufficient_funds a hard decline?
No. insufficient_funds is not on Stripe's list of codes that block retries, and retrying it is correct. A lot of published guidance gets this backwards.
past_due, unpaid, canceled: what each Stripe subscription status means
past_due means Stripe is still trying. unpaid means it stopped but kept the subscription. canceled is terminal. Which one you get is a setting you choose.
Which Stripe webhooks tell you a payment failed
invoice.payment_failed is the event that matters, plus payment_action_required for authentication. Which fields to read, and the one-hour delay to know about.
Stripe test cards for every failed payment scenario
The exact test card numbers for generic decline, insufficient funds, lost card, stolen card, expired card and 3D Secure, and which decline_code each one produces.
Stripe updates expired cards for you, sometimes
Stripe works with the card networks to refresh saved cards automatically. No setup needed, no guarantee, and no way to tell in advance which cards it covers.
What do_not_honor actually means
do_not_honor means the issuer declined without saying why. Stripe will retry it, the bank will not explain it, and the only real fix runs through the customer.
Recovering authentication_required declines
authentication_required means the payment needs the cardholder to authenticate. Retries cannot fix it. The webhook and the hosted invoice page can.
The Visa excessive reattempts rule: 15 tries per card, per 30 days
Visa bulletin AI10325 caps reattempts of one payment at 15 per 30 calendar days, from 17 April 2021. What Stripe does at the limit, and where the budget is zero.
Stripe is not retrying your failed invoice. Here are the nine reasons why.
A checklist for the moment a subscription invoice fails and no retry is scheduled. Nine documented causes, and the exact API field that proves each one.
The free Stripe settings to switch on before you pay anyone
Every free retry and customer email setting in Stripe Billing, with the exact Dashboard path for each, and an honest note on when that is all you need.
invoice.payment_failed vs payment_intent.payment_failed
Both events report a failed payment, from different layers of Stripe. For subscription dunning, one of them carries the retry state you need. Here is how to choose.
call_issuer on Stripe: what it means when the bank says call us
Stripe documents call_issuer as a decline for an unknown reason where the customer needs to contact their card issuer. How it differs from do_not_honor: barely.
card_velocity_exceeded on Stripe: the customer hit a limit
card_velocity_exceeded means the card hit its balance, credit limit or transaction limit. The issuer will not say which. It is a soft decline and Stripe retries it.
currency_not_supported on Stripe: the card cannot pay in that currency
Stripe documents currency_not_supported as the card not supporting the specified currency, with the customer needing to check with their issuer. What to do next.
duplicate_transaction on Stripe: check your records before you do anything
Stripe documents this decline as an identical transaction submitted very recently. The next step is aimed at you, not the customer: check for a recent payment.
The fraudulent decline code on Stripe: who suspects what, and what to say
Stripe documents fraudulent as a payment declined because Stripe suspects it is fraudulent, and instructs you to present it to the customer as a generic decline.
What does generic_decline mean on Stripe?
Stripe's docs say it plainly: declined for an unknown reason, or blocked by Radar. Here is how to tell which one you got, and what to do about each.
incorrect_cvc on Stripe: what it means and what actually fixes it
The CVC the customer entered is wrong, and Stripe's documented fix is the customer trying again with the right one. Retries alone cannot type a security code.
incorrect_number vs invalid_number on Stripe
Stripe documents both codes as the card number being incorrect. Only one is on the list that stops retries, and either way no retry can type a card number.
lost_card and stolen_card on Stripe: what to do, and what never to say
Both codes sit on Stripe's hard decline list, and both carry the same documented instruction: do not tell the customer the specific reason. Here is the playbook.
pickup_card vs restricted_card on Stripe: same words, opposite retry treatment
Stripe documents both codes with the same description, yet one is on the hard decline list and the other gets retried. The difference decides your next move.
processing_error on Stripe: the decline you should simply retry
Stripe's documented next step for processing_error is unusually direct: attempt the payment again, and if it still fails, try again later. Here is why.
transaction_not_allowed on Stripe: the unknown-reason decline that stops retries
Stripe documents transaction_not_allowed as a decline for an unknown reason, yet it sits on the hard decline list. That combination changes how you handle it.
try_again_later on Stripe: one deprecated code, one live one
Stripe's reference now marks the try_again_later decline code as deprecated, but an advice code with the same name is alive and means something different.
How to recover failed Stripe payments
The overview: what fails, what can be retried, what needs an email, and where the free options run out.
Free tools
6 calculators and lookups that need no signup and no email address.
Stripe decline codes explained
Every Stripe card decline code, what it means, what to do, and which nine Stripe will not retry.
Dunning email generator
Generate a failed payment email by decline reason and sequence position.
Failed payment recovery estimator
Free calculator: how much failed subscription revenue you lose monthly, how much is recoverable, and what each recovery tool would cost you at that volume.
Payment retry schedule builder
Build a retry schedule for failed Stripe payments by decline reason.
How many of your Stripe retries were never going to work?
Free browser calculator. Enter your decline codes and see how much failed revenue sits on cards no retry can ever collect.
How close is each card to Visa's 15 attempt ceiling?
Paste one attempt per line as a card fingerprint and a date. See each card's peak in any rolling 30 day window against Visa's cap of 15.
Recover