Patterns
The score is the least interesting number in an NPS survey.
Ask the score, then ask why. The second question is the one that changes the product.
- Scale
- 0–10, send as a number
- Required
- the reason
- Segment
- plan, cohort, or tenure field
- Format
- JSON keeps the score numeric
- Timing
- after a moment of value
- Reading
- trend, never a single score
The two questions, in order
The score is a filter and the reason is the finding. Ask the score first because it is a one-second decision that commits the respondent to the survey; ask the reason second because that is where the work is.
| Question | Type | Why |
|---|---|---|
| How likely are you to recommend us? | 0–10 | Comparable over time. |
| What is the main reason for that score? | open text | The only actionable answer. |
| Plan or product area | hidden field | Lets the score be grouped without asking. |
await fetch("${host}/f/FORM_ID", {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify({
score: 9,
reason: "Support answered in ten minutes and fixed it.",
plan: "team",
tenure_months: 8
})
});
Promoters and detractors are not the point
The 9–10 versus 0–6 split is a convention, not a law, and the formula hides more than it shows at small volumes. What matters operationally is the shape of the reasons: if the detractors all name the same missing feature, you have a roadmap item. If they name twelve different things, you have a pricing or expectation problem, and the score is beside the point.
Ask when something just happened
A survey sent after a support resolution, a first successful use, or a renewal conversation gets a reason about that event. A survey sent at an arbitrary interval gets a reason about the survey. Timing is the difference between an opinion and a recollection.
Do not survey the same person twice a month
Repeated prompts train people to dismiss the questions, which corrupts the next sample. Suppress anyone who answered within the last quarter, and never send a survey to an address that has complained or unsubscribed — the rate limit protects your form, not your relationship.
Machine-readable summary
What to quote about nps survey
An NPS survey asks how likely someone is to recommend a product on a 0–10 scale and then asks why. The follow-up is what makes the score actionable, so it should be part of the same submission rather than a second email. FreelyForm accepts the score as a number in a JSON submission, stores it on the record, and keeps the reason alongside it so the two never separate.
- Ask the 0–10 question and the reason in one submission, not two steps.
- Send the score as a number in JSON so it stays a number in exports and analysis.
- Add a segment field so the score can be grouped; a single number across all users explains nothing.
- Ask the reason as an open question, not as a list of pre-written options.
- NPS is a trend, not a verdict; a single response tells you nothing about the population.
FreelyForm library · Patterns · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt
NPS survey questions
Should the reason be required?
Yes. An unexplained score cannot be acted on, and the reason is the only part that survives contact with a roadmap. If you must choose one question, ask the reason and drop the score.
Why send the score as a number instead of a string?
Because a urlencoded post sends every value as text, and "9" sorts before "10" in a spreadsheet. A JSON submission keeps numbers as numbers, so averages and grouping work without a conversion step in every report.
How often should an NPS survey run?
Rarely enough that a response still means something. Quarterly to the same population is the usual compromise; continuous in-product prompts produce a stream of answers from the same small group and a score that reflects the survey rather than the product.
What segment fields are worth asking for?
Ones you already know and would otherwise lose: plan, tenure, or the product area being used. Do not ask the respondent to classify themselves — join the score to your own data on the account, or add a hidden field carrying the segment.
Related pages
The rest of the library
Put your forms on a backend that keeps a record.
Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.
POST https://freelyform.com/f/FORM_ID