Beta Feature Feedback Form

The Beta Feature Feedback form helps product teams gather structured feedback from beta testers. It captures both quantitative ratings (usability, value, stability) and qualitative insights (bugs encountered, improvement suggestions, use cases). The multi-section design guides testers through comprehensive feedback while conditional logic keeps the survey focused and efficient.

Product Feedback

Try the Form

Rate your experience using this feature.
Ease of Use
Poor Fair Good Great
Intuitive to use*
Easy to learn*
Fast and responsive*
Visual design
Help/documentation
Very difficult
Very easy
 
 
Help us identify and fix problems.
Bug Report
Stability Assessment
0/5
 
 
Share your ideas for improvement.
Feature Improvements
Launch Readiness
 
Final Recommendation
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
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
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
export function betaFeedbackSurvey(form: FormTs) {
// Beta Feature Feedback - Comprehensive beta testing feedback form
// Demonstrates: Pages (multi-page), StarRating, MatrixQuestion, ThumbRating, RadioButton, SuggestionChips
 
// ============================================
// MULTI-PAGE WIZARD
// ============================================
const pages = form.addPages('betaPages', { heightMode: 'current-page' });
 
// ============================================
// PAGE 1: Feature Overview & First Impressions
// ============================================
const page1 = pages.addPage('overview');
 
page1.addRow(row => {
row.addTextPanel('header', {
label: 'Beta Feature Feedback',
computedValue: () => 'Help us improve this feature before launch. Your feedback shapes the final product.',
customStyles: {
background: 'linear-gradient(135deg, #7c3aed 0%, #8b5cf6 100%)',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
const overviewSection = page1.addSubform('overviewSection', {
title: 'Feature Overview'
});
 
overviewSection.addRow(row => {
row.addDropdown('featureName', {
label: 'Which beta feature are you reviewing?',
options: [
{ id: 'dashboard-v2', name: 'New Dashboard (v2)' },
{ id: 'ai-suggestions', name: 'AI-Powered Suggestions' },
{ id: 'collaboration', name: 'Real-time Collaboration' },
{ id: 'export-wizard', name: 'Export Wizard' },
{ id: 'mobile-app', name: 'Mobile App Beta' },
{ id: 'other', name: 'Other Feature' }
],
placeholder: 'Select feature...',
isRequired: true
}, '1fr');
 
row.addDropdown('usageDuration', {
label: 'How long have you been using it?',
options: [
{ id: 'first-use', name: 'This is my first time' },
{ id: 'few-days', name: 'A few days' },
{ id: 'one-week', name: 'About a week' },
{ id: 'two-weeks', name: '2+ weeks' },
{ id: 'month', name: 'A month or more' }
],
placeholder: 'Select duration...',
isRequired: true
}, '1fr');
});
 
// Custom feature name if "Other"
overviewSection.addRow(row => {
row.addTextbox('otherFeature', {
label: 'Feature name',
placeholder: 'Enter the feature name...',
isRequired: true,
isVisible: () => overviewSection.dropdown('featureName')?.value() === 'other'
});
});
 
overviewSection.addSpacer();
 
const impressionSection = page1.addSubform('impressionSection', {
title: 'First Impressions'
});
 
impressionSection.addRow(row => {
row.addEmojiRating('firstImpression', {
label: 'What was your first impression of this feature?',
preset: 'satisfaction',
size: 'lg',
showLabels: true,
alignment: 'center'
});
});
 
impressionSection.addRow(row => {
row.addThumbRating('meetsExpectations', {
label: 'Does this feature meet your expectations?',
showLabels: true,
upLabel: 'Yes, meets or exceeds',
downLabel: 'Falls short',
size: 'lg',
alignment: 'center'
});
});
 
// Page 1 navigation
page1.addSpacer();
 
page1.addRow(row => {
row.addButton('nextToPage2', {
label: 'Continue to Usability →',
onClick: () => pages.goToPage('usability')
});
});
 
// ============================================
// PAGE 2: Usability & Experience
// ============================================
const page2 = pages.addPage('usability');
 
page2.addRow(row => {
row.addTextPanel('page2Header', {
label: 'Usability Assessment',
computedValue: () => 'Rate your experience using this feature.',
customStyles: {
backgroundColor: '#f3e8ff',
color: '#6b21a8',
padding: '16px',
borderRadius: '8px',
textAlign: 'center'
}
});
});
 
const usabilitySection = page2.addSubform('usabilitySection', {
title: 'Ease of Use'
});
 
usabilitySection.addRow(row => {
row.addMatrixQuestion('usabilityMatrix', {
label: 'Rate the following aspects:',
rows: [
{ id: 'intuitive', label: 'Intuitive to use', isRequired: true },
{ id: 'learn', label: 'Easy to learn', isRequired: true },
{ id: 'fast', label: 'Fast and responsive', isRequired: true },
{ id: 'design', label: 'Visual design', isRequired: false },
{ id: 'help', label: 'Help/documentation', isRequired: false }
],
columns: [
{ id: 'poor', label: 'Poor' },
{ id: 'fair', label: 'Fair' },
{ id: 'good', label: 'Good' },
{ id: 'great', label: 'Great' }
],
striped: true,
fullWidth: true
});
});
 
usabilitySection.addSpacer();
 
usabilitySection.addRow(row => {
row.addRatingScale('overallUsability', {
label: 'Overall, how easy is this feature to use?',
preset: 'ces',
lowLabel: 'Very difficult',
highLabel: 'Very easy',
alignment: 'center'
});
});
 
// Page 2 navigation
page2.addSpacer();
 
page2.addRow(row => {
row.addButton('backToPage1', {
label: '← Back',
onClick: () => pages.goToPage('overview')
}, '1fr');
 
row.addButton('nextToPage3', {
label: 'Continue to Issues →',
onClick: () => pages.goToPage('issues')
}, '1fr');
});
 
// ============================================
// PAGE 3: Bugs & Issues
// ============================================
const page3 = pages.addPage('issues');
 
page3.addRow(row => {
row.addTextPanel('page3Header', {
label: 'Issues & Bugs',
computedValue: () => 'Help us identify and fix problems.',
customStyles: {
backgroundColor: '#fef3c7',
color: '#92400e',
padding: '16px',
borderRadius: '8px',
textAlign: 'center'
}
});
});
 
const issuesSection = page3.addSubform('issuesSection', {
title: 'Bug Report'
});
 
issuesSection.addRow(row => {
row.addThumbRating('encounteredBugs', {
label: 'Did you encounter any bugs or issues?',
showLabels: true,
upLabel: 'Yes, I found issues',
downLabel: 'No issues found',
size: 'lg',
alignment: 'center'
});
});
 
// Conditional bug details
const bugDetailsSection = page3.addSubform('bugDetailsSection', {
title: 'Bug Details',
isVisible: () => issuesSection.thumbRating('encounteredBugs')?.value() === 'up'
});
 
bugDetailsSection.addRow(row => {
row.addRadioButton('bugSeverity', {
label: 'How severe was the most significant issue?',
options: [
{ id: 'critical', name: 'Critical - Feature unusable / data loss' },
{ id: 'major', name: 'Major - Significant functionality broken' },
{ id: 'minor', name: 'Minor - Inconvenient but workable' },
{ id: 'cosmetic', name: 'Cosmetic - Visual issues only' }
],
orientation: 'vertical',
isRequired: true
});
});
 
bugDetailsSection.addRow(row => {
row.addCheckboxList('bugTypes', {
label: 'What types of issues did you experience?',
options: [
{ id: 'crash', name: 'Crashes or freezes' },
{ id: 'error', name: 'Error messages' },
{ id: 'slow', name: 'Slow performance' },
{ id: 'data', name: 'Data not saving correctly' },
{ id: 'ui', name: 'UI/display problems' },
{ id: 'navigation', name: 'Navigation issues' },
{ id: 'integration', name: 'Integration problems' },
{ id: 'other', name: 'Other issues' }
],
orientation: 'vertical'
});
});
 
bugDetailsSection.addSpacer();
 
bugDetailsSection.addRow(row => {
row.addTextarea('bugDescription', {
label: 'Describe the issue(s) you encountered',
placeholder: 'What happened? Steps to reproduce? What did you expect?',
rows: 4,
autoExpand: true,
isRequired: true
});
});
 
// Stability rating
const stabilitySection = page3.addSubform('stabilitySection', {
title: 'Stability Assessment'
});
 
stabilitySection.addRow(row => {
row.addStarRating('stabilityRating', {
label: 'How stable is this feature?',
maxStars: 5,
size: 'lg',
alignment: 'center'
});
});
 
// Page 3 navigation
page3.addSpacer();
 
page3.addRow(row => {
row.addButton('backToPage2', {
label: '← Back',
onClick: () => pages.goToPage('usability')
}, '1fr');
 
row.addButton('nextToPage4', {
label: 'Continue to Suggestions →',
onClick: () => pages.goToPage('suggestions')
}, '1fr');
});
 
// ============================================
// PAGE 4: Suggestions & Final Thoughts
// ============================================
const page4 = pages.addPage('suggestions');
 
page4.addRow(row => {
row.addTextPanel('page4Header', {
label: 'Suggestions & Final Thoughts',
computedValue: () => 'Share your ideas for improvement.',
customStyles: {
backgroundColor: '#d1fae5',
color: '#065f46',
padding: '16px',
borderRadius: '8px',
textAlign: 'center'
}
});
});
 
const suggestionsSection = page4.addSubform('suggestionsSection', {
title: 'Feature Improvements'
});
 
suggestionsSection.addRow(row => {
row.addSuggestionChips('improvementAreas', {
label: 'What areas need the most improvement?',
suggestions: [
{ id: 'speed', name: 'Performance/Speed' },
{ id: 'ui', name: 'User Interface' },
{ id: 'features', name: 'More Features' },
{ id: 'simpler', name: 'Simplify It' },
{ id: 'docs', name: 'Documentation' },
{ id: 'integration', name: 'Integrations' }
],
max: 3,
alignment: 'left'
});
});
 
suggestionsSection.addSpacer();
 
suggestionsSection.addRow(row => {
row.addTextarea('improvementIdeas', {
label: 'What specific improvements would you suggest?',
placeholder: 'Share your ideas for making this feature better...',
rows: 3,
autoExpand: true
});
});
 
suggestionsSection.addRow(row => {
row.addTextarea('missingFeatures', {
label: 'What features are missing that you expected?',
placeholder: 'What did you expect to find that wasn\'t there?',
rows: 2,
autoExpand: true
});
});
 
// Launch readiness
const readinessSection = page4.addSubform('readinessSection', {
title: 'Launch Readiness'
});
 
readinessSection.addRow(row => {
row.addRadioButton('launchReady', {
label: 'Is this feature ready for general availability?',
options: [
{ id: 'yes', name: 'Yes, ready to launch' },
{ id: 'almost', name: 'Almost, minor fixes needed' },
{ id: 'no-major', name: 'No, needs significant work' },
{ id: 'no-redesign', name: 'No, needs fundamental redesign' }
],
orientation: 'vertical'
});
});
 
readinessSection.addRow(row => {
row.addTextarea('launchBlockers', {
label: 'What must be fixed before launch?',
placeholder: 'List the critical issues that would block release...',
rows: 2,
isVisible: () => {
const ready = readinessSection.radioButton('launchReady')?.value();
return ready === 'no-major' || ready === 'no-redesign';
}
});
});
 
// Final recommendation
const finalSection = page4.addSubform('finalSection', {
title: 'Final Recommendation'
});
 
finalSection.addRow(row => {
row.addRatingScale('recommendFeature', {
label: 'How likely are you to recommend this feature to others?',
preset: 'nps',
showCategoryLabel: true,
showSegmentColors: true,
alignment: 'center'
});
});
 
finalSection.addSpacer();
 
finalSection.addRow(row => {
row.addTextarea('finalComments', {
label: 'Any final comments for the product team?',
placeholder: 'Thank you for being a beta tester! Share any last thoughts...',
rows: 2,
autoExpand: true
});
});
 
// Summary
const summarySection = page4.addSubform('summarySection', {
title: 'Feedback Summary',
isVisible: () => {
const impression = page1.field('overviewSection')?.value();
const usability = page2.field('usabilitySection')?.value();
return impression !== undefined || usability !== undefined;
}
});
 
summarySection.addRow(row => {
row.addTextPanel('summary', {
computedValue: () => {
const feature = overviewSection.dropdown('featureName')?.value() || 'Feature';
const impression = impressionSection.emojiRating('firstImpression')?.value();
const meetsExpect = impressionSection.thumbRating('meetsExpectations')?.value();
const usability = usabilitySection.ratingScale('overallUsability')?.value() ?? 0;
const hasBugs = issuesSection.thumbRating('encounteredBugs')?.value();
const stability = stabilitySection.starRating('stabilityRating')?.value() ?? 0;
const launchReady = readinessSection.radioButton('launchReady')?.value();
const nps = finalSection.ratingScale('recommendFeature')?.value() ?? 0;
 
const impressionLabels: Record<string, string> = {
'very-bad': 'Very Negative', 'bad': 'Negative', 'neutral': 'Neutral',
'good': 'Positive', 'excellent': 'Very Positive'
};
 
const readinessLabels: Record<string, string> = {
'yes': 'Ready', 'almost': 'Almost Ready',
'no-major': 'Needs Work', 'no-redesign': 'Needs Redesign'
};
 
let summary = `Beta Feedback: ${feature}\n`;
summary += '═'.repeat(30) + '\n\n';
summary += `First Impression: ${impressionLabels[impression || ''] || 'Not rated'}\n`;
summary += `Meets Expectations: ${meetsExpect === 'up' ? 'Yes' : meetsExpect === 'down' ? 'No' : 'Not answered'}\n`;
summary += `Usability (1-7): ${usability > 0 ? usability : 'Not rated'}\n`;
summary += `Stability: ${stability > 0 ? '★'.repeat(stability) + '☆'.repeat(5 - stability) : 'Not rated'}\n`;
summary += `Bugs Found: ${hasBugs === 'up' ? 'Yes' : 'No'}\n`;
summary += `Launch Ready: ${readinessLabels[launchReady || ''] || 'Not answered'}\n`;
summary += `NPS Score: ${nps > 0 ? nps : 'Not rated'}\n`;
 
return summary;
},
customStyles: {
backgroundColor: '#f3e8ff',
padding: '16px',
borderRadius: '8px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '13px',
borderLeft: '4px solid #8b5cf6'
}
});
});
 
// Page 4 navigation
page4.addSpacer();
 
page4.addRow(row => {
row.addButton('backToPage3', {
label: '← Back to Issues',
onClick: () => pages.goToPage('issues')
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit Beta Feedback',
isVisible: () => pages.currentPageIndex() === 3
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank you, Beta Tester!',
message: 'Your feedback is invaluable in shaping this feature before launch. The product team will review your input and may follow up with additional questions. Watch for updates in your beta tester portal!'
});
}
 

Frequently Asked Questions

When should we send beta feedback surveys?

Send after testers have had meaningful exposure to the feature (typically 1-2 weeks of active use). Avoid sending too early (superficial feedback) or too late (feedback fatigue). Consider triggered surveys after specific interactions.

How do we handle bug reports in beta feedback?

The form captures bug severity and description, but integrate with your bug tracking system. Use the feedback to identify patterns. High-severity bugs should trigger immediate follow-up. Track resolution and communicate back to testers.

What's a good beta feedback response rate?

Active beta programs see 40-60% response rates. Incentivize participation with early access, recognition, or rewards. Keep surveys short (5-7 minutes). Close the feedback loop - testers respond more when they see their input matters.

How many beta testers do we need?

It depends on feature scope. Small features: 20-50 testers. Major features: 100-200 testers. Enterprise features: 10-20 key accounts. Focus on diverse use cases rather than pure numbers. Quality feedback beats quantity.

Should beta surveys be anonymous?

No - identify testers to follow up on bugs and ideas. Beta testers expect communication. However, make participation feel safe by explaining how feedback is used. Never penalize honest criticism.

What do we do with feature requests from beta?

Categorize requests: fix-before-launch, add-to-roadmap, won't-do. Share the categorization with testers. Some requests reveal GA-blocking issues. Others inform future iterations. Track request themes across testers.