Cancellation Reasons Survey

Customer cancellations are goldmines of insight. This comprehensive cancellation survey helps you understand the real reasons behind churn with intelligent branching logic. Depending on the selected reason, customers see tailored follow-up questions and potential retention offers. The survey captures satisfaction history, competitive intelligence, and win-back willingness - everything you need to reduce future churn and improve your product.

Product FeedbackPopular

Try the Form

Your feedback helps us improve for everyone
Why are you cancelling?
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
export function cancellationSurvey(form: FormTs) {
// Cancellation Reasons Survey - Intelligent churn prevention with conditional paths
// Demonstrates: RadioButton, CheckboxList, RatingScale, Slider, ThumbRating, conditional visibility, dynamic labels
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: "We're Sorry to See You Go",
computedValue: () => "Your feedback helps us improve for everyone",
customStyles: {
background: 'linear-gradient(135deg, #ef4444 0%, #f97316 100%)',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Primary Cancellation Reason
// ============================================
const reasonSection = form.addSubform('reasonSection', {
title: 'Why are you cancelling?',
customStyles: { padding: '16px', borderRadius: '8px', border: '1px solid #e2e8f0' }
});
 
reasonSection.addRow(row => {
row.addRadioButton('primaryReason', {
label: 'Please select the main reason for cancelling',
options: [
{ id: 'too-expensive', name: 'Too expensive for my budget' },
{ id: 'missing-features', name: 'Missing features I need' },
{ id: 'switched-competitor', name: 'Switching to a competitor' },
{ id: 'not-using', name: "Not using it enough" },
{ id: 'technical-issues', name: 'Too many bugs or technical issues' },
{ id: 'hard-to-use', name: 'Too difficult to use' },
{ id: 'temporary', name: 'Temporary pause (will return)' },
{ id: 'business-closed', name: 'Business closing / changing direction' },
{ id: 'other', name: 'Other reason' }
],
orientation: 'vertical',
isRequired: true
});
});
 
// ============================================
// SECTION 2A: Pricing Follow-up (conditional)
// ============================================
const pricingSection = form.addSubform('pricingSection', {
title: 'πŸ’° Help Us Understand Your Pricing Concerns',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() === 'too-expensive',
customStyles: { backgroundColor: '#fef3c7', padding: '16px', borderRadius: '8px' }
});
 
pricingSection.addRow(row => {
row.addSlider('priceExpectation', {
label: 'What monthly price would be fair for you?',
min: 0,
max: 100,
step: 5,
defaultValue: 20,
unit: '$/mo',
showValue: true
});
});
 
pricingSection.addRow(row => {
row.addCheckboxList('pricingFactors', {
label: 'What would make the current price worthwhile?',
options: [
{ id: 'more-features', name: 'More features included' },
{ id: 'better-support', name: 'Better customer support' },
{ id: 'team-seats', name: 'More team seats' },
{ id: 'storage', name: 'More storage/usage limits' },
{ id: 'integrations', name: 'Better integrations' },
{ id: 'nothing', name: 'Nothing - price is simply too high' }
],
orientation: 'vertical'
});
});
 
pricingSection.addRow(row => {
row.addTextPanel('pricingOffer', {
label: '🎁 Special Offer',
computedValue: () => 'Would you consider staying with 30% off for 3 months?',
customStyles: {
backgroundColor: '#d1fae5',
padding: '12px',
borderRadius: '8px',
fontWeight: 'bold',
textAlign: 'center'
}
});
});
 
pricingSection.addRow(row => {
row.addThumbRating('acceptPricingOffer', {
label: 'Interested in this offer?',
showLabels: true,
upLabel: "Yes, I'll stay!",
downLabel: 'No thanks',
alignment: 'center',
size: 'lg'
});
});
 
// ============================================
// SECTION 2B: Features Follow-up (conditional)
// ============================================
const featuresSection = form.addSubform('featuresSection', {
title: 'πŸ”§ What Features Are You Missing?',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() === 'missing-features',
customStyles: { backgroundColor: '#e0e7ff', padding: '16px', borderRadius: '8px' }
});
 
featuresSection.addRow(row => {
row.addCheckboxList('missingFeatures', {
label: 'Which features do you wish we had?',
options: [
{ id: 'reporting', name: 'Advanced reporting/analytics' },
{ id: 'automation', name: 'More automation options' },
{ id: 'integrations', name: 'Specific integrations' },
{ id: 'api', name: 'API access' },
{ id: 'mobile', name: 'Better mobile app' },
{ id: 'collaboration', name: 'Team collaboration features' },
{ id: 'customization', name: 'More customization options' },
{ id: 'export', name: 'Better export/import' }
],
orientation: 'vertical'
});
});
 
featuresSection.addSpacer();
 
featuresSection.addRow(row => {
row.addTextarea('featureDetails', {
label: 'Please describe the specific features you need',
placeholder: 'The more detail, the better we can prioritize...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 2C: Competitor Follow-up (conditional)
// ============================================
const competitorSection = form.addSubform('competitorSection', {
title: 'πŸ”„ Competitor Feedback',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() === 'switched-competitor',
customStyles: { backgroundColor: '#fee2e2', padding: '16px', borderRadius: '8px' }
});
 
competitorSection.addRow(row => {
row.addTextbox('competitorName', {
label: 'Which competitor are you switching to? (optional)',
placeholder: 'Competitor name...'
});
});
 
competitorSection.addRow(row => {
row.addCheckboxList('competitorReasons', {
label: 'What attracts you to the competitor?',
options: [
{ id: 'price', name: 'Better pricing' },
{ id: 'features', name: 'More features' },
{ id: 'ui', name: 'Better user interface' },
{ id: 'support', name: 'Better customer support' },
{ id: 'integration', name: 'Better integrations' },
{ id: 'reputation', name: 'Better reputation/reviews' },
{ id: 'recommendation', name: 'Recommended by colleague' }
],
orientation: 'vertical'
});
});
 
// ============================================
// SECTION 2D: Technical Issues Follow-up (conditional)
// ============================================
const technicalSection = form.addSubform('technicalSection', {
title: 'πŸ› Technical Issues',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() === 'technical-issues',
customStyles: { backgroundColor: '#fef3c7', padding: '16px', borderRadius: '8px' }
});
 
technicalSection.addRow(row => {
row.addCheckboxList('technicalProblems', {
label: 'What issues have you experienced?',
options: [
{ id: 'crashes', name: 'Frequent crashes or errors' },
{ id: 'slow', name: 'Slow performance' },
{ id: 'data-loss', name: 'Data loss or sync issues' },
{ id: 'login', name: 'Login/authentication problems' },
{ id: 'browser', name: 'Browser compatibility issues' },
{ id: 'mobile', name: 'Mobile app problems' },
{ id: 'integrations', name: 'Integration failures' }
],
orientation: 'vertical'
});
});
 
technicalSection.addSpacer();
 
technicalSection.addRow(row => {
row.addTextarea('technicalDetails', {
label: 'Please describe the issues in detail',
placeholder: 'Include any error messages or steps to reproduce...',
rows: 3,
autoExpand: true
});
});
 
technicalSection.addRow(row => {
row.addTextPanel('technicalOffer', {
computedValue: () => 'πŸ“ž Our engineering team would love to help. Can we schedule a call to fix these issues?',
customStyles: {
backgroundColor: '#d1fae5',
padding: '12px',
borderRadius: '8px',
textAlign: 'center'
}
});
});
 
technicalSection.addRow(row => {
row.addThumbRating('acceptSupportCall', {
label: 'Would you like us to reach out?',
showLabels: true,
upLabel: 'Yes, please help',
downLabel: 'No thanks',
alignment: 'center',
size: 'lg'
});
});
 
// ============================================
// SECTION 2E: Other Reason Follow-up (conditional)
// ============================================
const otherSection = form.addSubform('otherSection', {
title: 'πŸ“ Tell Us More',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() === 'other',
customStyles: { backgroundColor: '#f1f5f9', padding: '16px', borderRadius: '8px' }
});
 
otherSection.addRow(row => {
row.addTextarea('otherReason', {
label: 'Please explain your reason for cancelling',
placeholder: 'Your feedback helps us improve...',
rows: 4,
autoExpand: true,
isRequired: true
});
});
 
// ============================================
// SECTION 3: Satisfaction History
// ============================================
const satisfactionSection = form.addSubform('satisfactionSection', {
title: 'Looking Back',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() !== null,
customStyles: { padding: '16px', borderRadius: '8px', border: '1px solid #e2e8f0' }
});
 
satisfactionSection.addRow(row => {
row.addRatingScale('overallSatisfaction', {
preset: 'satisfaction',
label: 'Overall, how satisfied were you with our product?',
alignment: 'center',
size: 'lg'
});
});
 
satisfactionSection.addRow(row => {
row.addStarRating('valueRating', {
label: 'Value for money',
maxStars: 5,
size: 'md',
alignment: 'center'
}, '1fr');
 
row.addStarRating('supportRating', {
label: 'Customer support',
maxStars: 5,
size: 'md',
alignment: 'center'
}, '1fr');
});
 
satisfactionSection.addRow(row => {
row.addStarRating('easeRating', {
label: 'Ease of use',
maxStars: 5,
size: 'md',
alignment: 'center'
}, '1fr');
 
row.addStarRating('reliabilityRating', {
label: 'Reliability',
maxStars: 5,
size: 'md',
alignment: 'center'
}, '1fr');
});
 
// ============================================
// SECTION 4: Win-back Opportunity
// ============================================
const winbackSection = form.addSubform('winbackSection', {
title: 'Future Possibilities',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() !== null,
customStyles: { backgroundColor: '#f0fdf4', padding: '16px', borderRadius: '8px' }
});
 
winbackSection.addRow(row => {
row.addThumbRating('wouldReturn', {
label: 'Would you consider coming back in the future?',
showLabels: true,
upLabel: 'Yes, possibly',
downLabel: 'Unlikely',
alignment: 'center',
size: 'lg'
});
});
 
winbackSection.addRow(row => {
row.addTextarea('returnConditions', {
label: () => {
const wouldReturn = winbackSection.thumbRating('wouldReturn')?.value();
if (wouldReturn === 'up') return 'What would need to change for you to return?';
return 'What would make you reconsider?';
},
placeholder: 'Specific features, pricing changes, improvements...',
rows: 2,
autoExpand: true,
isVisible: () => winbackSection.thumbRating('wouldReturn')?.value() !== null
});
});
 
winbackSection.addRow(row => {
row.addCheckbox('keepInformed', {
label: 'Keep me informed about new features and updates'
});
});
 
winbackSection.addRow(row => {
row.addEmail('contactEmail', {
label: 'Email for updates (optional)',
placeholder: 'your@email.com',
isVisible: () => winbackSection.checkbox('keepInformed')?.value() === true
});
});
 
// ============================================
// SECTION 5: Final Thoughts
// ============================================
const finalSection = form.addSubform('finalSection', {
title: 'Any Final Thoughts?',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() !== null
});
 
finalSection.addSpacer();
 
finalSection.addRow(row => {
row.addTextarea('finalFeedback', {
label: 'Is there anything else you want us to know?',
placeholder: 'Your honest feedback helps us improve for future customers...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SUMMARY SECTION
// ============================================
const summarySection = form.addSubform('summary', {
title: 'Feedback Summary',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() !== null
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const reason = reasonSection.radioButton('primaryReason')?.value();
const satisfaction = satisfactionSection.ratingScale('overallSatisfaction')?.value();
const wouldReturn = winbackSection.thumbRating('wouldReturn')?.value();
const keepInformed = winbackSection.checkbox('keepInformed')?.value();
 
const reasonLabels: Record<string, string> = {
'too-expensive': 'πŸ’° Pricing',
'missing-features': 'πŸ”§ Missing Features',
'switched-competitor': 'πŸ”„ Competitor',
'not-using': 'πŸ“‰ Low Usage',
'technical-issues': 'πŸ› Technical Issues',
'hard-to-use': 'πŸ˜• Usability',
'temporary': '⏸️ Temporary Pause',
'business-closed': '🏒 Business Change',
'other': 'πŸ“ Other'
};
 
let summary = 'Cancellation Feedback\n';
summary += '═'.repeat(25) + '\n\n';
summary += `Primary Reason: ${reasonLabels[reason || ''] || 'Not specified'}\n`;
 
if (satisfaction !== null && satisfaction !== undefined) {
summary += `Satisfaction: ${satisfaction}/5\n`;
}
 
summary += `Return Likelihood: ${wouldReturn === 'up' ? 'Possible' : wouldReturn === 'down' ? 'Unlikely' : 'Not answered'}\n`;
summary += `Stay Informed: ${keepInformed ? 'Yes' : 'No'}\n`;
 
// Check for offers accepted
const pricingOffer = pricingSection.thumbRating('acceptPricingOffer')?.value();
const supportOffer = technicalSection.thumbRating('acceptSupportCall')?.value();
 
if (pricingOffer === 'up') {
summary += '\n🎁 Accepted pricing offer!';
}
if (supportOffer === 'up') {
summary += '\nπŸ“ž Requested support call';
}
 
return summary;
},
customStyles: {
padding: '16px',
borderRadius: '8px',
backgroundColor: '#f8fafc',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Feedback & Cancel',
isVisible: () => reasonSection.radioButton('primaryReason')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You for Your Feedback',
message: "We truly appreciate you taking the time to share your thoughts. Your feedback helps us build a better product. We hope to see you again someday!"
});
}
 

Frequently Asked Questions

When should this survey appear?

Show it when customers initiate cancellation but before it's finalized. This gives you a chance to understand their reasons and potentially offer alternatives. Some companies show a shortened version immediately and email a detailed survey after cancellation.

How can I use cancellation data to reduce churn?

Analyze patterns in cancellation reasons. If 'pricing' is common, consider tier adjustments. If 'missing features' dominates, prioritize your roadmap accordingly. Track which retention offers work and A/B test different approaches. The goal is turning insights into product improvements.

Should I offer discounts to prevent cancellation?

Use discounts strategically. A blanket discount trains customers to threaten cancellation. Instead, offer targeted solutions: pause option for temporary situations, annual discount for price-sensitive users, premium support for frustrated customers. Match the offer to the stated reason.

How do I handle competitors mentioned in feedback?

Competitor mentions are valuable competitive intelligence. Track which competitors are winning customers and why. Use this to identify feature gaps or positioning issues. Never argue with customers about competitor choices - thank them for honest feedback instead.

What's a good cancellation survey completion rate?

Expect 30-50% completion for in-app surveys shown during cancellation flow. Email follow-ups typically see 10-20%. Keep the survey short (2-3 minutes max) and make it clear their feedback matters. Some companies offer incentives like extended trial or account credit.

How do I identify save-able customers?

Look for customers who: rate you highly on satisfaction despite cancelling (likely pricing or situational issue), indicate willingness to return, or mention specific fixable problems. Prioritize outreach to these customers with personalized solutions.