Claude Code Boilerplate
FeaturesPricingBlogDocs
Get started →

Product

  • Features
  • Pricing
  • Skills

Compare

  • vs ShipFast
  • vs MakerKit
  • vs supastarter

Resources

  • Docs
  • Blog
  • Discord

Legal

  • License
  • Privacy Policy
  • Terms of Service
Claude Code Boilerplate

© 2026 Claude Code Boilerplate. All rights reserved.

← All posts

How to Reduce SaaS Churn -- Cancel Flows, Exit Surveys, and Win-Back Emails in Next.js

July 27, 2026
nextjsstripedrizzle-ormsaasresend

Why churn kills before you notice it

You are adding 50 new users a month and losing 40. You are not growing -- you are treading water. A 5% monthly churn rate means you lose more than half your user base in a year, no matter how strong your acquisition looks.

The problem is that churn is invisible. Stripe sends a cancellation webhook, the subscription ends, and you move on. Nobody asks why.

That is the leak. Here is how to fix it.

Three things you can build to stop the bleeding

A cancel flow that offers one alternative before the user leaves

Most founders put a "cancel subscription" button in their billing settings, and that is where the journey ends. A cancel flow intercepts that click.

Before the subscription cancels, show the user exactly one other option -- not five. If their plan is too expensive, offer a downgrade. If they have not logged in for 30 days, offer a one-month pause. If they say they are missing a feature, surface the one that is closest to what they need.

A pause is often the easiest win. Stripe supports pausing subscriptions -- you call stripe.subscriptions.update with pause_collection: { behavior: 'void' }, set a paused_until timestamp on the user in Drizzle ORM, and send a confirmation via Resend. The user keeps access, billing stops, and you have 30 days to solve whatever made them want to leave.

An exit survey that tells you exactly why users leave

If they cancel anyway, ask them why. Five radio buttons and one optional text field:

  • Too expensive
  • Missing a feature I need
  • I do not use it enough
  • I found a better alternative
  • Just testing, not a real need

Store the response in a churn_responses table with the user ID, their previous plan tier, and a timestamp. Thirty cancellations give you a pattern. A hundred give you a product roadmap and a pricing hypothesis.

The exit survey is not a retention tool -- it is product research that is free because the user is leaving anyway. It costs one afternoon to build and starts paying back immediately.

A win-back email that shows what changed

Thirty days after cancellation, 15-20% of churned users will have reconsidered. A win-back email does not need to be emotional. It should be a simple list: "Here is what we shipped since you left."

Your boilerplate already has Resend wired up for transactional email. A WinBackEmail template takes a name prop and a changes array -- the three or four things that shipped after the user cancellation date. If their exit survey reason is directly addressed by any of those changes, say so plainly.

The trigger is a Vercel cron job that runs once a week, queries for users who churned between 27 and 34 days ago and have not resubscribed, and calls your email service. The entire job is a single API route.

What to build first

This depends on where you are.

Under 50 users: Skip all of this. Email churned users directly -- one paragraph asking why is worth more than any automated flow. Automation only pays off once the pattern is consistent.

50 to 500 users: Build the exit survey first. It costs one afternoon, gives you data immediately, and does not require any Stripe API changes. Start reading the responses before you build anything else.

Over 500 users: Build the cancel flow next. Even a 10% save rate on attempted cancellations recovers real MRR that would otherwise disappear quietly every month.

Churn is a product signal, not just a number

The mistake most founders make is treating churn as something to outrun with acquisition. That is expensive and it does not scale.

Churn is the product telling you something is wrong -- with the pricing, the onboarding, the feature set, or the fit. The exit survey is how you hear it. The cancel flow is how you buy time to fix it.

This Next.js SaaS boilerplate ships with Stripe subscriptions, Resend email, Drizzle ORM, and Vercel cron already wired together. The cancel flow, exit survey, and win-back email are features you can ship in a day. The data they generate is worth months of guessing about what to fix next.

Get started at boilerplate.iteam-company.com and build the retention layer your SaaS actually needs.