The hosted cancel page is a full-screen retention page that churn.io hosts for you. Instead of embedding a widget in your own app, you redirect customers to a churn.io URL when they click your cancel button, and they see your survey, retention offers, and goodbye steps before their subscription is cancelled. This article covers connecting your gateway, publishing a page flow, wiring up your cancel button, and optionally serving the page on your own subdomain.
Before you start
Two things need to be in place before the hosted cancel page works end to end:
A connected payment gateway. Connect Stripe under Integrations so churn.io can apply offers and cancel subscriptions for you.
A live page flow. Build a flow with its type set to Page, then publish it so its status is Live — the hosted cancel page only serves live flows.
💡 Where to find the setup
Open Flows in the sidebar, choose Embed, then switch to the Page tab. Your cancel page URL, the session snippet, and custom domains all live there, and the Status section at the bottom tells you whether your live page flows and gateway are ready.
Step 1: Copy your cancel page URL
On the Page tab, the first section shows Your cancel page URL — the hosted page customers land on. Use the Copy button to grab it. You do not link customers directly to this URL, though: each customer needs their own one-time link that carries their subscription details, which you generate in the next step.
Step 2: Create a session when a customer cancels
When a customer clicks your "Cancel subscription" button, your server makes one request to churn.io to create a session. This is the only piece of integration code you need, and it must run on your server (not in the browser) so your API key stays private. The Page tab shows a ready-to-paste snippet that already includes your API key.
When you create a session you can pass along the customer's details so the right flow and offers are shown:
Subscription ID — the customer's Stripe subscription ID, so churn.io can apply offers and cancel the correct subscription.
Email and MRR — used for analytics and audience targeting.
Plan — the Stripe Product ID. It must match the value you select in the flow's audience builder for plan-based targeting to work.
Billing interval — for example monthly or annual.
Return URL — where the customer goes if they decide to keep their subscription.
The response gives you back a unique url. Redirect the customer there and they will see your cancel page. churn.io picks the matching live page flow automatically from the details you sent, so you normally do not specify a flow yourself.
⚠️ Links expire after 24 hours
Each cancel page link is valid for 24 hours and single-use. Always create a fresh link at the moment the customer clicks cancel — never store or reuse one. A customer who opens an expired or used link sees a message asking them to contact support.
Step 3: What the customer sees
On the hosted page the customer moves through the steps you built into your flow — the survey, any retention offers, the feedback step, and the goodbye or cancellation step. The page uses your saved branding (colors, fonts, logo, and page styling) so it matches your product. Three things can happen, and churn.io handles each one for you:
They accept an offer. churn.io applies it through your connected gateway (a discount, free month, pause, or trial extension) and the session is recorded as saved.
They confirm cancellation. churn.io runs the cancellation behavior on your flow — cancelling in Stripe (immediately or at period end, per your setting), emailing you a notification, or sending a webhook.
They change their mind. If they dismiss the page, no changes are made and they are sent back to the return URL you provided.
After the customer finishes, where they go next depends on the completion setting in your flow — your return URL, back to the previous page, staying on the page, or a custom link you specified.
Step 4: Use your own domain (optional)
By default the cancel page is served from a churn.io URL. On Pro plans you can serve it from your own subdomain instead, so customers stay on a branded address. This is set up in section 3 of the Page tab under Custom domain.
Enter a subdomain such as cancel.yourcompany.com and click Connect.
Click Setup on the new domain to see the exact DNS record to add: a CNAME record pointing your subdomain at the target churn.io shows you.
Add that CNAME record at your domain registrar, then use Recheck to confirm it. The status badge updates to Connected once the record is found and points at the correct target.
⚠️ Use a subdomain, not your root domain
You must use a subdomain (like cancel.yourcompany.com), not a bare root domain — a CNAME on a root domain conflicts with your email (MX) records, and you cannot use a churn.io address. DNS changes can take up to 48 hours to propagate; SSL is handled for you automatically. While a custom domain is active it serves only your cancel page.
Testing and going live
You can test the experience without touching a real Stripe subscription: sessions created with a test or placeholder subscription ID skip the live gateway calls, so offers and cancellation can be exercised safely. When you are ready for production, send real Stripe subscription IDs from your server.
Before sending real customers, check the Status section on the Page tab. It confirms you have at least one live page flow and that your payment gateway is connected. If either shows a warning, follow the link there to create and publish a flow or connect your gateway first.
