What makes a failed payment email effective
Before the templates: the anatomy of a failed payment email that works.
- Sent within 2 hours — Not 24 hours, not next-day. The sooner you reach the customer, the higher your recovery rate. Speed is the #1 lever.
- Specific about the amount — "$49.00 payment" not "your payment". Vague failed payment emails look like phishing. Always include the dollar amount.
- One clear action — Update card. That's it. No upsells, no feature announcements, no surveys.
- Direct billing portal link — Don't link to your homepage or a generic login page. Generate a Stripe Billing Portal session URL for that specific customer — one-click access to their payment method, no login required.
- Empathetic tone — The customer's bank declined the charge, not the customer themselves. "Payment didn't go through" not "your payment was declined".
The Stripe Billing Portal link
Use stripe.billingPortal.sessions.create({ customer: customerId, return_url: '...' }) to generate a session URL for each customer. This creates a time-limited, customer-specific link that opens their payment management page directly — no login required. This single change dramatically improves conversion vs. a generic card update page.
Template 1 — Day 1 (send within 2 hours of failure)
The most important email in your sequence. Speed beats perfection here — send this as soon as possible after the invoice.payment_failed webhook fires.
Why this works
Short. Specific amount. No blame. One action. The billing portal URL is the most important element — make it stand out visually.
Template 2 — Day 3 (gentle reminder)
For customers who didn't act on Day 1. Slightly more context on what they might lose, but still helpful in tone.
Variation: mention the specific feature they'd lose
If you know which features the customer actively uses, personalise the "we'd hate for you to lose access to" line. "We'd hate for you to lose your 47 saved reports" outperforms the generic version.
Template 3 — Day 7 (final notice)
The highest-converting email in the sequence because the consequence is real and specific. Many customers who ignored Day 1 and Day 3 act on Day 7. Make the date concrete — don't say "soon".
Why Day 7 converts so well
The specific cancellation date creates genuine urgency without being manipulative — it's just accurate. Customers who want to stay have a clear deadline and a clear action.
Template 4 — Expired card (specific variant)
If you know the failure reason is expired_card (available in the Stripe charge decline code), use this more targeted version. Higher conversion because it explains exactly what happened.
Template 5 — Recovery confirmation (send when payment succeeds)
Often overlooked. When a customer updates their card and the payment succeeds, send this confirmation email. It closes the loop, reinforces that the problem is solved, and reduces support tickets from confused customers.
Critical: stop the sequence when payment succeeds
If you're running a Day 1/Day 3/Day 7 sequence, stop immediately when invoice.payment_succeeded fires. Never send a "final warning" after a customer has already paid. This destroys trust and generates angry support tickets.
Sending these emails: what you need
To send these emails, you need:
- A Stripe webhook endpoint listening to
invoice.payment_failedandinvoice.payment_succeeded - A way to schedule D+3 and D+7 follow-ups (cron job or task queue)
- A transactional email provider (Resend, Postmark, SendGrid) sending from your domain
- Code to generate Stripe Billing Portal session URLs per customer
Build time: 1–2 days for an experienced developer. Alternatively, RecoverKit automates the entire sequence — connect your Stripe account and it handles everything described above without any code.
Subject line performance data
Based on aggregate data from SaaS dunning sequences:
- "Quick note about your [Product] payment" — ~45% open rate. "Quick note" signals low-stakes, reduces anxiety.
- "Your payment didn't go through" — ~38% open rate. Clear but slightly lower than product-named version.
- "Action required: [Product] subscription" — ~30% open rate. "Action required" triggers spam filters and anxiety.
- "Payment failed" — ~22% open rate. Blunt, negative framing, often lands in spam.
- "Your [Product] account will be paused on [date]" — ~41% open rate. Specific dates outperform vague urgency.
For more complete guidance on the full dunning sequence strategy, see our dunning management guide and Stripe dunning email setup guide.