- Customer clicks cancel from their dashboard
- Chooses from one of the predefined cancellation reasons (if available)
- Gets offered a winback
- Takes the winback offer or proceeds to cancel and gives feedback
Enable the new Cancellation flow
Steps
- Go to your project in Firmhouse and click New Features from the sidebar.
- On this page, enable Cancellation Reasons and Winback Offers.

Add a cancellation reason and winback offer
Steps
- In your Firmhouse project, go to Customer Portal > Churn prevention. For the legacy portal, go to Settings > Churn prevention.
- Click Add Reason.
- Fill out a Reporting title, which is the language-independent title of this reason to be used in reporting exports and dashboards.
- Fill out the Customer-facing cancellation reason, which is the text that people will see in the Cancellation flow.
- Under What customers see, choose an Alternative action: Continue to cancellation, offer to pause for 1–3 months, or offer to skip 1–3 orders.
- Enable or disable the reason with the Status checkbox.
- Click Save.

Connect a promotional offer to a reason
When the Workflow Builder preview is enabled, What customers see lets you expand the promotional offers linked to a saved reason. Only offers with an explicit condition targeting this reason can appear during cancellation. Every other eligibility condition must still match the customer. If several offers qualify, the offer with the lowest priority number is checked first. Expand Linked offers and choose an offer to review its conditions. To create one, check Create an offer for this reason, then choose Save and create offer to open a draft with that reason preselected. After saving the offer, you return to the reason. The list shows each offer’s status and omits archived offers. An eligible promotional offer appears first. The configured pause or skip alternative is shown alongside it and remains available when no offer is available or the customer declines it. Continue to cancellation adds no pause or skip alternative; it does not disable promotional offers.Record a reason when cancelling or pausing for a customer
When your team performs the action from a customer’s subscription page, the cancellation or pause form shows the active reasons configured for that flow. By default, selecting a reason is optional: select the reason the customer gave you, or leave it blank for an internal action where no customer reason should be recorded. To require reasons for team actions:- Enable Cancellation Reasons and Winback Offers and Pause Reasons and Winback Offers in New Features.
- Add at least one active reason for each flow in Customer Portal > Churn prevention (or Settings > Churn prevention for the legacy portal).
- Go to Settings > Subscription model and enable Require a reason when team members cancel or pause subscriptions.
Start a cancellation or pause with a known reason
When another system already knows why a customer wants to cancel or pause, add the active reason ID to the flow URL as thechurn_reason_id query parameter:
Complete a custom cancellation flow without another confirmation
If your Customer Portal v2 template already asks the customer to confirm, submit that confirmation directly tosubscription.complete_churn_request_url. This skips the Firmhouse confirmation page while keeping the change behind an authenticated, CSRF-protected POST request.
<input type="hidden" name="flow" value="pause"> and use a reason configured for pauses.
Only use this endpoint for a customer action that has already presented a clear confirmation. A GET request never completes the change. Firmhouse still verifies that the reason is active and belongs to the current project and flow, and rechecks the subscription’s cancellation or pause eligibility before applying it. An invalid reason returns the customer to the standard reason-selection flow.
Record a save in a fully custom cancellation flow
If your Customer Portal v2 template handles retention actions outside the native Firmhouse flow, usewindow.Firmhouse.churnRequests to record the outcome through the customer’s portal session. It handles the portal URL and CSRF token. Do not put a project access token in template JavaScript.
For other Customer Portal v2 JSON endpoints, window.Firmhouse.request(url, { method, body }) provides the same authenticated, same-origin request handling. The churn methods use it and add the churn-request lifecycle checks.
Start a cancellation request when the customer enters your custom flow. An active cancellation reason ID is optional. Keep the returned request ID for this attempt.
startCancellation again with that reason; it updates the initiated request. After an intentional Keep plan choice or a successful custom retention action, record prevention and await the response before showing a saved confirmation or leaving the page.
prevented and follow-up action custom_retention. It contributes to Analytics → Metrics → Churn Prevention for the period when the request was created. Retrying prevent with the same request ID returns the existing outcome. A completed cancellation cannot be changed to prevented. The subscription must still be active or paused when you record the save.
Both methods return promises. If either rejects, do not show a saved confirmation. You can retry startCancellation while the request is initiated, or retry prevent with the same request ID if its result is uncertain.
Only record a save after the customer deliberately keeps the plan or a retention action succeeds. Navigating back, closing the page, or merely clicking through to a skip or postpone confirmation is not a saved outcome.
The portal endpoint only records the outcome. It does not change a plan, skip an order, pause a subscription, apply a discount, or undo a cancellation. Handle those changes separately and record prevention only after they succeed. If the customer proceeds to cancellation, use the authenticated confirmation flow described above.
Pause Reasons and Winback Offers
The same churn prevention flow is available when customers pause their subscription. Instead of pausing immediately, the flow asks customers why they are pausing, can respond with a winback offer, and collects feedback after the pause.Enable
- Go to your project in Firmhouse and click New Features from the sidebar.
- On this page, enable Pause Reasons and Winback Offers.
Add a pause reason
- In your Firmhouse project, go to Customer Portal > Churn prevention. For the legacy portal, go to Settings > Churn prevention.
- Click Add reason and set Shown before to Customer pauses their subscription.
- Fill out the reason the same way as a cancellation reason. The Alternative action options are: Continue to pause, offer to pause for 1–3 months with an automatic resume date, and offer to skip 1–3 orders. Promotional offers are only shown during cancellation, so pause reasons do not show the promotional-offer section.
View Cancellation feedback and Winback results per customer
When a customer completes a Cancellation flow - either by taking a winback offer or by cancelling - their choices and feedback can be seen on the Customer detail page in the Firmhouse admin portal.
View Cancellation and Churn Prevention metrics
In your Firmhouse project, navigate to Metrics in the sidebar. Then click the Churn Prevention tab to view aggregated metrics about cancellation reasons and winback offer acceptance rates.
Export churn feedback
To export the reasons and feedback customers submitted during cancellation and pause requests:- In your Firmhouse project, go to Analytics > Reports.
- Open Churn feedback.
- Set Created after and Created before to choose the reporting period.
- Under Request type, select cancellation, pause, or both. Both request types are selected by default.
- Choose the fields to include and click Generate report.