Complaint Resolution Feedback

When customers complain, how you resolve the issue can turn detractors into loyal advocates. This complaint resolution feedback form measures satisfaction with the resolution process, perceived fairness of the outcome, staff handling quality, and whether trust has been restored. Use this data to improve your complaint handling processes and track service recovery effectiveness over time.

Service & Support

Try the Form

We recently resolved an issue for you. Please share your experience with us.
How Do You Feel?
 
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
export function complaintResolutionSurvey(form: FormTs) {
// Complaint Resolution Feedback - Post-issue satisfaction survey
// Demonstrates: EmojiRating, StarRating, ThumbRating, RatingScale (CES), MatrixQuestion, RadioButton
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Complaint Resolution Feedback',
computedValue: () => 'We recently resolved an issue for you. Please share your experience with us.',
customStyles: {
backgroundColor: '#0891b2',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Overall Resolution Feeling
// ============================================
const overallSection = form.addSubform('overall', {
title: 'How Do You Feel?'
});
 
overallSection.addRow(row => {
row.addEmojiRating('overallFeeling', {
label: 'How do you feel about how we handled your complaint?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center',
isRequired: true
});
});
 
// Dynamic message based on feeling
overallSection.addRow(row => {
row.addTextPanel('feelingMessage', {
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null,
computedValue: () => {
const feeling = overallSection.emojiRating('overallFeeling')?.value();
if (feeling === 'excellent' || feeling === 'good') return 'We\'re glad we could help resolve your issue!';
if (feeling === 'neutral') return 'We\'d love to know how we could have done better.';
return 'We\'re sorry we didn\'t meet your expectations. Please tell us more.';
},
customStyles: () => {
const feeling = overallSection.emojiRating('overallFeeling')?.value();
const baseStyles = { padding: '12px', borderRadius: '8px', textAlign: 'center', marginTop: '8px' };
if (feeling === 'excellent' || feeling === 'good') return { ...baseStyles, backgroundColor: '#ecfdf5', color: '#047857' };
if (feeling === 'neutral') return { ...baseStyles, backgroundColor: '#fffbeb', color: '#b45309' };
return { ...baseStyles, backgroundColor: '#fef2f2', color: '#b91c1c' };
}
});
});
 
// ============================================
// SECTION 2: Resolution Details
// ============================================
const resolutionSection = form.addSubform('resolution', {
title: 'About the Resolution',
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null
});
 
resolutionSection.addRow(row => {
row.addRadioButton('resolutionType', {
label: 'What type of resolution did you receive?',
options: [
{ id: 'refund', name: 'Refund' },
{ id: 'replacement', name: 'Replacement' },
{ id: 'repair', name: 'Repair / Fix' },
{ id: 'credit', name: 'Store credit / Discount' },
{ id: 'explanation', name: 'Explanation / Apology' },
{ id: 'other', name: 'Other solution' }
],
orientation: 'vertical'
});
});
 
resolutionSection.addSpacer();
 
// Fairness perception
resolutionSection.addRow(row => {
row.addThumbRating('fairnessRating', {
label: 'Was the resolution fair and appropriate for your issue?',
showLabels: true,
upLabel: 'Fair',
downLabel: 'Unfair',
size: 'lg',
alignment: 'center'
});
});
 
// Effort score
resolutionSection.addRow(row => {
row.addRatingScale('effortScore', {
label: 'How easy was it to get your issue resolved?',
preset: 'ces',
showSegmentColors: false,
alignment: 'center'
});
});
 
// ============================================
// SECTION 3: Staff Handling (Positive Path)
// ============================================
const staffSection = form.addSubform('staff', {
title: 'Staff Handling',
isVisible: () => {
const feeling = overallSection.emojiRating('overallFeeling')?.value();
return feeling !== null;
}
});
 
staffSection.addRow(row => {
row.addMatrixQuestion('staffAttributes', {
label: 'Please rate the staff who handled your complaint:',
rows: [
{ id: 'responsiveness', label: 'Responsiveness', isRequired: true },
{ id: 'empathy', label: 'Empathy & Understanding', isRequired: true },
{ id: 'knowledge', label: 'Knowledge & Competence', isRequired: true },
{ id: 'communication', label: 'Communication clarity', isRequired: true },
{ id: 'ownership', label: 'Taking ownership' }
],
columns: [
{ id: 'poor', label: 'Poor' },
{ id: 'fair', label: 'Fair' },
{ id: 'good', label: 'Good' },
{ id: 'excellent', label: 'Excellent' }
],
striped: true,
fullWidth: true
});
});
 
// ============================================
// SECTION 4: Timeline
// ============================================
const timelineSection = form.addSubform('timeline', {
title: 'Resolution Timeline',
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null
});
 
timelineSection.addRow(row => {
row.addRadioButton('resolutionSpeed', {
label: 'How long did it take to resolve your issue?',
options: [
{ id: 'immediate', name: 'Immediately (same contact)' },
{ id: 'sameDay', name: 'Same day' },
{ id: 'nextDay', name: 'Next day' },
{ id: 'fewDays', name: '2-3 days' },
{ id: 'week', name: 'About a week' },
{ id: 'longer', name: 'More than a week' }
],
orientation: 'vertical'
});
});
 
timelineSection.addRow(row => {
row.addStarRating('speedSatisfaction', {
label: 'How satisfied are you with the resolution speed?',
maxStars: 5,
size: 'md',
alignment: 'center'
});
});
 
// ============================================
// SECTION 5: Trust Restoration
// ============================================
const trustSection = form.addSubform('trust', {
title: 'Trust & Future Relationship',
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null
});
 
trustSection.addRow(row => {
row.addRatingScale('trustRestored', {
label: 'Has your trust in us been restored after this experience?',
preset: 'likert-5',
lowLabel: 'Not at all',
highLabel: 'Completely',
alignment: 'center'
});
});
 
trustSection.addRow(row => {
row.addRadioButton('futureIntent', {
label: 'How likely are you to continue doing business with us?',
options: [
{ id: 'definitely', name: 'Definitely will continue' },
{ id: 'probably', name: 'Probably will continue' },
{ id: 'unsure', name: 'Not sure' },
{ id: 'probablyNot', name: 'Probably will not continue' },
{ id: 'definitelyNot', name: 'Definitely will not continue' }
],
orientation: 'vertical'
});
});
 
// ============================================
// SECTION 6: Improvement Suggestions (Negative Path)
// ============================================
const improvementSection = form.addSubform('improvement', {
title: 'How Could We Have Done Better?',
isVisible: () => {
const feeling = overallSection.emojiRating('overallFeeling')?.value();
return feeling === 'very-bad' || feeling === 'bad' || feeling === 'neutral';
},
customStyles: { backgroundColor: '#fef3c7', padding: '16px', borderRadius: '8px' }
});
 
improvementSection.addRow(row => {
row.addSuggestionChips('issueAreas', {
label: 'What went wrong? (Select all that apply)',
suggestions: [
{ id: 'slow', name: 'Too slow to resolve' },
{ id: 'unfair', name: 'Unfair resolution' },
{ id: 'rude', name: 'Staff was rude/unhelpful' },
{ id: 'communication', name: 'Poor communication' },
{ id: 'passed', name: 'Passed around too much' },
{ id: 'incomplete', name: 'Issue not fully resolved' },
{ id: 'effort', name: 'Required too much effort' },
{ id: 'promised', name: 'Promises not kept' }
],
alignment: 'left'
});
});
 
improvementSection.addSpacer();
 
improvementSection.addRow(row => {
row.addTextarea('improvementSuggestion', {
label: 'What would have made this experience better?',
placeholder: 'Please share specific suggestions for improvement...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 7: Additional Feedback
// ============================================
const feedbackSection = form.addSubform('feedback', {
title: 'Additional Comments',
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null
});
 
feedbackSection.addRow(row => {
row.addTextarea('additionalComments', {
label: 'Is there anything else you\'d like to share about your experience?',
placeholder: 'Any additional feedback is appreciated...',
rows: 3,
autoExpand: true
});
});
 
feedbackSection.addRow(row => {
row.addCheckbox('contactPermission', {
label: 'You may contact me for follow-up regarding this feedback'
});
});
 
feedbackSection.addRow(row => {
row.addEmail('contactEmail', {
label: 'Email address',
placeholder: 'your@email.com',
isVisible: () => feedbackSection.checkbox('contactPermission')?.value() === true,
isRequired: () => feedbackSection.checkbox('contactPermission')?.value() === true
});
});
 
// ============================================
// SECTION 8: Summary
// ============================================
const summarySection = form.addSubform('summary', {
title: 'Feedback Summary',
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const feeling = overallSection.emojiRating('overallFeeling')?.value();
const fairness = resolutionSection.thumbRating('fairnessRating')?.value();
const effort = resolutionSection.ratingScale('effortScore')?.value();
const trust = trustSection.ratingScale('trustRestored')?.value();
const futureIntent = trustSection.radioButton('futureIntent')?.value();
const issues = improvementSection.suggestionChips('issueAreas')?.value() || [];
 
if (!feeling) return '';
 
const feelingLabels: Record<string, string> = {
'very-bad': '😢 Very Dissatisfied',
'bad': '😕 Dissatisfied',
'neutral': '😐 Neutral',
'good': '🙂 Satisfied',
'excellent': '😃 Very Satisfied'
};
 
let emoji = '📋';
if (feeling === 'excellent' || feeling === 'good') emoji = '✅';
else if (feeling === 'neutral') emoji = '⚠️';
else emoji = '❌';
 
let summary = `${emoji} Resolution Feedback Summary\n`;
summary += `${'═'.repeat(32)}\n\n`;
summary += `Overall Feeling: ${feelingLabels[feeling] || feeling}\n`;
 
if (fairness) {
summary += `Fairness: ${fairness === 'up' ? '👍 Fair' : '👎 Unfair'}\n`;
}
 
if (effort) {
const effortLabel = effort >= 5 ? 'Easy' : effort >= 3 ? 'Moderate' : 'Difficult';
summary += `Effort Score: ${effort}/7 (${effortLabel})\n`;
}
 
if (trust) {
const trustLabel = trust >= 4 ? 'Restored' : trust >= 3 ? 'Partially' : 'Not restored';
summary += `Trust: ${trustLabel}\n`;
}
 
if (futureIntent) {
const intentLabels: Record<string, string> = {
'definitely': 'Will definitely continue',
'probably': 'Will probably continue',
'unsure': 'Unsure',
'probablyNot': 'Probably won\'t continue',
'definitelyNot': 'Won\'t continue'
};
summary += `Future Intent: ${intentLabels[futureIntent] || futureIntent}\n`;
}
 
if (issues.length > 0) {
summary += `\n⚠️ Issues identified: ${issues.length}`;
}
 
return summary;
},
customStyles: () => {
const feeling = overallSection.emojiRating('overallFeeling')?.value();
const baseStyles = {
padding: '16px',
borderRadius: '8px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (feeling === 'excellent' || feeling === 'good') {
return { ...baseStyles, backgroundColor: '#d1fae5', borderLeft: '4px solid #10b981' };
} else if (feeling === 'neutral') {
return { ...baseStyles, backgroundColor: '#fef3c7', borderLeft: '4px solid #f59e0b' };
} else {
return { ...baseStyles, backgroundColor: '#fee2e2', borderLeft: '4px solid #ef4444' };
}
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Feedback',
isVisible: () => overallSection.emojiRating('overallFeeling')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You for Your Feedback',
message: 'Your input helps us improve our complaint handling process. We take every piece of feedback seriously and use it to serve you better in the future.'
});
}
 

Frequently Asked Questions

When should I send this survey?

Send this survey 24-48 hours after resolving a customer complaint. This gives them time to evaluate the resolution while the experience is still fresh. Avoid sending immediately after resolution as emotions may still be high.

What is service recovery paradox?

The service recovery paradox suggests that customers who experience a problem that gets resolved excellently can become more loyal than customers who never had a problem. This survey helps you measure whether your resolutions are achieving this paradox.

How do I measure fairness perception?

This template includes specific questions about outcome fairness (was the resolution appropriate?), process fairness (was it handled properly?), and interpersonal fairness (were you treated with respect?). These three dimensions of fairness strongly predict customer satisfaction.

What should I do with negative feedback?

Negative feedback after complaint resolution indicates a failed service recovery - this customer is at high risk of churn. Consider immediate follow-up with escalation to a senior team member. Each failed recovery is an opportunity to learn and improve your processes.

How can I improve trust restoration rates?

Focus on empowering frontline staff to resolve issues quickly, being generous with compensation when appropriate, keeping customers informed throughout the process, and following up after resolution to ensure satisfaction.