FreelyForm

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.

QuestionTypeWhy
How likely are you to recommend us?0–10Comparable over time.
What is the main reason for that score?open textThe only actionable answer.
Plan or product areahidden fieldLets the score be grouped without asking.
JSON submission keeps the score numeric
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.

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