Stripe Dunning Email Not Sending: How to Fix It (And Prevent It Forever)
Stripe's customer emails are controlled by a toggle in Dashboard > Settings > Emails. If "Failed payment" emails are disabled. or if the customer has no email on file. Stripe silently skips sending anything. Even when enabled, Stripe sends a single generic email that recovers under 15% of failed payments. The real fix is an automated multi-step dunning sequence using dedicated dunning software.
Why Stripe Dunning Emails Don't Send
Stripe doesn't send dunning emails by default. The "Customer emails" feature must be explicitly enabled in your Stripe Dashboard, and even then, only specific email types are toggled on. Many founders assume Stripe handles failed payment communication automatically. It doesn't unless you configure dunning in Stripe.
There are four common reasons your Stripe dunning emails aren't going out: (1) The "Failed payment" email toggle is off in Settings > Emails. (2) The customer object has no email address, so Stripe has nobody to email. (3) The email is being sent but landing in spam because Stripe's transactional emails come from a generic @stripe.com domain. (4) You're in test mode, where Stripe doesn't send real emails.
// Retrieve customer and check for email
const customer = await stripe.customers.retrieve('cus_xxx');
console.log(customer.email); // null = no email, Stripe can't send
console.log(customer.name); // May also be empty
// If email is missing, update it
if (!customer.email) {
await stripe.customers.update('cus_xxx', {
email: 'customer@example.com',
});
}Warning: Stripe will never warn you that dunning emails failed to send because the customer had no email. The invoice simply fails, retries happen silently, and eventually the subscription cancels. All without a single email reaching the customer. Always validate that customer.email exists when creating subscriptions.
Quick Fix (Manual)
If your dunning emails aren't sending right now, follow these steps to diagnose and fix it immediately:
Go to Stripe Dashboard > Settings > Emails > Customer emails. Verify that "Successful payments," "Failed payments," and "Expiring cards" are all toggled on.
Check that you're in Live mode, not Test mode. Stripe doesn't send customer emails in test mode. toggle the "Test mode" switch off in the top-right of the Dashboard.
Open the specific customer who didn't receive an email. Click on their profile and verify the "Email" field is populated with a valid address.
If the email exists but the customer says they never received it, ask them to check their spam/junk folder. Stripe emails come from receipts@stripe.com or notifications@stripe.com.
To manually trigger an invoice email right now, use the API to send the invoice directly to the customer.
// Send (or re-send) the invoice email to the customer
const invoice = await stripe.invoices.sendInvoice('in_xxx');
console.log(invoice.status); // "open". email sent
console.log(invoice.hosted_invoice_url); // Link customer can use to pay
// You can also retrieve all open invoices for a customer
const invoices = await stripe.invoices.list({
customer: 'cus_xxx',
status: 'open',
});
console.log(invoices.data.length); // Number of unpaid invoicesTip: You can verify whether Stripe attempted to send an email by checking the invoice's Events tab in the Dashboard. Look for "Email sent to customer" events. If there are no email events, the toggle is off or the customer email is missing.
Permanent Fix (Automated)
Even when Stripe's dunning emails are properly enabled, they have three fundamental limitations: (1) Stripe sends only one email per failed payment. No follow-ups. (2) The email template is generic and can't be customized with your brand voice or urgency. (3) There's no escalation; the email tone is the same whether it's day 1 or day 21 of a failed payment. Compare this to dunning email benchmarks where multi-step sequences recover 3-4x more.
A single email recovers 10-15% of failed payments. A properly sequenced 5-7 email dunning campaign with escalating urgency recovers 40-55%. Use our dunning ROI calculator to see the dollar impact for your MRR. The difference is the follow-up: most customers don't ignore the first email on purpose. they're busy, they missed it, or it went to spam. Each subsequent touchpoint dramatically increases recovery odds and prevents involuntary churn.
SaveMRR replaces Stripe's single email with a 7-email dunning sequence that fires automatically when a payment fails. Each email is timed for maximum recovery: immediate notification (day 0), friendly reminder (day 3), card update nudge with one-click link (day 5), urgency escalation (day 7), final warning (day 14), grace period notice (day 18), and last chance before cancellation (day 21).
// Without SaveMRR, you'd build a dunning scheduler like this:
const DUNNING_SCHEDULE = [
{ day: 0, template: 'payment_failed_notice', tone: 'informational' },
{ day: 3, template: 'friendly_reminder', tone: 'helpful' },
{ day: 5, template: 'card_update_nudge', tone: 'action_needed' },
{ day: 7, template: 'urgency_escalation', tone: 'urgent' },
{ day: 14, template: 'final_warning', tone: 'serious' },
{ day: 18, template: 'grace_period', tone: 'last_chance' },
{ day: 21, template: 'cancellation_notice', tone: 'final' },
];
// For each failed invoice, schedule the entire sequence
async function scheduleDunningSequence(invoice) {
const customer = await stripe.customers.retrieve(invoice.customer);
if (!customer.email) {
console.error('No email on file. cannot send dunning emails');
return;
}
for (const step of DUNNING_SCHEDULE) {
await queue.add('send-dunning-email', {
customerId: invoice.customer,
invoiceId: invoice.id,
template: step.template,
tone: step.tone,
}, {
delay: step.day * 24 * 60 * 60 * 1000, // days to ms
});
}
}
// SaveMRR handles all of this automatically.
// No queue infrastructure. No email templates. No scheduling logic.Tip: SaveMRR's dunning emails include a one-click card update link in every message, so customers can fix their payment method without logging into your app. The first $200 recovered free. You don't pay until SaveMRR proves it works.
Related Stripe Billing Issues
Frequently Asked Questions
Does Stripe send dunning emails by default?
No. Stripe's customer emails must be manually enabled in Dashboard > Settings > Emails. Even when enabled, Stripe only sends a single email per failed payment. there's no follow-up sequence. Many founders discover months later that no emails were ever sent because the toggle was off.
Can I customize Stripe's dunning email template?
Very limited. Stripe lets you add your logo and accent color to customer emails, but you can't change the subject line, body copy, or call-to-action. You can't add urgency, personalization, or a direct card update link. For full customization, you need to build your own email system or use a tool like SaveMRR that sends branded, multi-step dunning sequences.
Why are Stripe emails going to spam?
Stripe sends emails from its own domain (receipts@stripe.com or notifications@stripe.com), not yours. Some email providers flag these as transactional spam, especially if the customer hasn't interacted with Stripe emails before. You have no control over Stripe's email deliverability, sender reputation, or SPF/DKIM records. Sending from your own domain (which SaveMRR supports) significantly improves inbox placement.
What happens if the customer has no email in Stripe?
Stripe silently skips sending the email. There's no error, no warning, and no fallback. The invoice fails, retries happen in the background, and if all retries fail, the subscription cancels. All without the customer ever being notified. Always validate that customer.email is populated when creating or updating customers.
Is one dunning email enough to recover a failed payment?
No. A single email recovers only 10-15% of failed payments. Most customers miss the first email (it goes to spam, they're busy, they don't check that inbox). A 5-7 email sequence with escalating urgency recovers 40-55%. roughly 3-4x more. The follow-up emails are where the real recovery happens, which is why Stripe's single-email approach leaves so much revenue on the table.
SaveMRR catches these automatically
Stop firefighting Stripe billing issues manually. Paste your API key, get a free Revenue Scan in 60 seconds, and let SaveMRR handle recovery automatically.
Run my free scan