Contractor Performance Evaluation

Managing contractors effectively requires systematic feedback collection at project completion. This form evaluates key performance dimensions: work quality, deadline adherence, communication responsiveness, professionalism, and value for money. The structured approach ensures consistent evaluation across contractors while capturing project-specific context. Use the data to inform future hiring decisions, negotiate terms, and build a reliable contractor network.

B2B & Professional

Try the Form

Please provide honest feedback on contractor performance. Your input helps improve our vendor relationships.
Project Information
 
 
Work Quality
0/5
Poor Below Avg Average Good Excellent
Technical competence
Skills and expertise demonstrated
Attention to detail
Accuracy and thoroughness
Met requirements
Delivered what was specified
Quality standards
Met or exceeded standards
Documentation quality
Clarity of deliverable documentation
Timeline & Reliability
 
80%
80 %
0100
Unreliable
Very reliable
Communication & Professionalism
Poor Below Avg Average Good Excellent
Responsiveness
Timeliness of responses
Communication clarity
Clear and understandable
Proactive updates
Kept you informed without prompting
Issue handling
How problems were communicated
Professionalism
Conduct and attitude
 
Budget & Value
 
Poor value
Excellent value
Issues Encountered
 
Final Assessment
Not at all likely
Extremely likely
Evaluation Summary
❌ Contractor Evaluation: Contractor ═══════════════════════════════════
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
export function contractorFeedbackForm(form: FormTs) {
// Contractor Performance Evaluation - B2B Vendor Assessment
// Demonstrates: MatrixQuestion, StarRating, Slider, RatingScale, ThumbRating, conditional sections
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Contractor Performance Evaluation',
computedValue: () => 'Please provide honest feedback on contractor performance. Your input helps improve our vendor relationships.',
customStyles: {
backgroundColor: '#0891b2',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Project Context
// ============================================
const contextSection = form.addSubform('contextSection', {
title: 'Project Information'
});
 
contextSection.addRow(row => {
row.addTextbox('contractorName', {
label: 'Contractor/Vendor Name',
placeholder: 'Enter contractor or company name',
isRequired: true
}, '1fr');
 
row.addTextbox('projectName', {
label: 'Project Name',
placeholder: 'Enter project or engagement name',
isRequired: true
}, '1fr');
});
 
contextSection.addRow(row => {
row.addDropdown('projectType', {
label: 'Project Type',
options: [
{ id: 'development', name: 'Software Development' },
{ id: 'design', name: 'Design/Creative' },
{ id: 'consulting', name: 'Consulting/Advisory' },
{ id: 'construction', name: 'Construction/Renovation' },
{ id: 'marketing', name: 'Marketing/Content' },
{ id: 'maintenance', name: 'Maintenance/Support' },
{ id: 'other', name: 'Other' }
],
placeholder: 'Select project type'
}, '1fr');
 
row.addDropdown('engagementLength', {
label: 'Engagement Duration',
options: [
{ id: 'days', name: 'Less than a week' },
{ id: 'weeks', name: '1-4 weeks' },
{ id: 'months', name: '1-3 months' },
{ id: 'quarter', name: '3-6 months' },
{ id: 'long', name: '6+ months' }
],
placeholder: 'Select duration'
}, '1fr');
});
 
// ============================================
// SECTION 2: Quality Assessment
// ============================================
const qualitySection = form.addSubform('qualitySection', {
title: 'Work Quality'
});
 
qualitySection.addRow(row => {
row.addStarRating('overallQuality', {
label: 'Overall Quality of Work',
maxStars: 5,
size: 'lg',
alignment: 'center',
showConfettiOnMax: true
});
});
 
qualitySection.addRow(row => {
row.addMatrixQuestion('qualityMatrix', {
label: 'Please rate specific quality aspects:',
rows: [
{ id: 'technical', label: 'Technical competence', description: 'Skills and expertise demonstrated' },
{ id: 'attention', label: 'Attention to detail', description: 'Accuracy and thoroughness' },
{ id: 'requirements', label: 'Met requirements', description: 'Delivered what was specified' },
{ id: 'standards', label: 'Quality standards', description: 'Met or exceeded standards' },
{ id: 'documentation', label: 'Documentation quality', description: 'Clarity of deliverable documentation' }
],
columns: [
{ id: '1', label: 'Poor' },
{ id: '2', label: 'Below Avg' },
{ id: '3', label: 'Average' },
{ id: '4', label: 'Good' },
{ id: '5', label: 'Excellent' }
],
striped: true,
fullWidth: true
});
});
 
// ============================================
// SECTION 3: Timeline & Reliability
// ============================================
const timelineSection = form.addSubform('timelineSection', {
title: 'Timeline & Reliability'
});
 
timelineSection.addRow(row => {
row.addRadioButton('deliveredOnTime', {
label: 'Was the project delivered on time?',
options: [
{ id: 'early', name: 'Delivered early' },
{ id: 'on-time', name: 'Delivered on time' },
{ id: 'slightly-late', name: 'Slightly late (within acceptable margin)' },
{ id: 'late', name: 'Significantly late' },
{ id: 'very-late', name: 'Very late / missed deadlines' }
],
orientation: 'vertical'
});
});
 
timelineSection.addRow(row => {
row.addSlider('deadlinesMet', {
label: 'What percentage of intermediate milestones/deadlines were met?',
min: 0,
max: 100,
step: 10,
showValue: true,
unit: '%',
defaultValue: 80
});
});
 
timelineSection.addRow(row => {
row.addRatingScale('reliability', {
label: 'How reliable was the contractor overall?',
preset: 'likert-5',
lowLabel: 'Unreliable',
highLabel: 'Very reliable',
alignment: 'center'
});
});
 
// ============================================
// SECTION 4: Communication
// ============================================
const communicationSection = form.addSubform('communicationSection', {
title: 'Communication & Professionalism'
});
 
communicationSection.addRow(row => {
row.addMatrixQuestion('communicationMatrix', {
label: 'Rate communication and professionalism:',
rows: [
{ id: 'responsive', label: 'Responsiveness', description: 'Timeliness of responses' },
{ id: 'clarity', label: 'Communication clarity', description: 'Clear and understandable' },
{ id: 'proactive', label: 'Proactive updates', description: 'Kept you informed without prompting' },
{ id: 'issues', label: 'Issue handling', description: 'How problems were communicated' },
{ id: 'professional', label: 'Professionalism', description: 'Conduct and attitude' }
],
columns: [
{ id: '1', label: 'Poor' },
{ id: '2', label: 'Below Avg' },
{ id: '3', label: 'Average' },
{ id: '4', label: 'Good' },
{ id: '5', label: 'Excellent' }
],
striped: true,
fullWidth: true
});
});
 
communicationSection.addRow(row => {
row.addCheckboxList('communicationIssues', {
label: 'Were there any communication issues? (Select all that apply)',
options: [
{ id: 'none', name: 'No issues - communication was excellent' },
{ id: 'slow', name: 'Slow to respond' },
{ id: 'unclear', name: 'Unclear explanations' },
{ id: 'updates', name: 'Lacked proactive updates' },
{ id: 'language', name: 'Language/clarity barriers' },
{ id: 'availability', name: 'Hard to reach' },
{ id: 'defensive', name: 'Defensive about feedback' }
],
orientation: 'vertical'
});
});
 
// ============================================
// SECTION 5: Budget & Value
// ============================================
const budgetSection = form.addSubform('budgetSection', {
title: 'Budget & Value'
});
 
budgetSection.addRow(row => {
row.addRadioButton('budgetAdherence', {
label: 'How did the actual cost compare to the agreed budget?',
options: [
{ id: 'under', name: 'Under budget' },
{ id: 'on-budget', name: 'On budget' },
{ id: 'slightly-over', name: 'Slightly over (within acceptable margin)' },
{ id: 'over', name: 'Significantly over budget' }
],
orientation: 'vertical'
});
});
 
budgetSection.addRow(row => {
row.addRatingScale('valueForMoney', {
label: 'Rate the value for money received:',
preset: 'likert-5',
lowLabel: 'Poor value',
highLabel: 'Excellent value',
alignment: 'center'
});
});
 
budgetSection.addRow(row => {
row.addEmojiRating('costSurprises', {
label: 'Were there unexpected costs or scope changes?',
preset: 'custom',
emojis: [
{ id: 'many-bad', emoji: '😤', label: 'Many surprises' },
{ id: 'some-bad', emoji: '😕', label: 'Some issues' },
{ id: 'as-expected', emoji: '😐', label: 'As expected' },
{ id: 'well-managed', emoji: '🙂', label: 'Well managed' },
{ id: 'excellent', emoji: '😊', label: 'No surprises' }
],
size: 'lg',
alignment: 'center'
});
});
 
// ============================================
// SECTION 6: Issues & Problems
// ============================================
const issuesSection = form.addSubform('issuesSection', {
title: 'Issues Encountered',
isVisible: () => {
const quality = qualitySection.starRating('overallQuality')?.value();
return quality !== null && quality !== undefined && quality <= 3;
},
customStyles: {
backgroundColor: '#fef3c7',
padding: '16px',
borderRadius: '8px',
borderLeft: '4px solid #f59e0b'
}
});
 
issuesSection.addRow(row => {
row.addCheckboxList('issueTypes', {
label: 'What types of issues did you encounter?',
options: [
{ id: 'quality', name: 'Quality below expectations' },
{ id: 'deadline', name: 'Missed deadlines' },
{ id: 'scope', name: 'Scope creep / changes' },
{ id: 'communication', name: 'Communication breakdown' },
{ id: 'cost', name: 'Cost overruns' },
{ id: 'availability', name: 'Availability problems' },
{ id: 'rework', name: 'Excessive rework needed' },
{ id: 'attitude', name: 'Attitude/professionalism issues' }
],
orientation: 'vertical'
});
});
 
issuesSection.addSpacer();
 
issuesSection.addRow(row => {
row.addTextarea('issueDetails', {
label: 'Please describe the issues in more detail:',
placeholder: 'Provide specific examples...',
rows: 4,
autoExpand: true
});
});
 
// ============================================
// SECTION 7: Final Assessment
// ============================================
const finalSection = form.addSubform('finalSection', {
title: 'Final Assessment'
});
 
finalSection.addRow(row => {
row.addThumbRating('wouldRehire', {
label: 'Would you hire this contractor again?',
showLabels: true,
upLabel: 'Yes, definitely',
downLabel: 'No',
size: 'lg',
alignment: 'center'
});
});
 
finalSection.addRow(row => {
row.addRatingScale('recommendToOthers', {
label: 'How likely are you to recommend this contractor to colleagues?',
preset: 'nps',
showCategoryLabel: true,
showSegmentColors: true
});
});
 
finalSection.addSpacer();
 
finalSection.addRow(row => {
row.addTextarea('strengthsWeaknesses', {
label: 'What were the main strengths and weaknesses?',
placeholder: 'Summarize key positives and areas for improvement...',
rows: 4,
autoExpand: true
});
});
 
// ============================================
// SECTION 8: Summary
// ============================================
const summarySection = form.addSubform('summarySection', {
title: 'Evaluation Summary',
isVisible: () => {
const quality = qualitySection.starRating('overallQuality')?.value();
return quality !== null;
}
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const contractor = contextSection.textbox('contractorName')?.value() || 'Contractor';
const quality = qualitySection.starRating('overallQuality')?.value();
const onTime = timelineSection.radioButton('deliveredOnTime')?.value();
const reliability = timelineSection.ratingScale('reliability')?.value();
const value = budgetSection.ratingScale('valueForMoney')?.value();
const rehire = finalSection.thumbRating('wouldRehire')?.value();
const nps = finalSection.ratingScale('recommendToOthers')?.value();
 
const onTimeLabels: Record<string, string> = {
'early': 'Early',
'on-time': 'On Time',
'slightly-late': 'Slightly Late',
'late': 'Late',
'very-late': 'Very Late'
};
 
let emoji = (quality ?? 0) >= 4 ? '✅' : (quality ?? 0) >= 3 ? '⚠️' : '❌';
 
let summary = `${emoji} Contractor Evaluation: ${contractor}\n`;
summary += `${'═'.repeat(35)}\n\n`;
if (quality) summary += `⭐ Quality Rating: ${quality}/5 stars\n`;
if (onTime) summary += `⏰ Delivery: ${onTimeLabels[onTime] || onTime}\n`;
if (reliability) summary += `🎯 Reliability: ${reliability}/5\n`;
if (value) summary += `💰 Value for Money: ${value}/5\n`;
if (rehire) summary += `\n🔄 Would Rehire: ${rehire === 'up' ? 'Yes' : 'No'}`;
if (nps) summary += `\n📊 Recommend Score: ${nps}/10`;
 
return summary;
},
customStyles: () => {
const quality = qualitySection.starRating('overallQuality')?.value() ?? 0;
const baseStyles = {
padding: '16px',
borderRadius: '8px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (quality >= 4) {
return { ...baseStyles, backgroundColor: '#d1fae5', borderLeft: '4px solid #10b981' };
} else if (quality >= 3) {
return { ...baseStyles, backgroundColor: '#fef3c7', borderLeft: '4px solid #f59e0b' };
}
return { ...baseStyles, backgroundColor: '#fee2e2', borderLeft: '4px solid #ef4444' };
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Evaluation',
isVisible: () => qualitySection.starRating('overallQuality')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Evaluation Submitted',
message: 'Thank you for your detailed contractor feedback. Your input helps us build better vendor relationships and make informed hiring decisions.'
});
}
 

Frequently Asked Questions

When should I request contractor feedback?

Request feedback within 1-2 weeks of project completion while details are fresh. For long-term contractors, also collect quarterly feedback to catch issues early and recognize consistent performance.

Should I share feedback with the contractor?

Sharing constructive feedback builds stronger relationships. Focus on specific, actionable points. For sensitive issues, have a conversation rather than just sending the form results.

How do I handle feedback from multiple stakeholders?

Collect feedback from everyone who interacted with the contractor. Aggregate scores to identify patterns, and pay attention to consistent themes in open-ended responses across reviewers.

What metrics matter most for contractor decisions?

Priority depends on your needs, but quality and timeline adherence are typically most critical. Communication becomes important for ongoing relationships. Cost-effectiveness matters for repeat engagements.

Can I use this for internal teams or employees?

This form is optimized for external contractor relationships. For internal teams, consider the project-feedback or 360-feedback forms which are designed for employee context.