Stripe Dunning

Stripe Dunning Emails: Templates & Setup Guide (2026)

Stripe's built-in dunning emails recover less than 15% of failed payments. This guide covers what's wrong with them, how to write better ones, and how to set up a proper D+1/D+3/D+7 sequence.

By He Ze · RecoverKit · March 2026 · 8 min read

Skip the setup — automate dunning in 3 minutes

Connect Stripe and RecoverKit handles the entire D+1/D+3/D+7 sequence automatically.

Connect Stripe Free →

What is Stripe dunning?

Dunning is the process of communicating with customers after a payment failure to recover the failed charge. In the context of Stripe subscriptions, dunning typically involves:

Stripe has built-in dunning functionality, but it's limited. Understanding its limitations is the first step to building something better.

What Stripe's default dunning does (and doesn't do)

Stripe has two built-in systems for handling failed payments:

Smart Retries

Stripe automatically retries failed charges over the next 4–8 days using ML to pick the optimal retry times. This is enabled by default and works in the background without any setup. However, it only addresses the technical retry — it doesn't communicate with your customer at all.

Stripe's built-in dunning emails

You can enable these in Stripe Dashboard → Settings → Billing → Automatic collection. Stripe will send emails to customers when:

The problem with Stripe's default emails

Stripe's dunning emails are generic, unbranded, and often land in spam. They don't include your product name prominently, they use Stripe's domain (not yours), and they offer no way to customise the tone or sequence timing. Most SaaS businesses see open rates below 15% on them.

Why you need custom dunning emails

A well-configured custom dunning sequence outperforms Stripe's defaults by 2–3x because:

Stripe dunning email templates (D+1, D+3, D+7)

Day 1 — Within 2 hours of failure

Send this as soon as possible. Speed is the biggest factor in recovery rates — getting this out within 2 hours vs. 24 hours can mean a 15–20% difference in recovery.

Subject: Quick note about your [Product] payment
Hi [First Name], Your payment of [amount] for [Product] on [date] didn't go through. This usually happens when a card expires or a bank flags the charge — easy to fix in about 60 seconds: → Update your payment method: [STRIPE_BILLING_PORTAL_URL] Once updated, your subscription continues without interruption. If you need help, just reply to this email. [Your Name / Team]

Day 3 — Gentle reminder

Subject: Still having trouble with your [Product] payment
Hi [First Name], Just following up — your payment of [amount] for [Product] still hasn't gone through. We'd hate for you to lose access to [key feature]. Here's how to fix it: → Update your card: [STRIPE_BILLING_PORTAL_URL] If you have any questions or want to discuss your subscription, just reply here. [Your Name / Team]

Day 7 — Final notice

This email has the highest conversion rate because the consequence is real and specific. Make the date concrete — don't say "soon."

Subject: Your [Product] account will be paused on [specific date]
Hi [First Name], This is a final notice regarding your [Product] payment of [amount], which is now 7 days past due. Your account will be paused on [specific date — tomorrow or day after]. To keep your access: [STRIPE_BILLING_PORTAL_URL] If you're experiencing a billing issue or want to discuss your subscription, reply to this email before [date] and we'll work something out. [Your Name / Team]

The Stripe Billing Portal URL

For each email, you need to generate a stripe.billingPortal.sessions.create() session URL for that specific customer. This gives them a one-click link directly to their payment method management page — no login required. This single feature dramatically increases conversion vs. sending customers to a generic login page.

How to set up Stripe dunning yourself

Here's the complete technical setup if you want to build this yourself:

Step 1: Subscribe to webhook events

In Stripe Dashboard → Developers → Webhooks, create an endpoint that listens to:

Step 2: Store recovery state

When invoice.payment_failed fires, record in your database:

Step 3: Run a cron job

Set up an hourly cron job that checks your database for customers who are at the D+1, D+3, or D+7 mark. For each:

Step 4: Handle the stop condition

When invoice.payment_succeeded fires for a customer who is in a recovery sequence, immediately update their status to recovered. Do not send any more dunning emails. This is critical — sending a "final warning" after payment succeeds destroys trust.

Expected build time: 1–2 days for an experienced developer. Ongoing maintenance includes monitoring email deliverability, handling edge cases, and updating copy.

Dunning email best practices

What to expect: Stripe dunning recovery rates

The biggest variable in your favour: speed. Getting the D+1 email out within 2 hours of the invoice.payment_failed event — not 24 hours later — is the single highest-ROI improvement you can make.

Stripe dunning vs. involuntary churn recovery: same thing?

Yes — dunning is the industry term for the process of recovering failed payments. When SaaS founders talk about reducing involuntary churn, they're usually talking about improving their dunning process. The terms are often used interchangeably:

Automate your Stripe dunning sequence

RecoverKit connects to Stripe via OAuth and runs the entire D+1/D+3/D+7 dunning sequence automatically. No code. Free during beta.

Connect Stripe Free →

No credit card required · Disconnect anytime · Read-only Stripe access