Referee & Official Feedback Form

Fair officiating is crucial for competitive sports. This comprehensive feedback form helps leagues, teams, and organizations evaluate referee performance across key dimensions: rule knowledge, fairness, consistency, communication, and game management. The form uses conditional logic to gather detailed feedback when issues are reported, while celebrating exceptional officiating. Perfect for improving officiating standards and maintaining competitive integrity.

Specialized

Try the Form

Help us maintain fair play standards. Your feedback improves officiating quality.
Match Details
 
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
export function refereeOfficiating(form: FormTs) {
// Referee & Official Feedback Form
// Demonstrates: MatrixQuestion, StarRating, RatingScale, EmojiRating, Dropdown, conditional flows
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Referee & Official Feedback',
computedValue: () => 'Help us maintain fair play standards. Your feedback improves officiating quality.',
customStyles: {
backgroundColor: '#1e3a5f',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Match Information
// ============================================
const matchInfo = form.addSubform('matchInfo', {
title: 'Match Details'
});
 
matchInfo.addRow(row => {
row.addDropdown('sportType', {
label: 'Sport',
options: [
{ id: 'soccer', name: 'Soccer/Football' },
{ id: 'basketball', name: 'Basketball' },
{ id: 'volleyball', name: 'Volleyball' },
{ id: 'hockey', name: 'Hockey' },
{ id: 'rugby', name: 'Rugby' },
{ id: 'tennis', name: 'Tennis' },
{ id: 'baseball', name: 'Baseball/Softball' },
{ id: 'handball', name: 'Handball' },
{ id: 'other', name: 'Other' }
],
placeholder: 'Select sport',
isRequired: true
}, '1fr');
row.addDropdown('competitionLevel', {
label: 'Competition Level',
options: [
{ id: 'recreational', name: 'Recreational/Friendly' },
{ id: 'youth', name: 'Youth League' },
{ id: 'amateur', name: 'Amateur/Club Level' },
{ id: 'semi-pro', name: 'Semi-Professional' },
{ id: 'professional', name: 'Professional' },
{ id: 'tournament', name: 'Tournament/Cup' }
],
placeholder: 'Select level',
isRequired: true
}, '1fr');
});
 
matchInfo.addRow(row => {
row.addDatepicker('matchDate', {
label: 'Match Date',
isRequired: true
}, '1fr');
row.addDropdown('yourRole', {
label: 'Your Role',
options: [
{ id: 'coach', name: 'Coach' },
{ id: 'manager', name: 'Team Manager' },
{ id: 'player', name: 'Player' },
{ id: 'spectator', name: 'Spectator' },
{ id: 'league-official', name: 'League Official' }
],
isRequired: true
}, '1fr');
});
 
// ============================================
// SECTION 2: Overall Experience
// ============================================
const overallSection = form.addSubform('overallSection', {
title: 'Overall Officiating Experience',
isVisible: () => matchInfo.dropdown('sportType')?.value() !== null && matchInfo.dropdown('sportType')?.value() !== undefined
});
 
overallSection.addRow(row => {
row.addEmojiRating('overallFeeling', {
label: 'How would you describe the overall officiating experience?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center'
});
});
 
overallSection.addRow(row => {
row.addRatingScale('satisfactionScore', {
preset: 'satisfaction',
label: 'Overall Satisfaction with Officiating',
alignment: 'center',
showSegmentColors: false,
isRequired: true
});
});
 
// ============================================
// SECTION 3: Officiating Aspects Matrix
// ============================================
const aspectsSection = form.addSubform('aspectsSection', {
title: 'Officiating Performance',
isVisible: () => overallSection.ratingScale('satisfactionScore')?.value() !== null && overallSection.ratingScale('satisfactionScore')?.value() !== undefined
});
 
aspectsSection.addRow(row => {
row.addMatrixQuestion('officiatingMatrix', {
label: 'Please rate the following aspects of officiating:',
rows: [
{ id: 'rules', label: 'Rules Knowledge', description: 'Understanding of game rules', isRequired: true },
{ id: 'consistency', label: 'Consistency', description: 'Same calls for both teams', isRequired: true },
{ id: 'fairness', label: 'Fairness & Impartiality', description: 'No bias toward either team', isRequired: true },
{ id: 'positioning', label: 'Positioning', description: 'Being in the right place to make calls', isRequired: true },
{ id: 'communication', label: 'Communication', description: 'Clear signals and explanations', isRequired: true },
{ id: 'game-control', label: 'Game Control', description: 'Managing tempo and player conduct', isRequired: true }
],
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 4: Key Ratings
// ============================================
const ratingsSection = form.addSubform('ratingsSection', {
title: 'Key Performance Indicators',
isVisible: () => aspectsSection.matrixQuestion('officiatingMatrix')?.areAllRequiredRowsAnswered() === true,
customStyles: { backgroundColor: '#f0f9ff', padding: '20px', borderRadius: '10px' }
});
 
ratingsSection.addRow(row => {
row.addStarRating('fairnessRating', {
label: 'Fairness',
maxStars: 5,
size: 'lg',
showCounter: true,
alignment: 'center'
}, '1fr');
row.addStarRating('professionalismRating', {
label: 'Professionalism',
maxStars: 5,
size: 'lg',
showCounter: true,
alignment: 'center'
}, '1fr');
row.addStarRating('timelinessRating', {
label: 'Punctuality & Preparation',
maxStars: 5,
size: 'lg',
showCounter: true,
alignment: 'center'
}, '1fr');
});
 
// ============================================
// SECTION 5: Issues Reported (for low satisfaction)
// ============================================
const issuesSection = form.addSubform('issuesSection', {
title: 'Issues Encountered',
isVisible: () => {
const satisfaction = overallSection.ratingScale('satisfactionScore')?.value();
return satisfaction !== null && satisfaction !== undefined && satisfaction <= 3;
},
customStyles: { backgroundColor: '#fef2f2', padding: '20px', borderRadius: '10px' }
});
 
issuesSection.addRow(row => {
row.addCheckboxList('reportedIssues', {
label: 'What issues did you observe? (Select all that apply)',
options: [
{ id: 'missed-calls', name: 'Missed obvious calls' },
{ id: 'wrong-calls', name: 'Incorrect calls' },
{ id: 'inconsistent', name: 'Inconsistent application of rules' },
{ id: 'bias', name: 'Perceived bias' },
{ id: 'poor-positioning', name: 'Poor positioning' },
{ id: 'lost-control', name: 'Lost control of the game' },
{ id: 'poor-communication', name: 'Poor communication' },
{ id: 'unprofessional', name: 'Unprofessional behavior' },
{ id: 'late-arrival', name: 'Late arrival or poor preparation' }
],
orientation: 'vertical'
});
});
 
issuesSection.addSpacer({ height: '15px' });
 
issuesSection.addRow(row => {
row.addTextarea('issueDetails', {
label: 'Please describe the specific incidents:',
placeholder: 'Provide details about what happened, approximate game time, and how it affected the match...',
rows: 4,
autoExpand: true,
isVisible: () => (issuesSection.checkboxList('reportedIssues')?.value()?.length ?? 0) > 0
});
});
 
// ============================================
// SECTION 6: Positive Feedback (for high satisfaction)
// ============================================
const praiseSection = form.addSubform('praiseSection', {
title: 'What Went Well',
isVisible: () => {
const satisfaction = overallSection.ratingScale('satisfactionScore')?.value();
return satisfaction !== null && satisfaction !== undefined && satisfaction >= 4;
},
customStyles: { backgroundColor: '#f0fdf4', padding: '20px', borderRadius: '10px' }
});
 
praiseSection.addRow(row => {
row.addCheckboxList('positiveAspects', {
label: 'What did the official(s) do particularly well?',
options: [
{ id: 'fair', name: 'Fair and impartial calls' },
{ id: 'consistent', name: 'Consistent throughout the match' },
{ id: 'communicated', name: 'Communicated decisions clearly' },
{ id: 'calm', name: 'Remained calm under pressure' },
{ id: 'respected', name: 'Treated players with respect' },
{ id: 'flow', name: 'Let the game flow well' },
{ id: 'difficult-calls', name: 'Made difficult calls correctly' },
{ id: 'professional', name: 'Highly professional demeanor' }
],
orientation: 'vertical'
});
});
 
praiseSection.addRow(row => {
row.addTextarea('praiseComments', {
label: 'Additional positive feedback:',
placeholder: 'Share specific examples of excellent officiating...',
rows: 3,
autoExpand: true,
isVisible: () => (praiseSection.checkboxList('positiveAspects')?.value()?.length ?? 0) > 0
});
});
 
// ============================================
// SECTION 7: Final Assessment
// ============================================
const finalSection = form.addSubform('finalSection', {
title: 'Final Assessment',
isVisible: () => {
const matrix = aspectsSection.matrixQuestion('officiatingMatrix');
return matrix?.areAllRequiredRowsAnswered() === true;
}
});
 
finalSection.addRow(row => {
row.addThumbRating('wouldRecommend', {
label: 'Would you recommend this official for future matches at this level?',
showLabels: true,
upLabel: 'Yes, recommend',
downLabel: 'Needs improvement',
size: 'lg',
alignment: 'center'
});
});
 
finalSection.addSpacer({ height: '10px' });
 
finalSection.addRow(row => {
row.addTextarea('additionalComments', {
label: () => {
const recommend = finalSection.thumbRating('wouldRecommend')?.value();
if (recommend === 'up') return 'Any final words of praise or suggestions?';
if (recommend === 'down') return 'What specific improvements would you suggest?';
return 'Additional comments (optional):';
},
placeholder: 'Share any additional observations...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 8: Optional Contact
// ============================================
const contactSection = form.addSubform('contactSection', {
title: 'Contact Information (Optional)',
isVisible: () => finalSection.thumbRating('wouldRecommend')?.value() !== null && finalSection.thumbRating('wouldRecommend')?.value() !== undefined
});
 
contactSection.addRow(row => {
row.addCheckbox('allowFollowUp', {
label: 'I am willing to be contacted for follow-up regarding this feedback'
});
});
 
contactSection.addRow(row => {
row.addEmail('contactEmail', {
label: 'Email address',
placeholder: 'your@email.com',
isVisible: () => contactSection.checkbox('allowFollowUp')?.value() === true,
isRequired: () => contactSection.checkbox('allowFollowUp')?.value() === true
});
});
 
// ============================================
// SECTION 9: Summary
// ============================================
const summarySection = form.addSubform('summarySection', {
title: 'Feedback Summary',
isVisible: () => finalSection.thumbRating('wouldRecommend')?.value() !== null && finalSection.thumbRating('wouldRecommend')?.value() !== undefined
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const sport = matchInfo.dropdown('sportType')?.value();
const level = matchInfo.dropdown('competitionLevel')?.value();
const feeling = overallSection.emojiRating('overallFeeling')?.value();
const satisfaction = overallSection.ratingScale('satisfactionScore')?.value();
const fairness = ratingsSection.starRating('fairnessRating')?.value();
const professionalism = ratingsSection.starRating('professionalismRating')?.value();
const recommend = finalSection.thumbRating('wouldRecommend')?.value();
 
if (!satisfaction) return '';
 
const sportLabels: Record<string, string> = {
'soccer': 'Soccer/Football', 'basketball': 'Basketball', 'volleyball': 'Volleyball',
'hockey': 'Hockey', 'rugby': 'Rugby', 'tennis': 'Tennis',
'baseball': 'Baseball/Softball', 'handball': 'Handball', 'other': 'Other'
};
 
const levelLabels: Record<string, string> = {
'recreational': 'Recreational', 'youth': 'Youth League', 'amateur': 'Amateur',
'semi-pro': 'Semi-Pro', 'professional': 'Professional', 'tournament': 'Tournament'
};
 
const feelingEmojis: Record<string, string> = {
'very-bad': '😡', 'bad': '😕', 'neutral': '😐', 'good': '🙂', 'excellent': '😍'
};
 
let emoji = satisfaction >= 4 ? '⚽' : satisfaction <= 2 ? '🚩' : '📋';
 
let summary = `${emoji} Officiating Feedback Summary\n`;
summary += `${'═'.repeat(30)}\n\n`;
if (sport) summary += `🏆 Sport: ${sportLabels[sport] || sport}\n`;
if (level) summary += `📊 Level: ${levelLabels[level] || level}\n`;
summary += `\n`;
summary += `📈 Satisfaction: ${satisfaction}/5\n`;
if (feeling) summary += `${feelingEmojis[feeling] || ''} Overall Feeling: ${feeling}\n`;
if (fairness) summary += `⚖️ Fairness: ${fairness}/5 stars\n`;
if (professionalism) summary += `👔 Professionalism: ${professionalism}/5 stars\n`;
summary += `\n${recommend === 'up' ? '✅ Recommended for future matches' : '⚠️ Needs improvement'}`;
 
return summary;
},
customStyles: () => {
const recommend = finalSection.thumbRating('wouldRecommend')?.value();
const baseStyles = {
padding: '20px',
borderRadius: '10px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (recommend === 'up') {
return { ...baseStyles, backgroundColor: '#d1fae5', borderLeft: '4px solid #059669' };
} else if (recommend === 'down') {
return { ...baseStyles, backgroundColor: '#fef3c7', borderLeft: '4px solid #f59e0b' };
}
return { ...baseStyles, backgroundColor: '#f1f5f9', borderLeft: '4px solid #64748b' };
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Feedback',
isVisible: () => finalSection.thumbRating('wouldRecommend')?.value() !== null && finalSection.thumbRating('wouldRecommend')?.value() !== undefined
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You for Your Feedback!',
message: 'Your input helps maintain high officiating standards and ensures fair play for everyone. We review all feedback to continuously improve the match experience.'
});
}
 

Frequently Asked Questions

Should referee feedback be anonymous?

Yes, anonymous feedback typically yields more honest responses. However, for serious complaints that require investigation, you may want an optional contact field. This form includes both anonymous submission and optional contact for follow-up.

How do we prevent biased feedback from losing teams?

Consider collecting feedback from both teams and looking for patterns across multiple submissions. Weight feedback from neutral observers higher. The matrix question helps identify specific issues vs. general dissatisfaction from a loss.

Can this form be used for different sports?

Absolutely! The core aspects (fairness, consistency, communication) apply universally. Customize the matrix rows and dropdown options to match sport-specific officiating criteria like penalty calls, offside decisions, or foul recognition.

How should we share feedback with referees?

Aggregate feedback anonymously and share trends, not individual comments. Focus on constructive patterns. Pair negative feedback with training opportunities. Recognize officials who consistently receive positive evaluations.

What's a good rating threshold for referee quality?

Aim for average ratings above 3.5/5 across matches. Investigate patterns of ratings below 3.0. Officials with consistently high ratings (4.5+) are candidates for advancement to higher-level competitions.