WIN-BACKPOLAR

How to win back canceled subscribers on Polar

Winning back canceled subscribers on Polar: cancel at period end, uncancel, cancellation reasons, subscription discounts, and a reason-based win-back sequence.

Published 5 min read

Polar makes cancelling easy, on purpose. Its customer portal always lets subscribers cancel at the end of their period, and that option cannot be turned off. That is good for trust. It also means your win-back strategy has to work with Polar’s model rather than around it.

This guide explains what happens on Polar when a subscriber cancels, the two windows in which you can bring them back, and how to use cancellation reasons and discounts to do it. It sticks to Polar’s own documentation: Managing subscriptions, the Customer Portal, webhook events, Discounts and the Update Subscription API reference (all accessed November 2026).

How cancellation works on Polar

Polar distinguishes two ways a subscription can end.

Cancel at period end

This is what the customer does in the portal, and what you do with cancel_at_period_end: true on the subscription (Managing subscriptions). The subscription stays active, the customer keeps their benefits, and it ends on current_period_end.

The Customer Portal docs say “cancel at period end” is always available to customers and that the portal cannot be turned off. Polar ties this to California’s Automatic Renewal Law, which requires that customers can cancel the way they signed up. You can disable other portal actions (plan changes, email edits), but not this one.

Revoke

Revocation ends the subscription immediately. It is merchant-only and, per Polar, irreversible. It also happens automatically when payment retries are exhausted after failed renewals (failed payments).

The events

The webhook events page describes the sequence:

What happens Events sent
Customer or merchant cancels at period end subscription.updated and subscription.canceled, immediately
Customer reverses the pending cancellation subscription.uncanceled
Period ends subscription.updated and subscription.revoked
Merchant revokes immediately subscription.updated, subscription.canceled and subscription.revoked together

So subscription.canceled means “will end”, and subscription.revoked means “has ended”. Your win-back logic keys off both.

Window 1: before the period ends

Between subscription.canceled and the end of the period, the subscription can still be saved without a new checkout. Polar’s Managing subscriptions page says you can uncancel any time before the end date, which reverts the scheduled cancellation and sends subscription.uncanceled.

What to do in this window:

  1. Show the end date in your app, with a “Keep my subscription” button that sets cancel_at_period_end back to false through the API.
  2. Send one reminder a few days before current_period_end: what they lose and when, with the same button.
  3. Do not lead with a discount. The customer still has access and already chose to leave once. Remind them of value first.

Recording the reason

Polar has native fields for this. The subscription carries customer_cancellation_reason and customer_cancellation_comment, and Managing subscriptions lists the reason values: too_expensive, missing_features, switched_service, unused, customer_service, low_quality, too_complex and other.

Polar’s guidance is to set them only with what the customer actually said, for example from a cancellation survey or a support conversation. It also warns that customers can see their cancellation comment in their purchase history, so never put internal notes there.

If you cancel through your own app, pass the reason in the same PATCH that sets cancel_at_period_end. The List Subscriptions endpoint can then filter by customer_cancellation_reason, which is exactly what a reason-based win-back campaign needs.

Window 2: after the subscription is revoked

Once revoked, the subscription is gone. Bringing the customer back means a new checkout. This is where Polar’s discounts help.

Discounts for returning subscribers

Polar’s Discounts support three durations for subscriptions:

  • Once: the first invoice only.
  • Repeating: a set number of months (duration_in_months, required for this type; Polar says to multiply by 12 for yearly prices).
  • Forever: every renewal.

A discount can have a code, 3 to 256 alphanumeric characters, that customers enter at checkout. Without a code, it can only be applied through the API. For a win-back email, a repeating discount (“40% off your first 3 months back”) is usually clearer than forever.

Discounts on subscriptions that are still running

For window 1, Polar also lets you attach a discount to an existing subscription. The Update Subscription reference says you set discount_id, the change applies from the next billing cycle, and discount_id: null removes it. That makes “stay and get 3 months at a lower price” possible without a new checkout, combined with uncancelling.

A reason-based win-back sequence

Polar’s docs we used do not describe a built-in win-back or marketing email feature, so the sequence runs from your own email tool, triggered by subscription.revoked.

Match the message to the reason

customer_cancellation_reason What to send
too_expensive A time-limited discount code, or a cheaper plan
missing_features A note when the feature ships; no discount needed
unused What changed since they left, and a lighter plan if you have one
switched_service One honest message on what you do differently, then stop
too_complex A short guide or an offer to set it up with them
customer_service, low_quality A personal reply from the founder or team lead, not a campaign
other or empty A short, generic check-in

Timing

Three touches is enough: around 30, 60 and 90 days after revocation. Stop at the first reply, unsubscribe or new subscription (subscription.created for the same customer).

A former customer is not automatically someone who opted in to marketing. Check your consent basis for each region before sending, keep the message relevant to their reason, and include a one-click unsubscribe.

Measure

Track, by reason and by offer: how many revoked subscribers start a new subscription within 90 days, and how many cancelled subscribers uncancel before the period ends. Polar’s Analytics reports canceled and churned subscriptions separately, which helps you see both windows.

Common mistakes

  • Removing access on subscription.canceled. The customer paid for the period and Polar keeps the subscription active until it ends.
  • Writing internal notes in customer_cancellation_comment. The customer can see it.
  • Guessing the reason. Polar asks that these fields come from the customer. A wrong reason sends the wrong win-back message.
  • Fighting the portal. Customers can always cancel there. Make the in-app path better instead: ask the reason, offer a fitting alternative, keep cancel one click away.

Doing this with NoChurn

Polar keeps the subscription, the checkout and the portal, and its cancel option stays as it is. NoChurn reads your Polar webhooks, adds a cancel flow in your app (reason, a fitting offer such as a discount, pause or plan change, and a one-click cancel that is always visible), and sends win-back emails at day 30, 60 and 90 based on the reason. Each customer gets a churn score from 0 to 100. Disputes stay with Polar as the merchant of record and are shown read only. See NoChurn + Polar.

PROMPT

Read https://www.nochurn.sh/llms.txt,
then follow https://www.nochurn.sh/docs/quickstart/
to add NoChurn to this app. Use a test key
(nc_test_…) until I say we go live.

Stop leaking revenue.

  • Free until $300 MRR
  • No card needed
  • Live in 10 minutes
  • Never a cut of what we recover