Public Library Services Feedback

This public library feedback form helps libraries understand patron satisfaction across multiple dimensions. Collect ratings on book collections, digital resources, staff assistance, study spaces, and programs. The form uses smart conditional logic to gather detailed feedback on areas that need attention while celebrating what patrons love most.

Specialized

Try the Form

Help us serve you better! Your feedback shapes the future of our library.
About Your Visit
 
 
Rate Our Services & Resources
Poor Fair Good Very Good Excellent N/A
Book collection variety and availability*
Digital resources (e-books, databases)
Staff helpfulness and knowledge*
Computer and internet access
Study and reading areas
Facility cleanliness
Operating hours
Overall Experience
Not at all likely
Extremely likely
 
Library Programs
 
 
Additional Comments
Stay Connected (Optional)
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
405
406
407
408
409
410
411
412
413
414
export function libraryPublicFeedback(form: FormTs) {
// Public Library Services Feedback Form
// Demonstrates: MatrixQuestion, StarRating, EmojiRating, SuggestionChips, RadioButton, conditional visibility, dynamic styling
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Library Patron Feedback',
computedValue: () => 'Help us serve you better! Your feedback shapes the future of our library.',
customStyles: {
background: 'linear-gradient(135deg, #0d9488 0%, #14b8a6 100%)',
color: 'white',
padding: '28px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: Visit Information
// ============================================
const visitSection = form.addSubform('visitSection', {
title: 'About Your Visit',
customStyles: { backgroundColor: '#f0fdfa', padding: '16px', borderRadius: '8px' }
});
 
visitSection.addRow(row => {
row.addRadioButton('visitFrequency', {
label: 'How often do you visit our library?',
options: [
{ id: 'first', name: 'This is my first visit' },
{ id: 'rarely', name: 'A few times a year' },
{ id: 'monthly', name: 'Monthly' },
{ id: 'weekly', name: 'Weekly' },
{ id: 'daily', name: 'Almost daily' }
],
orientation: 'vertical',
isRequired: true
}, '1fr');
row.addCheckboxList('visitPurpose', {
label: 'What brought you to the library today?',
options: [
{ id: 'borrow', name: 'Borrow books/media' },
{ id: 'study', name: 'Study or work' },
{ id: 'internet', name: 'Use computers/internet' },
{ id: 'research', name: 'Research assistance' },
{ id: 'programs', name: 'Attend a program/event' },
{ id: 'children', name: "Children's activities" },
{ id: 'meeting', name: 'Meeting room use' },
{ id: 'browse', name: 'Browse and relax' }
],
orientation: 'vertical'
}, '1fr');
});
 
// ============================================
// SECTION 2: Services & Resources Rating
// ============================================
const servicesSection = form.addSubform('servicesSection', {
title: 'Rate Our Services & Resources',
customStyles: { backgroundColor: '#f8fafc', padding: '16px', borderRadius: '8px' }
});
 
servicesSection.addRow(row => {
row.addMatrixQuestion('servicesMatrix', {
label: 'Please rate your satisfaction with the following:',
rows: [
{ id: 'book-collection', label: 'Book collection variety and availability', isRequired: true },
{ id: 'digital', label: 'Digital resources (e-books, databases)' },
{ id: 'staff', label: 'Staff helpfulness and knowledge', isRequired: true },
{ id: 'computers', label: 'Computer and internet access' },
{ id: 'study-spaces', label: 'Study and reading areas' },
{ id: 'cleanliness', label: 'Facility cleanliness' },
{ id: 'hours', label: 'Operating hours' }
],
columns: [
{ id: '1', label: 'Poor' },
{ id: '2', label: 'Fair' },
{ id: '3', label: 'Good' },
{ id: '4', label: 'Very Good' },
{ id: '5', label: 'Excellent' },
{ id: 'na', label: 'N/A' }
],
striped: true,
fullWidth: true
});
});
 
// ============================================
// SECTION 3: Staff Interaction
// ============================================
const staffSection = form.addSubform('staffSection', {
title: 'Staff Interaction',
isVisible: () => {
const purposes = visitSection.checkboxList('visitPurpose')?.value() || [];
return purposes.includes('research') || purposes.includes('borrow');
},
customStyles: { backgroundColor: '#eff6ff', padding: '16px', borderRadius: '8px' }
});
 
staffSection.addRow(row => {
row.addStarRating('staffRating', {
label: 'How would you rate the staff assistance you received?',
maxStars: 5,
size: 'lg',
alignment: 'center',
showConfettiOnMax: true
});
});
 
staffSection.addRow(row => {
row.addThumbRating('staffRecommend', {
label: 'Would you recommend our library based on staff service?',
showLabels: true,
upLabel: 'Absolutely!',
downLabel: 'Needs improvement',
alignment: 'center',
size: 'lg'
});
});
 
// ============================================
// SECTION 4: Overall Experience
// ============================================
const experienceSection = form.addSubform('experienceSection', {
title: 'Overall Experience'
});
 
experienceSection.addRow(row => {
row.addEmojiRating('overallMood', {
label: 'How would you describe your library visit today?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center'
});
});
 
experienceSection.addSpacer({ height: '16px' });
 
experienceSection.addRow(row => {
row.addRatingScale('npsScore', {
preset: 'nps',
label: 'How likely are you to recommend our library to friends and family?',
showCategoryLabel: true,
showSegmentColors: true,
showConfettiOnPromoter: true,
isRequired: true
});
});
 
// ============================================
// SECTION 5: What We Do Well (Promoters)
// ============================================
const strengthsSection = form.addSubform('strengthsSection', {
title: 'What Do You Love About Our Library?',
isVisible: () => {
const score = experienceSection.ratingScale('npsScore')?.value();
return score !== null && score !== undefined && score >= 7;
},
customStyles: { backgroundColor: '#dcfce7', padding: '16px', borderRadius: '8px' }
});
 
strengthsSection.addRow(row => {
row.addSuggestionChips('strengths', {
label: 'Select what you appreciate most (up to 4)',
suggestions: [
{ id: 'collection', name: 'Great book selection' },
{ id: 'staff', name: 'Friendly staff' },
{ id: 'quiet', name: 'Quiet atmosphere' },
{ id: 'programs', name: 'Interesting programs' },
{ id: 'location', name: 'Convenient location' },
{ id: 'hours', name: 'Good hours' },
{ id: 'technology', name: 'Modern technology' },
{ id: 'kids-area', name: "Children's area" },
{ id: 'free-wifi', name: 'Free Wi-Fi' }
],
max: 4,
alignment: 'center'
});
});
 
// ============================================
// SECTION 6: Improvement Areas (Detractors/Passives)
// ============================================
const improvementSection = form.addSubform('improvementSection', {
title: 'How Can We Improve?',
isVisible: () => {
const score = experienceSection.ratingScale('npsScore')?.value();
return score !== null && score !== undefined && score <= 6;
},
customStyles: { backgroundColor: '#fef3c7', padding: '16px', borderRadius: '8px' }
});
 
improvementSection.addRow(row => {
row.addCheckboxList('improvements', {
label: 'What areas need the most improvement?',
options: [
{ id: 'more-books', name: 'More book variety' },
{ id: 'newer-books', name: 'More recent publications' },
{ id: 'more-computers', name: 'More computers available' },
{ id: 'longer-hours', name: 'Extended operating hours' },
{ id: 'more-seating', name: 'More seating/study space' },
{ id: 'quieter', name: 'Quieter environment' },
{ id: 'parking', name: 'Better parking' },
{ id: 'accessibility', name: 'Improved accessibility' },
{ id: 'programs', name: 'More programs/events' }
],
orientation: 'vertical'
});
});
 
improvementSection.addSpacer({ height: '12px' });
 
improvementSection.addRow(row => {
row.addTextarea('improvementDetails', {
label: 'Please share specific suggestions for improvement',
placeholder: 'Your ideas help us serve the community better...',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 7: Programs Interest
// ============================================
const programsSection = form.addSubform('programsSection', {
title: 'Library Programs'
});
 
programsSection.addRow(row => {
row.addCheckboxList('programInterests', {
label: 'What types of programs would you like to see?',
options: [
{ id: 'book-clubs', name: 'Book clubs' },
{ id: 'author-talks', name: 'Author talks' },
{ id: 'tech-classes', name: 'Technology classes' },
{ id: 'kids-storytime', name: "Children's story time" },
{ id: 'teen-programs', name: 'Teen programs' },
{ id: 'senior-activities', name: 'Senior activities' },
{ id: 'job-help', name: 'Job search assistance' },
{ id: 'language', name: 'Language learning' }
],
orientation: 'vertical'
}, '1fr');
row.addRadioButton('programTime', {
label: 'When would you prefer programs?',
options: [
{ id: 'weekday-morning', name: 'Weekday mornings' },
{ id: 'weekday-afternoon', name: 'Weekday afternoons' },
{ id: 'weekday-evening', name: 'Weekday evenings' },
{ id: 'weekend', name: 'Weekends' },
{ id: 'any', name: 'Any time works' }
],
orientation: 'vertical'
}, '1fr');
});
 
// ============================================
// SECTION 8: Additional Comments
// ============================================
const commentsSection = form.addSubform('commentsSection', {
title: 'Additional Comments'
});
 
commentsSection.addRow(row => {
row.addTextarea('additionalComments', {
label: 'Is there anything else you would like to share with us?',
placeholder: 'Tell us about a great experience, suggest a book, or share any thoughts...',
rows: 4,
autoExpand: true
});
});
 
// ============================================
// SECTION 9: Contact (Optional)
// ============================================
const contactSection = form.addSubform('contactSection', {
title: 'Stay Connected (Optional)'
});
 
contactSection.addRow(row => {
row.addCheckbox('wantsContact', {
label: 'I would like to be contacted about my feedback'
});
});
 
contactSection.addRow(row => {
row.addTextbox('contactName', {
label: 'Name',
placeholder: 'Your name',
isVisible: () => contactSection.checkbox('wantsContact')?.value() === true
}, '1fr');
row.addEmail('contactEmail', {
label: 'Email',
placeholder: 'your@email.com',
isRequired: () => contactSection.checkbox('wantsContact')?.value() === true,
isVisible: () => contactSection.checkbox('wantsContact')?.value() === true
}, '1fr');
});
 
contactSection.addRow(row => {
row.addCheckbox('libraryCard', {
label: 'I am interested in getting a library card',
isVisible: () => visitSection.radioButton('visitFrequency')?.value() === 'first'
});
});
 
// ============================================
// SECTION 10: Summary
// ============================================
const summarySection = form.addSubform('summary', {
title: 'Feedback Summary',
isVisible: () => experienceSection.ratingScale('npsScore')?.value() !== null
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const npsScore = experienceSection.ratingScale('npsScore')?.value();
const npsCategory = experienceSection.ratingScale('npsScore')?.npsCategory();
const mood = experienceSection.emojiRating('overallMood')?.value();
const frequency = visitSection.radioButton('visitFrequency')?.value();
const purposes = visitSection.checkboxList('visitPurpose')?.value() || [];
const strengths = strengthsSection.suggestionChips('strengths')?.value() || [];
const improvements = improvementSection.checkboxList('improvements')?.value() || [];
 
if (npsScore === null || npsScore === undefined) return '';
 
let emoji = '';
if (npsCategory === 'promoter') emoji = '📚';
else if (npsCategory === 'passive') emoji = '📖';
else emoji = '📝';
 
let summary = `${emoji} Library Feedback Summary\n`;
summary += `${'═'.repeat(28)}\n\n`;
summary += `📊 NPS Score: ${npsScore}/10 (${npsCategory?.charAt(0).toUpperCase()}${npsCategory?.slice(1)})\n`;
 
if (mood) {
const moodLabels: Record<string, string> = {
'very-bad': '😢 Poor experience',
'bad': '😕 Could be better',
'neutral': '😐 Okay visit',
'good': '😊 Good experience',
'excellent': '😍 Excellent visit!'
};
summary += `${moodLabels[mood] || mood}\n`;
}
 
const frequencyLabels: Record<string, string> = {
'first': 'First-time visitor',
'rarely': 'Occasional visitor',
'monthly': 'Monthly visitor',
'weekly': 'Weekly visitor',
'daily': 'Daily visitor'
};
if (frequency) {
summary += `\n👤 ${frequencyLabels[frequency] || frequency}`;
}
 
if (purposes.length > 0) {
summary += `\n📌 Visit purposes: ${purposes.length} selected`;
}
 
if (strengths.length > 0) {
summary += `\n✨ Appreciated: ${strengths.length} aspects`;
}
 
if (improvements.length > 0) {
summary += `\n⚡ To improve: ${improvements.length} areas`;
}
 
return summary;
},
customStyles: () => {
const category = experienceSection.ratingScale('npsScore')?.npsCategory();
const baseStyles = {
padding: '16px',
borderRadius: '8px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (category === 'promoter') {
return { ...baseStyles, backgroundColor: '#d1fae5', borderLeft: '4px solid #14b8a6' };
} else if (category === 'passive') {
return { ...baseStyles, backgroundColor: '#fef3c7', borderLeft: '4px solid #f59e0b' };
} else if (category === 'detractor') {
return { ...baseStyles, backgroundColor: '#fee2e2', borderLeft: '4px solid #ef4444' };
}
return baseStyles;
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Feedback',
isVisible: () => experienceSection.ratingScale('npsScore')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You for Your Feedback!',
message: 'Your input helps us make our library a better place for everyone in our community. We appreciate you taking the time to share your thoughts!'
});
}
 

Frequently Asked Questions

What aspects of library services does this form cover?

The form covers book and media collections, digital resources (e-books, databases), staff helpfulness, study and meeting spaces, library programs and events, accessibility, and overall facility cleanliness. Each area can be rated and commented on.

Can I add questions about specific library programs?

Yes! The form is fully customizable. You can add questions about children's story time, book clubs, computer classes, or any programs your library offers. Just open the editor and add new sections.

Is this form suitable for academic libraries?

While designed for public libraries, this template works well for academic libraries too. You may want to add questions about research assistance, interlibrary loans, and quiet study areas specific to academic settings.

How can I track feedback over time?

FormTs stores all responses with timestamps. You can export data periodically to track trends in patron satisfaction. Consider running the survey quarterly to monitor improvement efforts.

Can patrons submit feedback anonymously?

Yes, the form is anonymous by default. Contact information is optional and only requested if the patron wants follow-up. This encourages honest feedback.