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:

  1. Switch to annual at a flat discount
  2. 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 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 conversations table) 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.