MuxForms cancellation feedback forms capture churn reasons inside your SaaS offboarding flow—structured select, competitor, and win-back intent with hidden account_id via server POST, not a detached Google Form after users already canceled.
Use case
Exit surveys belong in your cancel flow—not a Google Form link users ignore after they already clicked unsubscribe.
| Field | Purpose |
|---|---|
| reason | Churn taxonomy |
| competitor | Competitive intel |
| would_return | Win-back signal |
| account_id | Hidden from billing UI |
Churn interviews are valuable; churn silence is expensive. When a customer hits “Cancel subscription,” you have one moment to capture why before they disappear into Stripe’s receipt email.
MuxForms collects structured cancellation reasons: price, missing features, switched to competitor, or “no longer needed.” A follow-up textarea captures the sentence product managers quote in roadmap reviews.
Pass `account_id`, `plan`, and `mrr_band` as hidden fields from your billing UI via Server Action or API route with the ingest secret—never ship secrets in a public marketing embed. Authenticated offboarding is the right place for PII.
Optional “would you return if we fixed X?” select helps prioritize win-back campaigns without a separate survey tool.
Notify product@ and customer-success@ on each row; webhook to Slack for high-MRR cancels if you encode tier in hidden fields.
Aggregate reasons monthly from inbox export or BI ingest—pair with the NPS use case for relationship health vs exit motivation.
Keep the form short: cancel flows already have friction. Three required clicks plus one form beat a ten-question Typeform users abandon mid-churn.
Create a form named Product — Cancellation feedback with these fields, then paste the embed on your page. POST from billing cancel step with ingest secret; hidden account_id + plan; notify product@; keep copy empathetic.
| Field | Type | Required |
|---|---|---|
| Main reason for cancelingreason | select | Yes |
| What feature was missing?missing_feature | textarea | No |
| If you switched, what did you choose?competitor | text | No |
| Anything we could have done better?details | textarea | No |
| Would you consider coming back if we addressed your concern?would_return | select | No |
| Emailemail | No | |
| Account IDaccount_idhidden | text | No |
| Planplanhidden | text | No |
| Tenure monthstenure_monthshidden | text | No |
| Leave blank_hphidden | text | No |
Illustrative preview—wire your form id after signup.
{
"name": "Product — Cancellation feedback",
"fields": [
{
"name": "reason",
"label": "Main reason for canceling",
"type": "select",
"required": true,
"options": [
"Too expensive",
"Missing features I need",
"Switched to another product",
"No longer need the product",
"Poor support experience",
"Other"
]
},
{
"name": "missing_feature",
"label": "What feature was missing?",
"type": "textarea",
"required": false
},
{
"name": "competitor",
"label": "If you switched, what did you choose?",
"type": "text",
"required": false
},
{
"name": "details",
"label": "Anything we could have done better?",
"type": "textarea",
"required": false
},
{
"name": "would_return",
"label": "Would you consider coming back if we addressed your concern?",
"type": "select",
"required": false,
"options": [
"Yes",
"Maybe",
"No"
]
},
{
"name": "email",
"label": "Email",
"type": "email",
"required": false
}
]
}<div data-form-id="FORM_UUID"></div> <script src="https://www.muxforms.com/embed.js" defer></script>
Then clone the pattern for the next site or app.
Upgrade to Pro