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.
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:
- Show the end date in your app, with a “Keep my subscription” button that sets
cancel_at_period_endback tofalsethrough the API. - Send one reminder a few days before
current_period_end: what they lose and when, with the same button. - 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).
Consent
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.