--- title: "Surveys and NPS: build in-app surveys with flows" slug: "surveysnps" description: "Build in-app surveys with Userflow to measure customer satisfaction, gather feedback, and enhance user research seamlessly within your app." updated: 2026-10-15T17:56:20Z published: 2026-10-15T17:56:20Z canonical: "help.userflow.com/surveysnps" --- > ## Documentation Index > Fetch the complete documentation index at: https://help.userflow.com/llms.txt > Use this file to discover all available pages before exploring further. # Surveys and NPS: build in-app surveys with flows Userflow surveys are flows with question blocks. You can ask NPS, star-rating, scale, multiple-choice and text questions inside your app, branch to different steps based on the answer, and see the results in the flow's Analytics tab. Because surveys are flows, they use the same targeting and auto-start rules. ## What can you build with Userflow surveys? **Customer Satisfaction Surveys** - **NPS surveys** that appear for active customers (e.g., 30 days after subscription) - **CSAT** or **CES** surveys triggered after users complete specific tasks - **Star ratings** for feature satisfaction **User Research & Feedback** - Feedback collection for new or planned features - **Multiple-choice** questionnaires to personalize onboarding experiences - User segmentation surveys ("What's your role?" "How experienced are you with X?") **Smart Survey Logic** - Branch to different follow-up questions based on responses - Personalize the experience using collected data - Trigger surveys based on user behavior, not just time ## How do I build a survey? You can either build a survey from scratch, or start with one of our templates in the **Create flow** dialog. ### Create a survey flow To build a survey, start by creating a new flow. 1. Select **Flows** in the sidebar. 2. Click **Create flow**. 3. Select either to start from scratch or use the NPS template. 4. Give it a name and click the **Create flow** button. ### Add a question Add short introductory text in the first step. This could be the text of the question, such as *“What do you think about our product?”*. If you’ve started the survey using the NPS template, a question will already be added for you. To customize it or change it to another question type, select it and update the details in the panel on the right. In the bottom of the step, click **Add block**, then **Add question**. ![Add question](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/add-question.png) You can add questions to any kind of step (speech bubble, tooltip and modal). Note that you can only add 1 question per step. ### Configure question Your question will now show up in the speech bubble: ![Question panel](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/question-panel.png) Use the right-side panel to configure your question: - **Question type:** Whether to show a text field, NPS etc. See [Question types](/docs/surveysnps#question-types). - **Question name:** Used internally for reporting - not shown to users. - **When answer is submitted:** Action(s) to perform when the user submits an answer to the question. Note that you can also use the “link port” (the little light-blue rectangle) next to the question to easily link to the next step. - **Required:** If enabled, the user must fill in an answer before they can continue. Only applies to some question types such as text inputs. - **Bind to attribute:** If enabled, instructs Userflow to update a user attribute to the given value when the answer is submitted. This is useful to recall the answer later in the same flow, in other flows, or just for the sake of reporting. Example: In an NPS survey, store the user’s NPS rating in a user attribute called “NPS”. ### Questions and actions To make Userflow go to the next step when the user submits their answer, click the “link port” (the little light-blue square) next to the question and then click “Add step”: ![Link question](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/link-question.png) Notice how a new step is added and the 2 steps are now linked: ![Linked question](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/linked-question.png) You can also add other kinds of actions when the answer is submitted, such as dismissing the flow if the user is all done: ![Dismiss survey](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/dismiss-survey.png) ### Auto-starting survey flows If you want your survey to automatically start, simply use the **Auto-start flow** option like usual. This example shows a survey to users 30 days after signing up: ![Auto-start condition](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/auto-start.png) For things like surveys and announcements it is smart to also set a time (x min/hrs/days) it should show after any other flow to avoid that it shows up right after another flow. You can set this time in the auto-start conditions. See [Flow targeting and audience rules](/docs/flow-targeting-and-audience-rules). ### How do I run a survey every 90 days? If you want a survey question flow (e.g. NPS) to start on a recurring basis (e.g. every 90 days), then set your auto-start conditions to **Start unlimited times** or **Start multiple times** and set the **Every x hrs/days** to the interval you prefer. The time interval will relate to when the flow was last started for the user. ### How do I branch on a survey answer? To use an answer to conditionally go to different steps, you have to bind it to a user attribute, and then use this attribute in a trigger. As an example, let’s look at how to phrase the feedback question in an NPS survey differently depending on whether the user is a promoter (score of 9-10), a passive (7-8) or a detractor (0-6). First, we’ll enable **Bind to user attribute** in the question’s side panel, and then pick our NPS user attribute. ![Bind NPS attribute](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/bind-nps.png) > [!NOTE] > Note that if an appropriate attribute does not exist yet, you have to create it first. You can do this directly from the attribute dropdown. Next, link from the NPS question to the next step. Switch the next step to be a **Hidden** step using the settings icon in the top. See [Hidden steps](/docs/hidden-steps). This step only serves as a router, and will not show anything itself. Add 3 triggers, one for each of promoters, passives and detractors. Add **User attribute** conditions to each trigger like in the screenshot to filter on the NPS attribute. Link from each trigger to 3 different steps. ![Branched NPS](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/branched-nps.png) ## Analytics The **Analytics** tab under a flow shows both aggregated stats and individual responses for your survey questions. For all flow analytics, see [Analytics](/docs/analytics). ### Aggregated stats Some question types, such as [NPS](/docs/surveysnps#nps), get a dedicated section showing aggregated stats. Here’s a sample NPS stats section: ![NPS analytics with current score, trend chart and promoter breakdown](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/nps-stats.png) - **Current NPS** shows today’s NPS according to the rolling day window selected in the top right (defaults to 90 days). Measuring NPS with a rolling window gives you more stable numbers that still react to recent responses immediately. In general, if you have a lot of responses, make the window shorter, and if you have few responses, consider making it longer. - **30 days ago** shows what NPS was 30 days ago. Same for 60, 180 and 365 days ago. - The chart with the blue line shows how NPS has developed over time. - Below the chart, we show how many **responses** you’ve had and what the **response rate** was (number of responses divided by number of times the flow has been viewed). - The lower left side shows the composition of **promoters**, **passives** and **detractors**. - The lower right side shows a distribution of exact scores given. - You can move the mouse over the chart to make the numbers below it adjust to the day you hover over. Similarly, other questions with strictly numeric answers, such as a 1-5 star rating, also get a dedicated section showing the average rating over time: ![Average star rating over time in Analytics](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/stars-stats.png) ### Listing all responses The **Recent sessions** list at the bottom of the Analytics page lists all responses. There’s a column for each question in your flow. ![Recent sessions](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/recent-sessions.png) ### Inspecting individual responses Click an individual session to see just its answers. ![Individual response](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/individual-response.png) ### Exporting to CSV The list of sessions, including all responses, can also be exported to CSV. See the **Export** button next to **Recent sessions**. The export file contains details about how each user engaged with the survey. ### What does Active mean in the export? - Saw the survey - Either - Submitted a score, or - Is still eligible to respond (e.g., it’s visible, open, or could reappear based on rules) ### What does Dismissed mean in the export? - Saw the survey - Closed it without responding - Will not be shown it again (because of your NPS rules) - This status is permanent for this survey ## How do I get survey responses through the API? You can pull raw survey and NPS responses out of Userflow with the API, then calculate whatever you need on your side. This is the route to take when you want responses in your own warehouse, dashboard or BI tool rather than a manual download. One thing to know up front: the API returns the **individual answers**, not the calculated NPS. The score, the promoter/passive/detractor split and the trend line live in the Analytics tab. If you need the score outside Userflow, you calculate it from the answers. You'll need an environment API key from **Settings → API**. Each environment has its own key. ### Find your survey and its NPS question List your content to get the ID of the flow holding the survey: ```bash curl https://api.userflow.com/content?type=flow \  -H 'Authorization: Bearer ' \  -H 'Userflow-Version: 2020-01-03' ``` Then read that flow's version to find the question and its `cvid`. The `cvid` is a cross-version ID that stays the same as you edit and republish, so use it rather than `id`, which changes with every version: ```bash curl 'https://api.userflow.com/content_versions?content_id=&expand=questions' \  -H 'Authorization: Bearer ' \  -H 'Userflow-Version: 2020-01-03' ``` Your NPS question is the one with `"type": "nps"`. ### Pull the responses ```bash curl 'https://api.userflow.com/content_sessions?content_id=&expand=answers' \  -H 'Authorization: Bearer ' \  -H 'Userflow-Version: 2020-01-03' ``` Each session comes back with an `answers` array. Match on `question_cvid` to pick out the NPS answers. An NPS answer has `answer_type` of `number`, and `answer_value` holds the score as a numeric string. Two fields worth using while you're there. `is_preview` is `true` when a team member was previewing a draft, so filter those out before you calculate anything. `created_at` on the answer is when it was given, which is what you want for a time series. ### Page through the results Responses are paginated. Set `limit` up to 100, and follow `next_page_url` while `has_more` is `true`. ### Calculate the score Standard NPS: promoters score 9 to 10, passives 7 to 8, detractors 0 to 6. Subtract the percentage of detractors from the percentage of promoters. Userflow's own Analytics tab uses a rolling window (90 days by default) rather than all time, so match that window if you want your number to line up with what you see in the app. **EU accounts** use `https://api.eu.userflow.com` in place of `https://api.userflow.com`. ### Getting responses out on a schedule There's no built-in scheduled export to cloud storage. To keep an external copy current, poll `content_sessions` on whatever schedule suits you and store what's new. Webhooks don't cover this. Webhook topics are `user`, `group` and `event`, and a submitted survey answer isn't one of them, so there's nothing to subscribe to when a response comes in. If your flow already tracks an event when the answer is submitted, you can subscribe to that instead. Set a **Track event** action under **When answer is submitted** on the question, then subscribe to `event.tracked.<name>`. That notifies you in near real time, though the event carries what you put in it rather than the survey session. ### Which route to use | You want | Use | | --- | --- | | The score and trend, in Userflow | The Analytics tab | | A one-off copy of responses | CSV export from Recent sessions | | Responses in your own systems | The API | | An alert when someone responds | Notification Center, or a webhook on a tracked event | | To correct a stored answer | The API (see Correcting an answer a user has already submitted) | ## Question types ### NPS A Net Promoter Score question. ![NPS question with a 0 to 10 scale in a speech bubble](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/nps.png) ### Multi-line text A free-form text input with multiple lines. Great for long-form feedback. ![Multi-line text](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/multi-line-text.png) Users can submit their answer either by clicking the button (you can customize its text in the builder’s question side panel) or by pressing Cmd + Enter (or Ctrl + Enter). ### Multiple choice When you want to give users multiple options to choose from. ![Multiple choice](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/multiple-choice.png) If you enable **Multiple selection** in the question’s side panel, the user may choose multiple options (like checkboxes instead of radio buttons): ![Multiple selection](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/multiple-selection.png) You can optionally enable an “Other” option, which, when clicked, allows the user to enter their own value. ### Scale A custom scale, where you can pick the minimum value, maximum value and optional left/center/right labels. Useful for e.g. SEQ (Single Ease Question) surveys. ![Scale](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/scale.png) ### Single-line text A free-form text input with a single line. Great for short textual values. ![Single-line text](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/single-line-text.png) Users can submit their answer either by clicking the button (you can customize its text in the builder’s question side panel) or by pressing Enter. ### Star rating A 1-5 star rating, useful for CSAT (Customer Satisfaction) or CES (Customer Effort Score) surveys. ![Star rating question with five stars](https://cdn.us.document360.io/9697557a-eb5d-476f-9b09-062b0f7bdcbd/Images/Documentation/stars.png) ## How the survey-question limit works Your plan may include a limited number of survey questions in total — counted across your account, not per flow. To see how many your plan includes, check your [billing settings](https://app.userflow.com/app/_/settings/billing). Only questions in **published** flows count toward this limit. Questions in draft or unpublished flows don't count, so you can build and test surveys freely without using up your allowance until the flow goes live. **To see and reduce your question count:** 1. Review your published flows for question blocks. 2. Unpublish or delete question blocks in published flows you no longer need. 3. If you need more questions than your plan allows, contact your Userflow CS team about upgrading or a question add-on. If a new survey question won't save or you hit a limit warning, you've most likely reached the question limit across your published flows. ## Troubleshooting ### A text question won't advance to the next step If a survey stops on a Single-line or Multi-line text question and won't move on when the answer is submitted, work through these in order: 1. **Check the step is linked.** Open the question and confirm **When answer is submitted** points at the next step, either through the action list or the light-blue link port beside the question. If nothing is configured there, the flow has nowhere to go. 2. **Check how the answer is being submitted.** A Multi-line text answer is submitted by clicking the button, or with **Ctrl + Enter** (Windows) / **Cmd + Enter** (Mac). Pressing Enter alone adds a line break. 3. **Check the browser console.** If the tab itself becomes unresponsive rather than the flow simply staying put, open DevTools → Console while testing and look for repeated errors. See [Troubleshooting Userflow.js Performance](https://help.userflow.com/docs/troubleshooting-userflow-js-performance). **Required and Bind to attribute do different jobs.** Marking a question **Required** only means the user can't continue without answering — it's safe to leave on. **Bind to attribute** is only needed when you want to store the answer on a user attribute for segmentation, personalization, or reporting. If you don't need the answer later, you don't need Bind to attribute. ### Correcting an answer a user has already submitted A submitted survey response can't be edited from the Userflow interface. The answer is recorded at the moment it's submitted, and there's no way to change that stored response — or to overwrite the bound attribute by hand — from the user's profile. The response **can** be updated through the [Userflow API](https://help.userflow.com/docs/userflow-api-reference). This is an admin action: it needs an API key, so it's something your team does, not something an end user can do for themselves. If a user tells you they meant to give a different score, you have three options: - **Ask them to take the survey again** with the corrected answer, if your flow's frequency settings allow a repeat. See [Understanding flow dismiss, snooze, and restart](https://help.userflow.com/docs/understanding-flow-dismiss-snooze-and-restart). - **Hold the corrected value in a separate attribute, sourced from your CRM.** This is the pattern to use when corrections happen regularly. Create a second field in your CRM — for example a "Revised NPS" property alongside the original — and map it into Userflow as its own attribute. Attributes that come from an integration are dynamic: when the value changes in the source system, it changes in Userflow too. You then have both numbers available, the original response and the revised one, and can report on either. - **Update the stored value through the API.** Best when you're correcting one-off errors and already have API access set up. Keep the corrected value in a **separate** attribute rather than trying to write back over the attribute the survey binds to. Pointing both the survey and your CRM at one attribute means each will overwrite the other. See [HubSpot](https://help.userflow.com/docs/hubspot) for setting up the field mapping. ### Sending survey and NPS answers to Slack Survey and NPS answers can be pushed to Slack through Notification Center, triggered by the **Question Answered** event. One event carries one question's answer, so a single message can't combine an NPS score with a separate open-text comment. For the full setup, including which message field is populated by which question type, see [Building Notification Workflows with Notification Center](https://help.userflow.com/docs/building-notification-workflows-notification-center).