Hotel Check-out Experience Survey

The checkout experience is a guest's final impression of your hotel. This survey captures feedback on the checkout process efficiency, billing accuracy, staff service quality, and wait times. It pairs perfectly with check-in surveys to measure the complete guest journey. Use insights to optimize your departure procedures, reduce billing disputes, and ensure guests leave with positive final impressions.

Hospitality & Travel

Try the Form

Please take a moment to share your checkout experience.
Your Checkout
 
Billing & Folio
Overall Checkout Experience
Not at all likely
Extremely likely
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
export function hotelCheckoutSurvey(form: FormTs) {
// Hotel Check-out Experience Survey
// Demonstrates: RatingScale, StarRating, Slider, ThumbRating, RadioButton, MatrixQuestion, Timepicker
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Thank You for Staying With Us!',
computedValue: () => 'Please take a moment to share your checkout experience.',
customStyles: {
backgroundColor: '#1e40af',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Checkout Method
// ============================================
const methodSection = form.addSubform('method', {
title: 'Your Checkout'
});
 
methodSection.addRow(row => {
row.addRadioButton('checkoutMethod', {
label: 'How did you check out today?',
options: [
{ id: 'frontDesk', name: 'Front desk (in person)' },
{ id: 'express', name: 'Express checkout (envelope/drop box)' },
{ id: 'mobile', name: 'Mobile app checkout' },
{ id: 'tvCheckout', name: 'In-room TV checkout' },
{ id: 'other', name: 'Other' }
],
orientation: 'vertical',
isRequired: true
});
});
 
methodSection.addRow(row => {
row.addTimepicker('checkoutTime', {
label: 'Approximate checkout time',
isVisible: () => methodSection.radioButton('checkoutMethod')?.value() === 'frontDesk'
});
});
 
// ============================================
// SECTION 2: Wait Time (Front Desk Only)
// ============================================
const waitSection = form.addSubform('wait', {
title: 'Wait Time Experience',
isVisible: () => methodSection.radioButton('checkoutMethod')?.value() === 'frontDesk'
});
 
waitSection.addRow(row => {
row.addSlider('waitMinutes', {
label: 'How long did you wait in line? (minutes)',
min: 0,
max: 30,
step: 1,
unit: 'min',
showValue: true,
defaultValue: 0
});
});
 
waitSection.addRow(row => {
row.addStarRating('waitSatisfaction', {
label: 'How satisfied were you with the wait time?',
maxStars: 5,
size: 'md',
alignment: 'center',
isVisible: () => {
const wait = waitSection.slider('waitMinutes')?.value();
return wait !== null && wait !== undefined;
}
});
});
 
// Dynamic wait time message
waitSection.addRow(row => {
row.addTextPanel('waitMessage', {
isVisible: () => {
const wait = waitSection.slider('waitMinutes')?.value();
return wait !== null && wait !== undefined && wait > 0;
},
computedValue: () => {
const wait = waitSection.slider('waitMinutes')?.value();
if (!wait || wait === 0) return '';
if (wait <= 3) return '✅ Great! That\'s a quick checkout.';
if (wait <= 5) return '👍 Acceptable wait time.';
if (wait <= 10) return '⚠️ We aim to reduce wait times. Thank you for your patience.';
return '😔 We apologize for the long wait. This is not our standard.';
},
customStyles: () => {
const wait = waitSection.slider('waitMinutes')?.value();
const baseStyles = { padding: '10px', borderRadius: '6px', textAlign: 'center', fontSize: '14px' };
if (!wait || wait <= 3) return { ...baseStyles, backgroundColor: '#ecfdf5', color: '#047857' };
if (wait <= 5) return { ...baseStyles, backgroundColor: '#f0fdf4', color: '#15803d' };
if (wait <= 10) return { ...baseStyles, backgroundColor: '#fefce8', color: '#a16207' };
return { ...baseStyles, backgroundColor: '#fef2f2', color: '#b91c1c' };
}
});
});
 
// ============================================
// SECTION 3: Billing Experience
// ============================================
const billingSection = form.addSubform('billing', {
title: 'Billing & Folio'
});
 
billingSection.addRow(row => {
row.addThumbRating('billingAccuracy', {
label: 'Was your bill accurate with no unexpected charges?',
showLabels: true,
upLabel: 'Yes, accurate',
downLabel: 'No, issues found',
size: 'lg',
alignment: 'center'
});
});
 
// Billing issues section
billingSection.addRow(row => {
row.addCheckboxList('billingIssues', {
label: 'What billing issues did you experience?',
options: [
{ id: 'minibar', name: 'Incorrect mini-bar charges' },
{ id: 'room', name: 'Wrong room rate' },
{ id: 'dining', name: 'Restaurant charges error' },
{ id: 'parking', name: 'Parking charges issue' },
{ id: 'spa', name: 'Spa/amenity charges error' },
{ id: 'taxes', name: 'Unexpected taxes/fees' },
{ id: 'other', name: 'Other discrepancy' }
],
orientation: 'vertical',
isVisible: () => billingSection.thumbRating('billingAccuracy')?.value() === 'down'
});
});
 
billingSection.addRow(row => {
row.addRadioButton('billingResolution', {
label: 'Was the billing issue resolved to your satisfaction?',
options: [
{ id: 'yes', name: 'Yes, fully resolved' },
{ id: 'partial', name: 'Partially resolved' },
{ id: 'no', name: 'No, not resolved' },
{ id: 'pending', name: 'Still pending' }
],
orientation: 'vertical',
isVisible: () => billingSection.thumbRating('billingAccuracy')?.value() === 'down'
});
});
 
// ============================================
// SECTION 4: Staff Service (Front Desk)
// ============================================
const staffSection = form.addSubform('staff', {
title: 'Front Desk Staff',
isVisible: () => methodSection.radioButton('checkoutMethod')?.value() === 'frontDesk'
});
 
staffSection.addRow(row => {
row.addMatrixQuestion('staffRating', {
label: 'Please rate the checkout staff:',
rows: [
{ id: 'friendliness', label: 'Friendliness', isRequired: true },
{ id: 'efficiency', label: 'Efficiency', isRequired: true },
{ id: 'helpfulness', label: 'Helpfulness' },
{ id: 'professionalism', label: 'Professionalism' }
],
columns: [
{ id: 'poor', label: 'Poor' },
{ id: 'fair', label: 'Fair' },
{ id: 'good', label: 'Good' },
{ id: 'excellent', label: 'Excellent' }
],
striped: true,
fullWidth: true
});
});
 
staffSection.addRow(row => {
row.addTextbox('staffName', {
label: 'If you remember the staff member\'s name, please share (optional)',
placeholder: 'Staff name for recognition...'
});
});
 
// ============================================
// SECTION 5: Express/Mobile Checkout Experience
// ============================================
const expressSection = form.addSubform('express', {
title: 'Express Checkout Experience',
isVisible: () => {
const method = methodSection.radioButton('checkoutMethod')?.value();
return method === 'express' || method === 'mobile' || method === 'tvCheckout';
}
});
 
expressSection.addRow(row => {
row.addRatingScale('expressEase', {
label: 'How easy was the express checkout process?',
preset: 'ces',
alignment: 'center',
lowLabel: 'Very difficult',
highLabel: 'Very easy'
});
});
 
expressSection.addRow(row => {
row.addSuggestionChips('expressIssues', {
label: 'Any issues with express checkout?',
suggestions: [
{ id: 'none', name: 'No issues' },
{ id: 'instructions', name: 'Unclear instructions' },
{ id: 'technical', name: 'Technical problems' },
{ id: 'folio', name: 'Couldn\'t review folio' },
{ id: 'receipt', name: 'Receipt not received' },
{ id: 'keyReturn', name: 'Key return unclear' }
],
max: 3,
alignment: 'left'
});
});
 
// ============================================
// SECTION 6: Overall Checkout
// ============================================
const overallSection = form.addSubform('overall', {
title: 'Overall Checkout Experience'
});
 
overallSection.addRow(row => {
row.addEmojiRating('overallCheckout', {
label: 'How would you rate your overall checkout experience?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center'
});
});
 
overallSection.addSpacer();
 
overallSection.addRow(row => {
row.addRatingScale('returnIntent', {
label: 'How likely are you to stay with us again?',
preset: 'nps',
showSegmentColors: true,
showCategoryLabel: true,
alignment: 'center'
});
});
 
// ============================================
// SECTION 7: Feedback
// ============================================
const feedbackSection = form.addSubform('feedback', {
title: 'Additional Comments',
isVisible: () => overallSection.emojiRating('overallCheckout')?.value() !== null
});
 
feedbackSection.addRow(row => {
row.addTextarea('comments', {
label: () => {
const checkout = overallSection.emojiRating('overallCheckout')?.value();
if (checkout === 'excellent' || checkout === 'good') return 'Any comments to share about your departure?';
if (checkout === 'neutral') return 'How could we have made checkout better?';
return 'We\'re sorry about your experience. What went wrong?';
},
placeholder: 'Your feedback helps us improve...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 8: Summary
// ============================================
const summarySection = form.addSubform('summary', {
title: 'Checkout Feedback Summary',
isVisible: () => overallSection.emojiRating('overallCheckout')?.value() !== null
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const method = methodSection.radioButton('checkoutMethod')?.value();
const wait = waitSection.slider('waitMinutes')?.value();
const billing = billingSection.thumbRating('billingAccuracy')?.value();
const checkout = overallSection.emojiRating('overallCheckout')?.value();
const nps = overallSection.ratingScale('returnIntent')?.npsCategory();
 
if (!checkout) return '';
 
const methodLabels: Record<string, string> = {
'frontDesk': 'Front desk',
'express': 'Express checkout',
'mobile': 'Mobile app',
'tvCheckout': 'In-room TV',
'other': 'Other'
};
 
const checkoutLabels: Record<string, string> = {
'very-bad': '😢 Poor',
'bad': '😕 Below expectations',
'neutral': '😐 Average',
'good': '🙂 Good',
'excellent': '😃 Excellent'
};
 
let emoji = checkout === 'excellent' || checkout === 'good' ? '✅' : checkout === 'neutral' ? '⚠️' : '❌';
 
let summary = `${emoji} Checkout Summary\n`;
summary += `${'═'.repeat(25)}\n\n`;
summary += `Method: ${methodLabels[method || ''] || method}\n`;
 
if (method === 'frontDesk' && wait !== null && wait !== undefined) {
summary += `Wait: ${wait} minutes\n`;
}
 
if (billing) {
summary += `Billing: ${billing === 'up' ? '✓ Accurate' : '✗ Issues found'}\n`;
}
 
summary += `\n📊 Overall: ${checkoutLabels[checkout] || checkout}`;
 
if (nps) {
const npsLabels: Record<string, string> = {
'promoter': ' | 🎉 Likely to return',
'passive': ' | 🤔 May return',
'detractor': ' | 😟 Unlikely to return'
};
summary += npsLabels[nps] || '';
}
 
return summary;
},
customStyles: () => {
const checkout = overallSection.emojiRating('overallCheckout')?.value();
const baseStyles = {
padding: '16px',
borderRadius: '8px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (checkout === 'excellent' || checkout === 'good') {
return { ...baseStyles, backgroundColor: '#dbeafe', borderLeft: '4px solid #2563eb' };
} else if (checkout === '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: () => methodSection.radioButton('checkoutMethod')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You!',
message: 'We appreciate you taking the time to share your checkout experience. Your feedback helps us ensure every guest leaves with a positive final impression. Safe travels!'
});
}
 

Frequently Asked Questions

When should I send this survey?

Send within 2-4 hours of checkout while the experience is fresh. Some hotels display a QR code at the front desk or send an automatic email when the room is checked out of the system.

How does this differ from a full stay survey?

This survey focuses specifically on the checkout process - billing accuracy, wait times, staff efficiency during departure. A full stay survey covers room quality, amenities, dining, etc. Use both for comprehensive feedback.

What are common checkout pain points?

Common issues include long wait times, billing discrepancies (especially mini-bar charges), unclear charges, slow processing, staff not acknowledging guests, and difficulty with express checkout systems.

How can I reduce checkout friction?

Offer express checkout options (mobile, TV, envelope), send digital folios before departure, staff appropriately during peak times (typically 10-11am), and train staff to resolve billing disputes quickly.

Should I combine with check-in feedback?

You can use separate surveys to get focused feedback on each touchpoint. However, you can also use a combined arrival/departure survey for a complete journey view. Consider your response rate goals.