You can automatically recover failed Stripe payments by listening to Stripe's charge.failed or invoice.payment_failed webhook, then triggering a 3-email dunning sequence via Gmail — sent immediately, at Day 3, and Day 7. Built with n8n or Make.com, this recovers 20–40% of failed payments with zero manual effort.
Every subscription or recurring-payment business loses revenue to failed payments. Expired cards, insufficient funds, and bank declines happen constantly — and without an automated recovery system, most of that revenue is simply gone. Businesses that implement automated dunning sequences recover 20–40% of failed payments that would otherwise be lost.
This guide shows you how to build that system using free tools: Stripe webhooks, n8n or Make.com, Gmail, and Google Sheets. No developers, no paid dunning software, no SaaS subscription required.
Why do Stripe payments fail — and which failures can you recover?
Not all failed payments are equal. Understanding the failure reason tells you how recoverable it is:
| Failure Reason | Stripe Code | Recovery Rate | Action |
|---|---|---|---|
| Card expired | expired_card | 40–60% | Ask customer to update card |
| Insufficient funds | insufficient_funds | 15–25% | Gentle reminder, retry later |
| Card declined (soft) | card_declined | 20–35% | Ask customer to contact bank |
| Card declined (hard) | do_not_honor | 5–10% | Ask for new payment method |
| Lost/stolen card | lost_card / stolen_card | ~0% | Don't email — high fraud risk |
| Wrong CVC/zip | incorrect_cvc | 50–70% | Ask customer to re-enter card details |
The key insight: filter out lost_card and stolen_card failures before sending any recovery emails. Your workflow should check the decline code and skip emailing for these — Stripe itself flags them and will cancel the payment method.
What is a dunning sequence and how does it work?
A dunning sequence is a series of timed emails sent to a customer after a payment fails, designed to get them to update their payment details before their access is paused or their order is cancelled.
The optimal 3-email sequence for most businesses:
Important: Stop the sequence immediately if the customer pays. The workflow should listen for a invoice.payment_succeeded or charge.succeeded event and mark that customer as "recovered" in Google Sheets — preventing any further dunning emails.
How do you set up the Stripe payment recovery workflow — step by step?
Get your webhook URL from n8n or Make.com
In n8n: create a new workflow, add a Webhook node, set Method to POST, copy the Production URL. In Make.com: create a scenario, add a Webhooks module, copy the webhook address. You'll paste this URL into Stripe in the next step.
Register the webhook in Stripe
In your Stripe Dashboard: Developers → Webhooks → Add endpoint. Paste your webhook URL. Under "Events to listen to", select charge.failed and invoice.payment_failed. Also add invoice.payment_succeeded for recovery detection. Save. Note the Webhook Signing Secret — you'll need it to verify payloads in n8n.
Import the workflow template
Download the Peak Automations Payment Recovery template, extract the ZIP, and import the JSON into n8n (Workflows → Import) or Make.com (Scenarios → Import Blueprint). The workflow includes: webhook receiver → decline code filter → Google Sheets logger → Email 1 (immediate) → 3-day wait → Email 2 → 4-day wait → Email 3 → recovery check.
Connect Gmail and Google Sheets
Click the Gmail nodes and authenticate with your Google account via OAuth. Click the Google Sheets node, authenticate, and select (or create) a spreadsheet to serve as your failed payment dashboard. The workflow will log: customer email, amount, failure reason, date, current email step, and recovery status.
Edit the email templates
Open each of the three Gmail nodes and customise: replace [BUSINESS NAME], update the support email, and adjust the payment portal link. Use Stripe's Customer Portal URL for the card update link — enable it in Stripe under Settings → Billing → Customer Portal. Each email has placeholder copy you can use as-is or personalise.
Test with Stripe's test webhook tool
In Stripe Dashboard → Developers → Webhooks, select your endpoint and click "Send test webhook". Choose charge.failed as the event type. Confirm the workflow executes, the Google Sheet logs the entry, and Email 1 is sent to your test address. Check the execution log for any errors before going live.
What should the payment recovery emails actually say?
Email 1 — Immediate notification
Subject: Action needed: your recent payment didn't go through
Hi [Name],
We tried to process your payment of [amount] today, but unfortunately it wasn't successful. This sometimes happens when a card expires or has new details.
→ Update your payment details here [link]
Your account is still active — no action has been taken yet. Simply update your payment method and everything will continue as normal.
If you have any questions, reply to this email or contact support@[yourdomain.com].
[Your name]
Email 3 — Final notice (Day 7)
Subject: Final notice: please update your payment by [date + 48 hrs]
Hi [Name],
This is a final notice regarding the failed payment of [amount] on [date]. We've sent two previous emails but haven't heard back.
Your access will be paused on [date + 48 hrs] if payment is not resolved.
→ Update your payment details now [link]
If you've already resolved this, please ignore this message. If you're having trouble, reply and we'll help.
[Your name]
How do you track recovery rate in Google Sheets?
The workflow automatically logs each failed payment to a Google Sheet with these columns: Customer Email, Customer Name, Amount, Currency, Failure Reason, Stripe Customer ID, Date Failed, Email 1 Sent, Email 2 Sent, Email 3 Sent, Status (Pending / Recovered / Written Off).
When the workflow detects a invoice.payment_succeeded event for a customer in the sheet, it updates their Status to "Recovered" and stops any remaining emails. This gives you a live dashboard of your recovery performance over time.
To calculate your recovery rate: Recovered rows ÷ Total failed rows × 100. A well-tuned dunning sequence typically lands between 25–40% for SaaS businesses and 15–25% for e-commerce.
Should you build this yourself or use a pre-built template?
| Approach | Time to Build | Cost | Customisability |
|---|---|---|---|
| Build from scratch (n8n/Make) | 8–15 hours | Free | Full |
| Pre-built template (Peak Automations) | 20–30 minutes | $97 one-time | Full — edit any node |
| Stripe's built-in Smart Retries | 0 (automatic) | Included in Stripe | None — black box |
| Paid dunning SaaS (Churnkey, Paysail) | 2–4 hours | $50–$200/month | Limited to their UI |
Note on Stripe Smart Retries: Stripe's built-in retry logic automatically retries failed subscription payments up to 4 times over several days. This is useful but it only handles retries — it doesn't send personalised customer emails or give you a recovery dashboard. Use Smart Retries alongside (not instead of) a dunning email sequence.
Get the pre-built Stripe Payment Recovery workflow
Complete n8n and Make.com workflow JSON, 3-email dunning templates, Google Sheets dashboard, and plain-English setup guide. Works in under 30 minutes.
See what's included →
Frequently asked questions
Stop losing revenue to failed payments
The pre-built workflow handles everything — Stripe webhook, 3-email dunning sequence, recovery tracking, duplicate prevention. One-time purchase, runs forever.
Full product details →