The uncomfortable truth about churn
It’s common to 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 signed, expiring link straight to billing so they can update their card without remembering a password. Removing that step is one of the simplest ways to make recovery easier. In Laravel, URL::temporarySignedRoute() gives you such a link.
3) Inactivity nudge (When value is hidden behind setup)
Subject: “Here’s how to connect {{integration}} in two minutes”
Body:
Hey {{first_name}},
I noticed you haven’t connected {{integration}} yet. Here’s a short clip showing the exact steps: {{video_link}}.
If you get stuck, reply and I’ll book a quick call to set it up with you.
— {{signature}}
Offer help, not a lecture. Don’t ask customers to email you API keys or other secrets; offer a screen‑share instead.
4) Silent success (Celebrate small wins)
Subject: “You shipped again this week — high five”
Send when a user completes a key action a couple of times. It reinforces the habit and reminds them of the progress they’ve made.
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 back to you as quickly as I can.
People often leave over small, solvable blockers they never reported. This email gives them one easy chance to tell you. Only promise a response time you can actually keep.
6) Cancellation survey (One screen, one question)
Show a single question in‑app, such as “What’s the main reason you’re leaving?” Add a handful of quick‑select reasons and one free‑text box, and let people skip it. Then send this follow‑up:
Subject: “Thanks — one last thing from me”
Body:
I read your note about {{reason}}. Two options that might help:
- 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.createand pass a return URL so people aren’t stranded. - Send dunning from your own domain (with SPF, DKIM and DMARC set up) and a reply‑to address someone reads, so replies reach a person.
- Log replies in your app (simple
conversationstable) so teammates see context.
If billing itself is the pain, fix that first: Stripe + Laravel Subscriptions: 12 Common Gotchas and Fixes.
For broader launch hygiene, check the SaaS Pre‑Launch Checklist and our B2B SaaS Go‑to‑Market Checklist.