What counts as a failed payment
In Stripe terms, a failed payment fires the invoice.payment_failed webhook with a decline-code reason. Common codes include expired_card, insufficient_funds, card_declined, and do_not_honor. Soft declines (temporary issuer holds, network blips) usually clear themselves on a retry. Hard declines — an expired card, a replaced card, a fraud-blocked card — won't clear until something changes on the customer's side.
What Stripe Smart Retries does automatically
Stripe's built-in retry engine re-attempts the same card on file across roughly three weeks per its smart-retry schedule, then marks the invoice uncollectible and cancels the subscription if the retry-schedule setting is configured that way. Stripe will salvage soft declines without you lifting a finger. It won't reach the customer, though — that part is yours, or your tooling's. Stripe's own docs detail the schedule.
Where the recovery gap is
When the failure is a hard decline — expired card, replaced card, fraud-blocked card — Stripe's retry can't fix it. Only a new payment method on file can. That's the recovery-outreach layer: branded email or SMS with a one-tap card-update link, sent on a cadence, escalating in tone if the customer doesn't act. Recurly research puts proper-dunning recovery rates at 60–80% of failed payments2. Retry tuning gets less mileage than this does.
Why involuntary churn is worth fixing
Involuntary churn — customers who didn't mean to leave — accounts for 20–40% of SaaS churn1 across industries. It's the cheapest churn to fix because the customer already chose you; they just need a working card on file. And retaining a customer is 5–25× cheaper3 than acquiring a new one. Every dollar you spend on CAC stretches further when you don't lose the customer six weeks later to an expired card.