Retention Pricing
How to use pricing as a retention lever — loyalty discounts, pause-instead-of-cancel, and win-back offers.
Why
Acquiring a new customer costs 5-25x more than retaining an existing one, so pricing for retention is higher-ROI than pricing for acquisition. The three levers are: (1) loyalty discounts for long-tenured customers (the 'grandfathered price' that locks them in), (2) pause-instead-of-cancel for users who are leaving temporarily (new job, sabbatical, budget freeze), and (3) win-back offers for recently-churned users. Each lever has a specific job: loyalty discounts prevent voluntary churn by making the switching cost visible, pause captures the 15-20% of cancellations that are temporary, and win-back recovers 5-10% of churned users at a deep discount. The mistake is using these as blanket policies — a 50% win-back offer to a user who churned because your product is broken just brings them back to churn again. Target each lever to the segment it fits.
When
When your monthly churn exceeds 5% (consumer) or 2% (B2B). Build the retention pricing levers before you need them — adding pause after a user has already canceled is too late.
How
1. Loyalty discount: after 12 months of continuous subscription, apply a 10-15% coupon via stripe.coupons.create with duration='forever' — email the user "thanks for being a member, your price is now $24/mo forever" 2. Pause instead of cancel: when a user clicks 'cancel subscription', offer a 'pause for 1/3/6 months' option that sets the subscription to paused (stripe.subscriptions.update with pause_collection.behavior='void') — they keep access to read-only data and resume automatically 3. Win-back: for users who churned in the last 30-90 days, send a sequence of 2 emails offering 50% off for 3 months — use a unique coupon code per user to track which offers convert 4. Segment the win-back audience by churn reason: 'too expensive' → 50% off; 'missing features' → do not offer (fix the feature first); 'no longer needed' → do not offer (they will churn again) 5. For annual subscribers who want to cancel mid-year, offer a partial refund + downgrade to a lower plan instead of a full cancel — you keep some revenue and they keep some access 6. Track each lever's ROI: loyalty discount cost vs. retained LTV, pause resume rate, win-back conversion rate and second-churn rate — kill any lever whose second-churn rate exceeds 50% 7. Never offer a win-back to a user who is still in dunning (failed payment) — that is a payment problem, not a churn problem, and a discount does not fix it 8. Make all retention offers time-limited (7-14 days) — open-ended offers train users to churn and re-subscribe for the discount
Example
# Loyalty discount after 12 months
const coupon = await stripe.coupons.create({
percent_off: 15, duration: "forever",
name: "Loyalty — 15% off forever",
});
await stripe.subscriptions.update(subId, { coupon: coupon.id });
# Pause instead of cancel
async function pauseSubscription(subId: string, months: number) {
await stripe.subscriptions.update(subId, {
pause_collection: {
behavior: "void",
resumes_at: Math.floor(Date.now() / 1000) + months * 30 * 86400,
},
});
}
# Win-back email (Resend)
await resend.emails.send({
from: "[email protected]",
to: churnedUser.email,
subject: "Come back — 50% off for 3 months",
html: winBackTemplate({ couponCode: `WB-${churnedUser.id}`, discount: 50 }),
});Common Problems
- ⚠Offering a win-back discount to every churned user — users who churned because the product did not fit take the discount, churn again, and you have trained them to expect a discount every time. Segment by churn reason.
- ⚠Not offering pause — 15-20% of cancellations are temporary (new job, budget freeze), and without a pause option these users fully cancel and may never return. Pause captures them at zero cost.
- ⚠Making loyalty discounts visible on the pricing page — new users see that long-tenured users pay less and feel penalized for being new. Apply loyalty discounts silently via coupon, not on the public price.
Best Practices
- ✓Make pause the default option on the cancel page — 'pause for 3 months' should be the primary button, 'cancel' the secondary. This captures temporary leavers without friction.
- ✓Time-box win-back offers to 3 months of discount, then full price — open-ended discounts train users to churn-and-return, and the LTV of a churn-and-return user is lower than a stable subscriber.
- ✓Track second-churn rate by lever — if win-back users churn again at > 50%, the discount is bringing back the wrong users. Refine the segment or kill the lever.