How to add a cancel flow to Recurly
How cancellation works in Recurly Subscriptions: cancel vs terminate, reactivation, Hosted Account Management, Recurly's own save tools and building a flow.
A cancel flow is the step between a customer clicking “Cancel” and the cancellation itself: ask why, make one offer that fits the answer, and cancel cleanly if they still want to leave. This guide explains how cancellation works in Recurly Subscriptions, which save tools Recurly already offers, and how to build your own flow on its API.
It sticks to Recurly’s own documentation: expire or cancel a subscription, the subscription management guide, the subscription lifecycle webhook guide, subscription notifications, Hosted Account Management, coupons, change subscription and Recurly Engage Cancel Save (all accessed November 2026). Recurly also sells Recurly Commerce, a separate product with its own portal; this guide is about Recurly Subscriptions unless stated.
Cancel, terminate, reactivate
Recurly distinguishes two ways to end a subscription (expire or cancel).
| Cancel | Terminate | |
|---|---|---|
| When it ends | At the next bill date (timeframe: bill_date) or at the end of the term (timeframe: term_end) |
Immediately, mid-cycle |
| State | canceled until expires_at, then expired |
expired right away |
| Access | The customer keeps access until expiry | Ends now |
| Refund | Not applicable | none (default), partial (prorated for the time left) or full (the last charge) |
| Reversible | Yes, reactivate before expiry | No |
Two details matter for a cancel flow:
- Bill date vs term end. For a plan with a multi-period term,
bill_datestops at the next billing event, whileterm_endkeeps billing until the term is over. Pick the one that matches what you promised the customer when they signed up. - Reactivation. A canceled subscription can be reactivated until it expires, so it renews again at the end of the current cycle. Once it has expired, it cannot be reactivated and a new subscription is needed. In SCA regions, Recurly notes the customer may have to authenticate their stored billing information again before reactivation.
Terminating also refunds only the last invoice; if that invoice is credit-only, Recurly ignores the refund request. For a customer who simply wants to stop, cancel rather than terminate.
Where customers cancel today
Hosted Account Management
Recurly’s hosted account pages can include a cancel button. Per the Hosted Account Management docs, you enable it in the Admin Console under Configuration › Hosted Page Settings, “Cancel subscriptions” under Customer Options. Customers can then cancel straight from their hosted account page. Recurly’s docs do not describe a reason survey in that path.
Recurly Engage Cancel Save
Recurly sells its own save tool in Recurly Engage. Per the Cancel Save guide, you start from a pre-built “Cancel Survey with Offers” guide, set a CSS selector on your cancel button as the trigger, and branch survey answers to actions: Recurly’s example sends “too expensive” to a save offer and “technical issues” to support. Live Preview shows the design but does not run the flow, so Recurly suggests testing with a test users segment. Recurly says the integration with Recurly.js, Hosted Account Management and Recurly Checkout is enabled automatically, and notes the feature may not be included in Starter or Pro plans.
Recurly Commerce
If you sell through Recurly Commerce rather than Recurly Subscriptions, it has cancellation flows configured in its Customer Portal: a multi-step survey, a retention action per answer (discount, pause, extended subscription or support), assigned to a plan before it goes live.
If one of these fits your plan and your needs, use it. The rest of this guide is for when you want the flow in your own app, with your own design and offers.
The offers Recurly’s API supports
Coupon
Recurly coupons can last forever, for a single use, for a limited time, or for a set number of billing periods, and Recurly recommends billing-period coupons over time-based ones. For retention, two options help:
- Bulk unique codes: one-time codes generated in batches, so a save offer cannot be shared. Each code can be redeemed once by default.
- Plan restrictions: a coupon applies to all plans by default; restrict it to the plans where the offer makes sense.
Plan change
A downgrade is a subscription change that can apply immediately, at the next bill date, or at term renewal. Recurly keeps only one pending change; a second one replaces the first. For “too expensive”, a change at the next bill date avoids surprise proration.
Pause
Recurly can pause a subscription for a number of billing cycles from the next bill date. It has enough rules of its own (active subscriptions only, annual plans, coupons that keep running) that we cover it in how to pause subscriptions in Recurly. One rule to remember here: Recurly says customers cannot pause from Hosted Account Management, so a pause offer has to come from your own flow, your support team, or Recurly Commerce’s portal.
Building the flow
- Route “Cancel” in your app to your flow. If Hosted Account Management also shows a cancel button, decide whether to keep it. Keeping it is honest and simple; it just means some customers skip the flow.
- Ask why. A short list of reasons plus “Other”. Store the answer with the subscription UUID.
- Show one offer that fits. “Too expensive”: a billing-period coupon or a cheaper plan at the next bill date. “Not using it right now”: a pause. “Missing a feature” or “Something is broken”: a reply from a person.
- Keep “Cancel now” visible on every step. One click finishes the cancellation, with no offer to accept first.
- Apply the result through the API. Apply the coupon, schedule the plan change, pause, or cancel with the
timeframeyou chose. - Confirm the end date. Read
expires_atfrom the subscription Recurly returns, and show it. - Offer to undo. Until the subscription expires, a “Keep my subscription” button can call the reactivate endpoint.
Webhooks to listen to
The lifecycle webhook guide describes the path: a cancellation sends a canceled notification; it is followed either by reactivated, if the customer comes back before expiry, or by expired when expires_at is reached. Termination and immediate refunds go straight to expired.
Recurly’s pages use more than one naming style for these events: the subscription notifications page uses event types such as “canceled” and “expired”, while other pages use older names such as canceled_subscription_notification and expired_subscription_notification. Check the names in your own payloads. Recurly also advises treating webhooks as alerts: confirm the current state through the API, accept duplicates, and handle events that arrive out of order.
Measuring the flow
Recurly’s churned subscriptions export has an expiration_reason column (for example Canceled or Non-payment) that separates voluntary from involuntary churn. Combine it with the reasons your flow collected, and with how many customers accepted each offer and were still subscribed a few months later.
Doing this with NoChurn
NoChurn connects to Recurly with a private API key and follows its webhooks. It adds a cancel flow with reasons, offers that become a coupon, a pause or a plan change on the Recurly subscription, and a one-click cancel that is always visible, hosted or headless through the API. It also sends win-back emails at day 30, 60 and 90 based on the cancel reason and computes a churn score from 0 to 100. Invoicing, the charge itself and your gateway stay in Recurly. NoChurn is free under $300 MRR, with every feature on every plan. See NoChurn + Recurly.