Stripe dunning playbook

Recover failed Stripe payments before they become churn.

Most SaaS founders treat failed payments as inevitable churn. Roughly 60-70% of failed Stripe charges are recoverable with the right dunning sequence. Smart Retries plus three plain-text emails carrying a fresh hosted invoice link.

Quick answer

To recover failed Stripe payments: (1) subscribe to the invoice.payment_failed webhook, (2) let Stripe Smart Retries run, (3) send a dunning email at T+0 with a fresh hosted invoice link, (4) follow up at T+48h and T+120h, (5) cancel cleanly if recovery fails. Realistic combined recovery rate: 60-70%.

The 5-step Stripe dunning playbook

  1. 1

    Detect the failed payment via webhook

    Subscribe to Stripe's invoice.payment_failed event. The moment a charge fails, your dunning clock starts. Don't wait for Stripe's default emails. They're generic and arrive late.

  2. 2

    Let Stripe Smart Retries run, but don't rely on them alone

    Stripe Smart Retries handle the network-level retry attempts. They recover roughly 40% of failed charges on their own. Your job is to recover the rest with email follow-up that gives the customer a clear next action.

  3. 3

    Send the first dunning email at T+0

    Plain-text email from your real address. Explain what happened in one sentence, include a fresh hosted invoice link, and offer help. Skip the marketing copy. This is a transaction problem, not a sales moment.

  4. 4

    Send follow-up emails at T+48h and T+120h

    Each follow-up needs a fresh hosted invoice link (Stripe rotates them) and a slightly different tone. First reminder, then urgency, then last call. Don't send more than three. The fourth email reads as harassment and damages the relationship.

  5. 5

    Cancel cleanly if recovery fails

    After the dunning window closes, cancel the subscription, send a 'we couldn't process payment' note, and add the customer to a re-activation list. Some come back 2-3 months later when their card situation changes. Don't ghost them.

Why Stripe payments fail

Failure reason drives recovery strategy. Treating every failure the same is why default dunning flows underperform.

Failure reason% of failuresRecoverable?
Insufficient funds~25%High. Smart Retries usually win
Expired card~20%High. Needs an email + update link
Card replaced (lost / stolen)~15%Medium. Depends on engagement
Issuer block / fraud rule~15%Medium. Smart Retries help
3DS challenge required~10%Medium. Needs customer action
Card declined (generic)~10%Low. Usually wrong card on file
Account closed~5%Near zero

Distribution varies by ICP and geography. Numbers are typical indie-SaaS ranges, not Stripe-official figures.

Stripe Smart Retries vs email recovery

Stripe Smart Retries are the silent first line of defense. They re-attempt the charge at ML-tuned intervals across the next ~3 weeks, recovering charges where the issue resolves itself (insufficient funds, temporary fraud blocks, network errors). Roughly 40% of failed charges recover this way with no customer action required.

Email recovery handles the cases Smart Retries can't: expired cards, replaced cards, accounts where the customer needs to log in and update their payment method. The dunning email gives them a fresh hosted invoice link they can click, pay, and be done in under a minute. Without the email, those customers churn involuntarily. Not because they wanted to leave, but because nobody told them their card stopped working.

What a working Stripe dunning email looks like

From: alex@acmeapp.com

Subject: Quick heads up. Your card didn't go through

Hey Sarah, Your Acme subscription tried to renew yesterday but the card on file got declined. Could be an expired card or a temporary hold from your bank. Happens all the time. Here's a fresh link to fix it: https://invoice.stripe.com/i/acct_xxx/in_xxx Takes about 30 seconds. If you're stuck, just reply and I'll sort it out manually. Alex

Plain text. From a real address. One clear action. No marketing copy.

FAQ

What is Stripe failed payment recovery?
Stripe failed payment recovery (also called dunning) is the process of recovering revenue when a subscription charge fails. Usually because the customer's card expired, was declined, or hit a temporary issuer block. Recovery has two layers: Stripe's Smart Retries handle network-level retry attempts, and email-based dunning prompts the customer to update their payment method via a fresh hosted invoice link.
What's the difference between Stripe Smart Retries and dunning emails?
Smart Retries silently re-attempt the charge using Stripe's ML-tuned timing. They recover about 40% of failures without the customer doing anything. Dunning emails handle the rest: cases where the card is genuinely broken (expired, replaced, frozen) and the customer needs to update it manually. You need both, since they recover different failure modes.
Which Stripe webhook signals a failed payment?
invoice.payment_failed fires when a subscription invoice charge fails. The webhook payload includes the invoice ID, customer ID, attempt count, and next_payment_attempt timestamp. Subscribe to it, persist the event, and trigger your dunning sequence from your own side rather than relying on Stripe's default emails.
How many dunning emails should I send?
Three. T+0 (immediately after failure), T+48 hours, and T+120 hours. More than three reads as harassment and hurts the relationship with customers who do come back. Each email needs a fresh hosted invoice link. Stripe rotates them, so a 5-day-old link will be expired.
What's a realistic recovery rate for failed Stripe payments?
60-70% combined recovery is typical for a well-run dunning flow (Smart Retries + 3 emails). About 40% of failures recover silently via Smart Retries; another 20-30% recover via email follow-up. The remaining 30% are involuntary churn that won't recover. Wrong cards, abandoned accounts, fraud blocks.
Should dunning emails be plain-text or HTML?
Plain-text. They get higher deliverability (less likely to be filtered as marketing), they look like real emails from a person, and they don't trigger the customer's spam reflex. A heavily designed 'YOUR PAYMENT FAILED' template looks like spam. A two-line plain-text email from your real address with a link looks like a real founder.
What about customers who voluntarily cancel after a failed payment?
Different flow. Failed-payment cancellations are involuntary. The customer didn't choose to leave. Voluntary cancellations need an exit email asking why, not a payment-update reminder. ChurnNote handles both: dunning for involuntary churn, exit email + win-back for voluntary churn.
How does ChurnNote handle Stripe failed payment recovery?
ChurnNote connects to your Stripe account via API key, subscribes to invoice.payment_failed, and sends a 3-email recovery sequence with fresh hosted invoice links from your domain. It stops automatically when the invoice is paid. $12/mo flat. No percentage of recovered revenue, no MRR-based scaling.

Stop losing revenue to expired cards.

ChurnNote runs the full Stripe dunning loop. Webhook, three-email recovery sequence with fresh hosted invoice links, clean cancellation if recovery fails. $12/mo flat. No percentage of recovered revenue.

Get started