Building Inspection Feedback Form

Quality building inspections protect property owners and ensure code compliance. This feedback form helps municipalities, inspection companies, and real estate organizations evaluate inspector performance. It covers key aspects like thoroughness, punctuality, communication clarity, professionalism, and helpfulness. Conditional logic gathers detailed feedback on issues while celebrating excellent service, helping organizations maintain high inspection standards.

Specialized

Try the Form

Help us improve our inspection services. Your feedback matters.
Inspection Information
 
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
export function buildingInspector(form: FormTs) {
// Building Inspection Feedback Form
// Demonstrates: RatingScale, MatrixQuestion, StarRating, EmojiRating, Dropdown, Datepicker, conditional flows
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Building Inspection Feedback',
computedValue: () => 'Help us improve our inspection services. Your feedback matters.',
customStyles: {
backgroundColor: '#0f766e',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Inspection Details
// ============================================
const inspectionDetails = form.addSubform('inspectionDetails', {
title: 'Inspection Information'
});
 
inspectionDetails.addRow(row => {
row.addDropdown('inspectionType', {
label: 'Type of Inspection',
options: [
{ id: 'pre-purchase', name: 'Pre-Purchase/Home Inspection' },
{ id: 'electrical', name: 'Electrical Inspection' },
{ id: 'plumbing', name: 'Plumbing Inspection' },
{ id: 'structural', name: 'Structural Inspection' },
{ id: 'foundation', name: 'Foundation Inspection' },
{ id: 'roofing', name: 'Roofing Inspection' },
{ id: 'hvac', name: 'HVAC Inspection' },
{ id: 'fire-safety', name: 'Fire Safety Inspection' },
{ id: 'code-compliance', name: 'Code Compliance' },
{ id: 'final', name: 'Final/Certificate of Occupancy' },
{ id: 'other', name: 'Other' }
],
placeholder: 'Select inspection type',
isRequired: true
}, '1fr');
row.addDropdown('propertyType', {
label: 'Property Type',
options: [
{ id: 'residential-single', name: 'Single Family Home' },
{ id: 'residential-multi', name: 'Multi-Family Residential' },
{ id: 'condo', name: 'Condo/Apartment' },
{ id: 'commercial', name: 'Commercial Building' },
{ id: 'industrial', name: 'Industrial Facility' },
{ id: 'new-construction', name: 'New Construction' },
{ id: 'renovation', name: 'Renovation Project' }
],
placeholder: 'Select property type',
isRequired: true
}, '1fr');
});
 
inspectionDetails.addRow(row => {
row.addDatepicker('inspectionDate', {
label: 'Inspection Date',
isRequired: true
}, '1fr');
row.addDropdown('yourRole', {
label: 'Your Role',
options: [
{ id: 'homeowner', name: 'Homeowner' },
{ id: 'buyer', name: 'Prospective Buyer' },
{ id: 'seller', name: 'Property Seller' },
{ id: 'contractor', name: 'Contractor/Builder' },
{ id: 'agent', name: 'Real Estate Agent' },
{ id: 'property-manager', name: 'Property Manager' }
],
isRequired: true
}, '1fr');
});
 
// ============================================
// SECTION 2: Overall Experience
// ============================================
const overallSection = form.addSubform('overallSection', {
title: 'Overall Experience',
isVisible: () => inspectionDetails.dropdown('inspectionType')?.value() !== null && inspectionDetails.dropdown('inspectionType')?.value() !== undefined
});
 
overallSection.addRow(row => {
row.addEmojiRating('overallFeeling', {
label: 'How was your overall inspection experience?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center'
});
});
 
overallSection.addRow(row => {
row.addRatingScale('overallSatisfaction', {
preset: 'satisfaction',
label: 'Overall Satisfaction with the Inspection Service',
alignment: 'center',
isRequired: true
});
});
 
// ============================================
// SECTION 3: Inspector Performance Matrix
// ============================================
const performanceSection = form.addSubform('performanceSection', {
title: 'Inspector Performance',
isVisible: () => overallSection.ratingScale('overallSatisfaction')?.value() !== null && overallSection.ratingScale('overallSatisfaction')?.value() !== undefined
});
 
performanceSection.addRow(row => {
row.addMatrixQuestion('inspectorMatrix', {
label: 'Please rate the inspector on the following aspects:',
rows: [
{ id: 'punctuality', label: 'Punctuality', description: 'Arrived on time as scheduled', isRequired: true },
{ id: 'thoroughness', label: 'Thoroughness', description: 'Comprehensive examination of property', isRequired: true },
{ id: 'knowledge', label: 'Technical Knowledge', description: 'Expertise in building codes and systems', isRequired: true },
{ id: 'communication', label: 'Communication', description: 'Clear explanations of findings', isRequired: true },
{ id: 'professionalism', label: 'Professionalism', description: 'Courtesy and professional demeanor', isRequired: true },
{ id: 'report-quality', label: 'Report Quality', description: 'Clear, detailed, and useful documentation', isRequired: true }
],
columns: [
{ id: '1', label: 'Poor' },
{ id: '2', label: 'Fair' },
{ id: '3', label: 'Good' },
{ id: '4', label: 'Very Good' },
{ id: '5', label: 'Excellent' }
],
striped: true,
fullWidth: true
});
});
 
// ============================================
// SECTION 4: Key Ratings
// ============================================
const ratingsSection = form.addSubform('ratingsSection', {
title: 'Service Quality',
isVisible: () => performanceSection.matrixQuestion('inspectorMatrix')?.areAllRequiredRowsAnswered() === true,
customStyles: { backgroundColor: '#f0fdfa', padding: '20px', borderRadius: '10px' }
});
 
ratingsSection.addRow(row => {
row.addStarRating('processClarity', {
label: 'Process Clarity',
tooltip: 'How well the inspection process was explained',
maxStars: 5,
size: 'lg',
showCounter: true,
alignment: 'center'
}, '1fr');
row.addStarRating('valueForMoney', {
label: 'Value for Money',
tooltip: 'Worth the cost of the inspection',
maxStars: 5,
size: 'lg',
showCounter: true,
alignment: 'center'
}, '1fr');
});
 
ratingsSection.addRow(row => {
row.addRatingScale('effortScore', {
preset: 'ces',
label: 'How easy was it to schedule and complete the inspection?',
alignment: 'center',
size: 'md'
});
});
 
// ============================================
// SECTION 5: Issues (for lower satisfaction)
// ============================================
const issuesSection = form.addSubform('issuesSection', {
title: 'Areas of Concern',
isVisible: () => {
const satisfaction = overallSection.ratingScale('overallSatisfaction')?.value();
return satisfaction !== null && satisfaction !== undefined && satisfaction <= 3;
},
customStyles: { backgroundColor: '#fef2f2', padding: '20px', borderRadius: '10px' }
});
 
issuesSection.addRow(row => {
row.addCheckboxList('issuesEncountered', {
label: 'What issues did you experience? (Select all that apply)',
options: [
{ id: 'late', name: 'Inspector was late' },
{ id: 'rushed', name: 'Inspection felt rushed' },
{ id: 'incomplete', name: 'Areas were not inspected' },
{ id: 'unclear', name: 'Findings were unclear' },
{ id: 'unprofessional', name: 'Unprofessional behavior' },
{ id: 'unresponsive', name: 'Slow to respond to questions' },
{ id: 'report-delayed', name: 'Report was delayed' },
{ id: 'report-incomplete', name: 'Report was incomplete' },
{ id: 'pricing', name: 'Unexpected fees or pricing issues' }
],
orientation: 'vertical'
});
});
 
issuesSection.addSpacer({ height: '15px' });
 
issuesSection.addRow(row => {
row.addTextarea('issueDetails', {
label: 'Please describe the issues in detail:',
placeholder: 'Help us understand what went wrong so we can improve...',
rows: 4,
autoExpand: true,
isVisible: () => (issuesSection.checkboxList('issuesEncountered')?.value()?.length ?? 0) > 0
});
});
 
// ============================================
// SECTION 6: Positive Feedback (for higher satisfaction)
// ============================================
const positiveSection = form.addSubform('positiveSection', {
title: 'What Impressed You',
isVisible: () => {
const satisfaction = overallSection.ratingScale('overallSatisfaction')?.value();
return satisfaction !== null && satisfaction !== undefined && satisfaction >= 4;
},
customStyles: { backgroundColor: '#f0fdf4', padding: '20px', borderRadius: '10px' }
});
 
positiveSection.addRow(row => {
row.addCheckboxList('positiveAspects', {
label: 'What did you appreciate most? (Select all that apply)',
options: [
{ id: 'thorough', name: 'Very thorough inspection' },
{ id: 'knowledgeable', name: 'Highly knowledgeable inspector' },
{ id: 'explained', name: 'Excellent explanations' },
{ id: 'patient', name: 'Patient and answered all questions' },
{ id: 'organized', name: 'Well-organized process' },
{ id: 'timely', name: 'On time and efficient' },
{ id: 'helpful-report', name: 'Very helpful report' },
{ id: 'recommendations', name: 'Valuable recommendations' }
],
orientation: 'vertical'
});
});
 
positiveSection.addRow(row => {
row.addTextarea('positiveComments', {
label: 'What else went well?',
placeholder: 'Share what made this inspection experience great...',
rows: 3,
autoExpand: true,
isVisible: () => (positiveSection.checkboxList('positiveAspects')?.value()?.length ?? 0) > 0
});
});
 
// ============================================
// SECTION 7: Recommendation
// ============================================
const recommendSection = form.addSubform('recommendSection', {
title: 'Recommendation',
isVisible: () => performanceSection.matrixQuestion('inspectorMatrix')?.areAllRequiredRowsAnswered() === true
});
 
recommendSection.addRow(row => {
row.addThumbRating('wouldRecommend', {
label: 'Would you recommend this inspector to others?',
showLabels: true,
upLabel: 'Yes, definitely',
downLabel: 'Probably not',
size: 'lg',
alignment: 'center'
});
});
 
recommendSection.addRow(row => {
row.addThumbRating('wouldUseAgain', {
label: 'Would you use this inspection service again?',
showLabels: true,
upLabel: 'Yes',
downLabel: 'No',
size: 'lg',
alignment: 'center',
isVisible: () => recommendSection.thumbRating('wouldRecommend')?.value() !== null && recommendSection.thumbRating('wouldRecommend')?.value() !== undefined
});
});
 
// ============================================
// SECTION 8: Summary
// ============================================
const summarySection = form.addSubform('summarySection', {
title: 'Feedback Summary',
isVisible: () => recommendSection.thumbRating('wouldUseAgain')?.value() !== null && recommendSection.thumbRating('wouldUseAgain')?.value() !== undefined
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const inspType = inspectionDetails.dropdown('inspectionType')?.value();
const propType = inspectionDetails.dropdown('propertyType')?.value();
const overall = overallSection.ratingScale('overallSatisfaction')?.value();
const feeling = overallSection.emojiRating('overallFeeling')?.value();
const processClarity = ratingsSection.starRating('processClarity')?.value();
const valueForMoney = ratingsSection.starRating('valueForMoney')?.value();
const recommend = recommendSection.thumbRating('wouldRecommend')?.value();
const useAgain = recommendSection.thumbRating('wouldUseAgain')?.value();
 
if (!overall) return '';
 
const inspTypeLabels: Record<string, string> = {
'pre-purchase': 'Pre-Purchase', 'electrical': 'Electrical', 'plumbing': 'Plumbing',
'structural': 'Structural', 'foundation': 'Foundation', 'roofing': 'Roofing',
'hvac': 'HVAC', 'fire-safety': 'Fire Safety', 'code-compliance': 'Code Compliance',
'final': 'Final/CO', 'other': 'Other'
};
 
const propTypeLabels: Record<string, string> = {
'residential-single': 'Single Family', 'residential-multi': 'Multi-Family',
'condo': 'Condo', 'commercial': 'Commercial', 'industrial': 'Industrial',
'new-construction': 'New Construction', 'renovation': 'Renovation'
};
 
const feelingEmojis: Record<string, string> = {
'very-bad': '😡', 'bad': '😕', 'neutral': '😐', 'good': '🙂', 'excellent': '😍'
};
 
let emoji = overall >= 4 ? '🏠' : overall <= 2 ? '🚧' : '📋';
 
let summary = `${emoji} Inspection Feedback Summary\n`;
summary += `${'═'.repeat(30)}\n\n`;
if (inspType) summary += `📋 Type: ${inspTypeLabels[inspType] || inspType}\n`;
if (propType) summary += `🏢 Property: ${propTypeLabels[propType] || propType}\n`;
summary += `\n`;
summary += `📊 Satisfaction: ${overall}/5\n`;
if (feeling) summary += `${feelingEmojis[feeling] || ''} Experience: ${feeling}\n`;
if (processClarity) summary += `📝 Process Clarity: ${processClarity}/5\n`;
if (valueForMoney) summary += `💰 Value: ${valueForMoney}/5\n`;
summary += `\n`;
summary += `👍 Recommend: ${recommend === 'up' ? 'Yes' : 'No'}\n`;
summary += `🔄 Use Again: ${useAgain === 'up' ? 'Yes' : 'No'}`;
 
return summary;
},
customStyles: () => {
const recommend = recommendSection.thumbRating('wouldRecommend')?.value();
const useAgain = recommendSection.thumbRating('wouldUseAgain')?.value();
const baseStyles = {
padding: '20px',
borderRadius: '10px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (recommend === 'up' && useAgain === 'up') {
return { ...baseStyles, backgroundColor: '#d1fae5', borderLeft: '4px solid #059669' };
} else if (recommend === 'down' || useAgain === 'down') {
return { ...baseStyles, backgroundColor: '#fee2e2', borderLeft: '4px solid #ef4444' };
}
return { ...baseStyles, backgroundColor: '#f1f5f9', borderLeft: '4px solid #64748b' };
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Feedback',
isVisible: () => recommendSection.thumbRating('wouldUseAgain')?.value() !== null && recommendSection.thumbRating('wouldUseAgain')?.value() !== undefined
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You for Your Feedback!',
message: 'Your input helps us maintain high inspection standards and improve our services. We appreciate you taking the time to share your experience.'
});
}
 

Frequently Asked Questions

When should this feedback be collected?

Send the survey within 24-48 hours of the inspection while the experience is fresh. Automated emails triggered by inspection completion work best for timely feedback collection.

How do we handle complaints about inspection findings?

This form focuses on service quality, not inspection outcomes. If feedback conflates dissatisfaction with the inspection process vs. the results, train staff to separate these issues. Consider adding a disclaimer that feedback is about service experience.

Should inspectors see their individual feedback?

Yes, with coaching context. Share both positive and constructive feedback as development opportunities. Anonymous aggregate trends help identify systemic issues vs. individual training needs.

Can this form be used for different inspection types?

Absolutely. The dropdown allows selection of inspection type (electrical, plumbing, structural, etc.). The core service quality criteria apply universally across inspection disciplines.

What response rate should we expect?

For B2C inspections, expect 10-20% response rates. For B2B and permit-related inspections, rates can reach 30-40%. Incentivizing feedback or making it part of the permit closure process increases participation.