Sean Ellis PMF Test

The Sean Ellis Test is the gold standard for measuring product-market fit. Named after the growth hacker who pioneered it, this survey asks users a simple but powerful question: 'How would you feel if you could no longer use [product]?' If 40% or more say 'Very disappointed,' you've achieved product-market fit. This template includes the core PMF question, user segmentation, and detailed follow-up questions to understand what makes your product valuable.

Product FeedbackPopular

Try the Form

Help us understand how valuable our product is to you.
About Your Usage
 
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
export function seanEllisTestSurvey(form: FormTs) {
// Sean Ellis PMF Test - The iconic Product-Market Fit survey
// Demonstrates: RadioButton, EmojiRating, StarRating, MatrixQuestion, Textarea, dynamic styling, computed values
 
// ============================================
// HEADER
// ============================================
form.addRow(row => {
row.addTextPanel('header', {
label: 'Product-Market Fit Survey',
computedValue: () => 'Help us understand how valuable our product is to you.',
customStyles: {
backgroundColor: '#7c3aed',
color: 'white',
padding: '24px',
borderRadius: '12px',
textAlign: 'center'
}
});
});
 
// ============================================
// SECTION 1: User Context
// ============================================
const contextSection = form.addSubform('context', {
title: 'About Your Usage'
});
 
contextSection.addRow(row => {
row.addRadioButton('usageFrequency', {
label: 'How often do you use our product?',
options: [
{ id: 'daily', name: 'Daily' },
{ id: 'weekly', name: 'Several times a week' },
{ id: 'monthly', name: 'A few times a month' },
{ id: 'rarely', name: 'Less than once a month' }
],
orientation: 'vertical',
isRequired: true
});
});
 
contextSection.addRow(row => {
row.addDropdown('userRole', {
label: 'What best describes your role?',
placeholder: 'Select your role...',
options: [
{ id: 'founder', name: 'Founder / CEO' },
{ id: 'product', name: 'Product Manager' },
{ id: 'developer', name: 'Developer / Engineer' },
{ id: 'designer', name: 'Designer' },
{ id: 'marketer', name: 'Marketing / Growth' },
{ id: 'sales', name: 'Sales' },
{ id: 'support', name: 'Customer Support' },
{ id: 'other', name: 'Other' }
],
isRequired: true
});
});
 
// ============================================
// SECTION 2: The Sean Ellis Question (Core PMF)
// ============================================
const pmfSection = form.addSubform('pmfSection', {
title: 'The Key Question',
isVisible: () => contextSection.radioButton('usageFrequency')?.value() !== null,
customStyles: () => {
const answer = pmfSection.radioButton('disappointment')?.value();
if (answer === 'very') return { backgroundColor: '#d1fae5', padding: '20px', borderRadius: '12px', border: '2px solid #10b981' };
if (answer === 'somewhat') return { backgroundColor: '#fef3c7', padding: '20px', borderRadius: '12px', border: '2px solid #f59e0b' };
if (answer === 'not') return { backgroundColor: '#fee2e2', padding: '20px', borderRadius: '12px', border: '2px solid #ef4444' };
return { backgroundColor: '#f8fafc', padding: '20px', borderRadius: '12px', border: '2px dashed #cbd5e1' };
}
});
 
pmfSection.addRow(row => {
row.addRadioButton('disappointment', {
label: 'How would you feel if you could no longer use our product?',
options: [
{ id: 'very', name: 'Very disappointed' },
{ id: 'somewhat', name: 'Somewhat disappointed' },
{ id: 'not', name: 'Not disappointed' }
],
orientation: 'vertical',
isRequired: true
});
});
 
// PMF Score Indicator
pmfSection.addRow(row => {
row.addTextPanel('pmfIndicator', {
isVisible: () => pmfSection.radioButton('disappointment')?.value() !== null,
computedValue: () => {
const answer = pmfSection.radioButton('disappointment')?.value();
if (answer === 'very') return '🎯 Strong PMF Signal! Users who say "Very disappointed" indicate your product is a must-have.';
if (answer === 'somewhat') return '📈 Good potential. Understanding what would make you "very disappointed" helps us improve.';
if (answer === 'not') return '💡 Thanks for your honesty. We\'d love to learn what would make this more valuable for you.';
return '';
},
customStyles: () => {
const answer = pmfSection.radioButton('disappointment')?.value();
const baseStyles = { padding: '12px', borderRadius: '8px', fontSize: '14px', marginTop: '8px' };
if (answer === 'very') return { ...baseStyles, backgroundColor: '#ecfdf5', color: '#047857' };
if (answer === 'somewhat') return { ...baseStyles, backgroundColor: '#fffbeb', color: '#b45309' };
if (answer === 'not') return { ...baseStyles, backgroundColor: '#fef2f2', color: '#b91c1c' };
return baseStyles;
}
});
});
 
// ============================================
// SECTION 3: Follow-up for "Very Disappointed"
// ============================================
const promoterSection = form.addSubform('promoterSection', {
title: 'What Makes Us Special?',
isVisible: () => pmfSection.radioButton('disappointment')?.value() === 'very',
customStyles: { backgroundColor: '#ecfdf5', padding: '16px', borderRadius: '8px' }
});
 
promoterSection.addRow(row => {
row.addTextarea('mainBenefit', {
label: 'What is the primary benefit you get from our product?',
placeholder: 'Describe the #1 thing that makes our product valuable to you...',
rows: 3,
autoExpand: true,
isRequired: true
});
});
 
promoterSection.addRow(row => {
row.addSuggestionChips('valuePillars', {
label: 'Which of these benefits do you experience? (Select all that apply)',
suggestions: [
{ id: 'time', name: 'Saves time' },
{ id: 'money', name: 'Saves money' },
{ id: 'quality', name: 'Better quality work' },
{ id: 'insights', name: 'Better insights' },
{ id: 'collaboration', name: 'Easier collaboration' },
{ id: 'automation', name: 'Automation' },
{ id: 'simplicity', name: 'Simplicity' },
{ id: 'reliability', name: 'Reliability' }
],
alignment: 'left'
});
});
 
promoterSection.addSpacer();
 
promoterSection.addRow(row => {
row.addTextarea('whoWouldMiss', {
label: 'What type of person/company would benefit most from our product?',
placeholder: 'Describe who you would recommend this to...',
rows: 2,
autoExpand: true
});
});
 
// ============================================
// SECTION 4: Follow-up for "Somewhat Disappointed"
// ============================================
const passiveSection = form.addSubform('passiveSection', {
title: 'Help Us Improve',
isVisible: () => pmfSection.radioButton('disappointment')?.value() === 'somewhat',
customStyles: { backgroundColor: '#fffbeb', padding: '16px', borderRadius: '8px' }
});
 
passiveSection.addRow(row => {
row.addTextarea('whatWouldMakeVery', {
label: 'What would need to change for you to be "very disappointed" without our product?',
placeholder: 'What features, improvements, or changes would make this a must-have for you?',
rows: 3,
autoExpand: true,
isRequired: true
});
});
 
passiveSection.addRow(row => {
row.addSuggestionChips('missingFeatures', {
label: 'What areas need improvement?',
suggestions: [
{ id: 'features', name: 'Missing features' },
{ id: 'performance', name: 'Speed/Performance' },
{ id: 'usability', name: 'Ease of use' },
{ id: 'integrations', name: 'Integrations' },
{ id: 'pricing', name: 'Pricing' },
{ id: 'support', name: 'Customer support' },
{ id: 'reliability', name: 'Reliability' },
{ id: 'mobile', name: 'Mobile experience' }
],
alignment: 'left'
});
});
 
passiveSection.addSpacer();
 
passiveSection.addRow(row => {
row.addTextarea('alternatives', {
label: 'What would you use instead if our product didn\'t exist?',
placeholder: 'Other tools, manual processes, or workarounds...',
rows: 2,
autoExpand: true
});
});
 
// ============================================
// SECTION 5: Follow-up for "Not Disappointed"
// ============================================
const detractorSection = form.addSubform('detractorSection', {
title: 'We Want to Understand',
isVisible: () => pmfSection.radioButton('disappointment')?.value() === 'not',
customStyles: { backgroundColor: '#fef2f2', padding: '16px', borderRadius: '8px' }
});
 
detractorSection.addRow(row => {
row.addRadioButton('whyNotDisappointed', {
label: 'Why wouldn\'t you be disappointed?',
options: [
{ id: 'alternatives', name: 'I have good alternatives' },
{ id: 'not-solving', name: 'It\'s not solving a real problem for me' },
{ id: 'early', name: 'I haven\'t used it enough yet' },
{ id: 'not-fit', name: 'It\'s not the right fit for my needs' },
{ id: 'other', name: 'Other reason' }
],
orientation: 'vertical',
isRequired: true
});
});
 
detractorSection.addRow(row => {
row.addTextarea('whatWouldHelp', {
label: 'What would make our product valuable to you?',
placeholder: 'What problem would we need to solve for you?',
rows: 3,
autoExpand: true
});
});
 
// ============================================
// SECTION 6: Overall Experience (All Respondents)
// ============================================
const experienceSection = form.addSubform('experience', {
title: 'Quick Rating',
isVisible: () => pmfSection.radioButton('disappointment')?.value() !== null
});
 
experienceSection.addRow(row => {
row.addStarRating('overallRating', {
label: 'How would you rate your overall experience with our product?',
maxStars: 5,
size: 'lg',
alignment: 'center',
showConfettiOnMax: true
});
});
 
experienceSection.addRow(row => {
row.addMatrixQuestion('productAspects', {
label: 'Rate these aspects of our product:',
rows: [
{ id: 'usefulness', label: 'Usefulness', isRequired: true },
{ id: 'easeOfUse', label: 'Ease of use', isRequired: true },
{ id: 'reliability', label: 'Reliability', isRequired: true },
{ id: 'value', label: 'Value for money' }
],
columns: [
{ id: 'poor', label: 'Poor' },
{ id: 'fair', label: 'Fair' },
{ id: 'good', label: 'Good' },
{ id: 'excellent', label: 'Excellent' }
],
striped: true
});
});
 
// ============================================
// SECTION 7: Summary
// ============================================
const summarySection = form.addSubform('summary', {
title: 'Your Feedback Summary',
isVisible: () => pmfSection.radioButton('disappointment')?.value() !== null && experienceSection.starRating('overallRating')?.value() !== null
});
 
summarySection.addRow(row => {
row.addTextPanel('summaryContent', {
computedValue: () => {
const disappointment = pmfSection.radioButton('disappointment')?.value();
const rating = experienceSection.starRating('overallRating')?.value();
const frequency = contextSection.radioButton('usageFrequency')?.value();
const role = contextSection.dropdown('userRole')?.value();
const valuePillars = promoterSection.suggestionChips('valuePillars')?.value() || [];
const missingFeatures = passiveSection.suggestionChips('missingFeatures')?.value() || [];
 
if (!disappointment) return '';
 
let emoji = '🎯';
let pmfLabel = 'Strong PMF';
if (disappointment === 'somewhat') { emoji = '📈'; pmfLabel = 'Potential PMF'; }
if (disappointment === 'not') { emoji = '💭'; pmfLabel = 'Needs Work'; }
 
const frequencyLabels: Record<string, string> = {
'daily': 'Daily user',
'weekly': 'Weekly user',
'monthly': 'Monthly user',
'rarely': 'Occasional user'
};
 
let summary = `${emoji} PMF Survey Summary\n`;
summary += `${'═'.repeat(30)}\n\n`;
summary += `📊 PMF Signal: ${pmfLabel}\n`;
summary += `💫 Response: ${disappointment === 'very' ? 'Very disappointed' : disappointment === 'somewhat' ? 'Somewhat disappointed' : 'Not disappointed'}\n`;
 
if (rating) {
summary += `⭐ Rating: ${rating}/5 stars\n`;
}
 
if (frequency) {
summary += `📅 Usage: ${frequencyLabels[frequency] || frequency}\n`;
}
 
if (valuePillars.length > 0) {
summary += `\n✨ Key benefits: ${valuePillars.length} selected`;
}
 
if (missingFeatures.length > 0) {
summary += `\n⚠️ Improvement areas: ${missingFeatures.length} identified`;
}
 
return summary;
},
customStyles: () => {
const disappointment = pmfSection.radioButton('disappointment')?.value();
const baseStyles = {
padding: '16px',
borderRadius: '8px',
whiteSpace: 'pre-wrap',
fontFamily: 'monospace',
fontSize: '14px'
};
 
if (disappointment === 'very') {
return { ...baseStyles, backgroundColor: '#d1fae5', borderLeft: '4px solid #10b981' };
} else if (disappointment === 'somewhat') {
return { ...baseStyles, backgroundColor: '#fef3c7', borderLeft: '4px solid #f59e0b' };
} else if (disappointment === 'not') {
return { ...baseStyles, backgroundColor: '#fee2e2', borderLeft: '4px solid #ef4444' };
}
return baseStyles;
}
});
});
 
// ============================================
// FORM CONFIGURATION
// ============================================
form.configureSubmitButton({
label: 'Submit PMF Survey',
isVisible: () => pmfSection.radioButton('disappointment')?.value() !== null
});
 
form.configureCompletionScreen({
type: 'text',
title: 'Thank You!',
message: 'Your feedback is incredibly valuable for understanding our product-market fit. We read every response and use this data to build a product that truly serves your needs.'
});
}
 

Frequently Asked Questions

What is the Sean Ellis Test?

The Sean Ellis Test is a single-question survey that measures product-market fit by asking users how disappointed they would be if they could no longer use your product. It was created by Sean Ellis, the growth hacker who coined the term 'growth hacking' and led growth at Dropbox and LogMeIn.

What's a good PMF score?

Sean Ellis found that companies achieving at least 40% 'Very Disappointed' responses typically have strong product-market fit and are ready to scale. Below 40%, you should focus on improving the product before scaling marketing efforts.

Who should I send this survey to?

Target users who have experienced the core value of your product - typically those who have used it at least 2-3 times in recent weeks. Avoid surveying inactive users, brand new users, or those who haven't had enough time to experience the product's value.

How often should I run this survey?

Run the Sean Ellis Test quarterly or after major product changes. It's also valuable to segment results by user cohort, feature usage, or acquisition channel to understand what drives PMF for different segments.

What should I do with the follow-up responses?

Analyze 'Very Disappointed' responses to understand your product's core value proposition. Study 'Somewhat Disappointed' responses for improvement opportunities. For 'Not Disappointed' responses, understand why they're using the product and whether it's solving their real needs.