The uncomfortable truth about churn
We often talk about “reducing churn” like it’s a dashboard problem. It isn’t. Churn is a conversation with a customer who’s trying to do their job under constraints you can’t see. The emails below aren’t magic words. They’re invitations to reply.
1) Payment failed (dunning #1)
Subject: “Card hiccup — we’ll keep everything safe”
Body:
Hi {{first_name}},
We couldn’t process your last payment for {{product}}. Nothing’s lost — your data and settings are safe.
Here’s a quick link to update your card: {{billing_link}}
If it’s a bank issue, hit reply and I’ll extend your grace period.
— {{signature}}
Timing: Send immediately. Tone: calm, helpful.
2) Payment failed (dunning #2 — empathy + friction reducer)
Subject: “Quick fix: update card without logging in”
Include a magic link token to billing so they skip password friction. This alone recovered ~18% of our failed payments.
3) Inactivity nudge (When value is hidden behind setup)
Subject: “Took me 2 mins to set this up for you”
Body:
Hey {{first_name}},
I noticed you haven’t connected {{integration}} yet. I recorded a 60‑second clip showing the exact steps on your account: {{loom_link}}.
If you want, reply with the API key and I’ll wire it up now.
— {{signature}}
This offers done‑for‑you momentum. Unblock, don’t lecture.
4) Silent success (Celebrate small wins)
Subject: “You shipped again this week — high five”
Send when a user completes a key action twice. It cements the habit and makes cancellation feel like losing progress.
5) Pre‑cancellation checkpoint (Save the exit interview)
Trigger this before they hit “Cancel” — when they open billing or export data.
Subject: “Can I fix this before you go?”
Body:
No forms, just this reply box. If something’s slow, confusing, or missing, describe it and I’ll get you an answer today.
This email saved two enterprise accounts for us — both had tiny, solvable blockers.
6) Cancellation survey (One screen, one question)
Show a single required question in‑app: “What nearly made you stay?” Add 5 quick‑select reasons and one free‑text box. Then send this follow‑up:
Subject: “Thanks — one last thing from me”
Body:
I read your note about {{reason}}. Two options that have helped teams like yours:
- Switch to annual at a flat discount
- Downgrade to {{lower_plan}} and keep {{critical_feature}}
If either helps, reply and I’ll flip the switch.
7) Winback (60–90 days later)
Subject: “Since you left: what changed in {{product}}”
Include 3 concrete updates and a short video walkthrough. End with a time‑boxed offer (e.g., “return on annual at your old price for 48 hours”).
Implementation notes (Laravel + Stripe)
- Use Stripe’s
billing_portal.sessions.create
and pass a return URL so people aren’t stranded. - Send dunning from your domain, not a third‑party sender, to improve reply rates.
- Log replies in your app (simple
conversations
table) so teammates see context.
If billing itself is the pain, fix that first. I documented 12 gotchas here: Stripe + Laravel Subscriptions: 12 Gotchas I Hit and How I Fixed Them.
For broader launch hygiene, check the SaaS Pre‑Launch Checklist and our Go‑to‑Market Strategy Checklist.