---
title: "Build an NPS survey"
description: "Set up a proper 0 to 10 NPS question with conditional follow-up, decide who can answer, and route the responses."
order: 2
type: "guide"
topic: "Use cases"
tags:
  - "NPS"
  - "survey"
  - "insights"
  - "conditional logic"
updated: "2026-07-15"
---

An NPS survey is one 0 to 10 recommendation question, plus optional written context. Mark the scale as NPS so Fillo's insights interpret it consistently.

## Define the survey

```ts
const nps = defineForm({
  id: "quarterly-nps",
  title: "How are we doing?",
  pages: [{
    id: "score",
    blocks: [
      {
        id: "recommend",
        kind: "linear_scale",
        label: "How likely are you to recommend us?",
        min: 0,
        max: 10,
        minLabel: "Not likely",
        maxLabel: "Very likely",
        insightsMetric: "nps",
        required: true,
      },
      {
        id: "why",
        kind: "long_text",
        label: "What's the main reason for your score?",
        visibleIf: [{ fieldId: "recommend", op: "answered" }],
      },
    ],
  }],
  settings: { submitLabel: "Send feedback", successTitle: "Thanks for the feedback" },
});
```

NPS requires the full 0 to 10 scale — don't mark a 1 to 5 rating as NPS.

## Decide who should answer

For an in-product pulse, pass signed respondent identity and add a per-campaign hidden scope such as `nps_cycle`, then configure one response per identified person per cycle. For a public link, expect weaker identity and document that the sample can include repeats.

## Route follow-up

Fillo insights give you the aggregate score and distribution. Send accepted responses to the response grid, a webhook, or a connected destination for qualitative review. Don't trigger customer outreach on the number alone — read the written context and check your contact policy first.

## Try it

[Start with a prompt](/start?from=guide-build-an-nps-survey) and your coding agent builds the first form, staged for your review — or [open the editor](/new).

## Related

- [NPS example](/examples#nps): Test the live scale, conditional detail, and success state.
- [Linear scale field](/docs/fields/linear-scale): Keep NPS bounds and labels valid.
- [Respondents and identity](/docs/respondents): Tie an in-product pulse to a verified account.
- [Capture UTM attribution](/guides/capture-utm-attribution): Compare campaign sources without visible questions.
