Analyze your NPS performance
Access detailed quantitative and qualitative customer feedback
Table of Contents
After publishing an NPS survey, track responses, monitor your score over time, and export data for reporting. NPS 2.0 analytics are split across two tabs — Overview for engagement metrics and NPS for score data and individual responses.
Open NPS analytics
- Go to Experiences > NPS and click on your survey. The analytics page opens.
- Use the date range picker to set the reporting period. Use the segment filter to view data for a specific audience.
Overview tab
The Overview tab shows engagement metrics — how many users saw the survey and how many completed it. This uses the same analytics format as Flows.

Flow activity chart
The chart plots two lines over your selected date range: Flows shown (how many times the survey was displayed) and Flow completion (how many users completed the full survey). Use this to spot trends — a spike in "shown" with flat "completion" may indicate users are dismissing or snoozing the survey.
Summary cards
- Unique Users — the number of distinct users who were shown the survey, plus the total number of times it was shown (one user may see it multiple times across cycles). For example, "2,784" unique users with "13,813 total times shown."
- Unique Users Completed — the percentage of unique users who completed the survey (submitted at least a score), plus the overall completion rate across all impressions.
Step breakdown
The step breakdown table shows per-step metrics for each step in the survey:

| Column | What it shows |
|---|---|
| Step | The step number — click the external link icon to open the step in the Builder |
| Created | When the step was created |
| Shown | How many unique users were shown this step |
| Completed | How many unique users completed this step |
| Completion rate | Percentage of users shown this step who completed it |
| Completion funnel | The percentage of users who reached this step out of all users who started the survey |
Step 1 is the score question. Step 2 is the feedback question. A high completion rate on Step 1 but a drop on Step 2 means users are submitting scores but skipping the feedback question — this is normal, but if the drop is steep, consider shortening or simplifying your feedback prompt.
Recent Users
A table of the most recent users who interacted with the survey, showing User (clickable — opens the user's profile) and Event Time.
NPS tab
The NPS tab shows your actual NPS score, the promoter/passive/detractor breakdown, score trends, and individual responses.

Score tile
The score tile shows your current NPS score and the response breakdown:
- Score — your NPS, calculated as % promoters minus % detractors. Ranges from −100 to +100.
- Stacked bar — a horizontal bar showing the percentage split: promoters (green), passives (grey), and detractors (red).
- Counts — the number of respondents in each category (e.g., 119 Promoters, 41 Passives, 123 Detractors).
For example, if you have 1,200 people respond to your NPS survey and 400 are promoters and 200 are detractors, your NPS score would be 17.
[(400/1,200) - (200/1,200)] x 100 = 17
The score is calculated using a trailing 30-day window from the end of your selected date range, so it stays current and smooths out day-to-day spikes.
Score history
A line chart showing your NPS score over time across the selected date range. Each data point represents the trailing 30-day score calculated on that date. Use this to track whether your score is trending up, down, or holding steady.
For example, a score calculated on March 5 uses data from February 4 to March 5. The next day, it shifts to February 5 to March 6.

Survey Responses
A table of individual responses with four columns:
| Column | What it shows |
|---|---|
| User | Clickable link to the user's profile in Appcues |
| Score | The score value (0–10), color-coded: green for promoters (9–10), grey for passives (7–8), red for detractors (0–6) |
| Feedback | The text the user entered in the feedback step (blank if they skipped it) |
| Date received | Timestamp of the response |
If a user submits multiple scores within the same cycle (e.g., they updated their score), both responses appear in the response table but only the most recent score is used in the NPS calculation.
Using legacy NPS (v1)?
V1 uses a single-page dashboard (no overview tab) with the NPS score tile, a score history chart, a responses table, and filter options for date range and segment. The calculation method is the same — trailing 30-day window.
Export NPS data
Click the Export button in the top-right corner of the analytics page. Select a date range, choose an export type, and a CSV will be generated and sent to your email.
Export types
-
Basic — Includes core activity events for the NPS experience (
appcues:v2:experience_started,appcues:v2:step_seen,appcues:v2:experience_snoozed,appcues:v2:experience_completed) with reserved fields like timestamp, user ID, and event name. It does not include score or feedback. Use this for a lightweight view of who interacted with the survey and what happened. - Full — Same as Basic but expanded to include all event attributes. Every user property and attribute tied to each event gets its own column. This can result in very wide CSVs. Use this when you need the most comprehensive raw event dump.
- Survey — One row per respondent. Combines the score and feedback responses for a single user into a single row, so you get their NPS score and text feedback together alongside user properties. Only includes users who actually responded — not users who were shown the survey but didn't submit. This is the most useful export for most teams doing NPS analysis.
The Survey export is usually what you want. Basic and Full are row-per-event formats designed for piping into analytics tools or data warehouses. Survey gives you a clean, one-row-per-person view that's ready for spreadsheet analysis.
Using legacy NPS (v1)?
V1 export works the same way — click Export, choose a date range, and receive a CSV by email. The CSV columns include attributes.score (the NPS score) and attributes.feedback (the feedback text). You can also export via the Public API to access all NPS events, including when the survey was shown or dismissed.
V1 NPS events (Public API)
| Event name | Description |
|---|---|
nps_survey_started |
The user was shown the NPS survey |
nps_score |
The user submitted a score |
nps_feedback |
The user submitted feedback after selecting a score |
nps_ask_me_later_selected_at |
The user clicked "Ask Me Later" |
nps_clicked_update_nps_score |
The user selected "Update Score" and potentially changed their score |
Each event includes default properties: timestamp, userId, currentPageTitle, currentPageUrl, and sessionPageviews.
When calculating your NPS from exported data, use nps_score events (not nps_survey_started) to count respondents. If a user submitted multiple scores, use the most recent one. If your export spans multiple survey cycles, count each user's score once per cycle.
NPS 2.0 event model
NPS v1 used dedicated event names like appcues:nps_score and appcues:nps_feedback. NPS 2.0 eliminates those in favor of a generic, extensible survey event model appcues:v2:step_interaction.
Event structure
All NPS 2.0 responses come through as appcues:v2:step_interaction events with interactionType set to "Survey submitted". The NPS data lives nested inside interactionData:
{
"name": "appcues:v2:step_interaction",
"experienceId": "...",
"experienceName": "NPS for legacy customers",
"experienceType": "nps",
"stepId": "...",
"interactionType": "Survey submitted",
"interactionData": {
"survey": {
"id": "<survey-entity-uuid>",
"type": "nps"
},
"submissionId": "<unique-submission-uuid>",
"surveyResponses": [
{
"type": "nps_score",
"label": "NPS Score",
"value": "9",
"fieldId": "<survey-field-uuid>",
"order": 0
},
{
"type": "nps_feedback",
"label": "NPS Feedback",
"value": "this is awesome",
"fieldId": "<survey-field-uuid>",
"order": 1
}
]
}
}Key fields
-
survey.idandsurvey.typetie the response back to a specific survey entity. This is what enables multiple NPS surveys — each has its own survey entity ID. -
surveyResponsesis an array where each entry has atype(likenps_scoreornps_feedback), afieldIdlinking back to the survey entity's field definition, alabel, and avalue. -
submissionIduniquely identifies this particular submission. - Score and feedback can arrive in separate submissions — a user might submit a score in one event and follow up with feedback in another.
Other NPS 2.0 events
Survey seen events (for calculating response rate) also use appcues:v2:step_interaction but with interactionType: "Survey seen" and only the survey object in interactionData — no surveyResponses.
Snooze events map to appcues:v2:experience_snoozed, replacing the old appcues:nps_ask_me_later_selected_at.
V1 → V2 event mapping
| NPS 1.0 event | NPS 2.0 equivalent |
|---|---|
appcues:nps_survey_started |
appcues:v2:step_interaction with interactionType: "Survey seen"
|
appcues:nps_score |
appcues:v2:step_interaction with interactionType: "Survey submitted" and surveyResponses[].type: "nps_score"
|
appcues:nps_feedback |
appcues:v2:step_interaction with interactionType: "Survey submitted" and surveyResponses[].type: "nps_feedback"
|
appcues:nps_ask_me_later_selected_at |
appcues:v2:experience_snoozed |
Integration support for NPS 2.0
| Integration | NPS 2.0 support | Notes |
|---|---|---|
| Salesforce (v2) | Supported | Requires the new Salesforce v2 integration card in Studio. The legacy Salesforce integration does not receive NPS 2.0 events. For historical tracking across cycles, see Track historical NPS with Salesforce. |
| HubSpot (v2) | Supported | Requires the new HubSpot v2 integration card in Studio. The legacy HubSpot integration does not receive NPS 2.0 events. |
| Zapier | Supported | Select "Custom Event Received" as the trigger event and use the appcues:v2:step_interaction event with a filter of NPS. |
| Client-side analytics (Amplitude, Heap, Mixpanel, Segment, Google Analytics) | Partially supported | These integrations receive all client-side events by default, including appcues:v2:step_interaction. However, the NPS score and feedback values are nested inside the event payload — verify that your destination is correctly parsing these attributes before relying on the data. |
| Slack | Not yet supported | The current Slack integration does not receive NPS 2.0 events. As a workaround, use Zapier to route NPS responses to Slack. |
| Custom webhooks | Not yet supported | Webhooks use event_names filtering, which cannot target the specific attributes inside appcues:v2:step_interaction events. |
Using legacy NPS (v1)?
All integrations that support appcues:nps_score and appcues:nps_feedback events continue to work with v1 surveys. This includes both legacy and v2 versions of Salesforce and HubSpot, Zapier, Slack, custom webhooks, and all client-side analytics integrations.
Good to know
- Score calculation. Your NPS = % promoters − % detractors. Passives are excluded. Appcues uses a trailing 30-day window so the score stays current.
- Multiple responses. If a user submits multiple scores within a cycle, only the most recent score is used in the NPS calculation. Both responses appear in the Survey Responses table.
- Segment filtering. Use the segment dropdown to see how your NPS varies across different user groups — by plan, role, tenure, or any segment you've created.
If the data doesn't look right
- Score seems off? Remember the score uses a trailing 30-day window, not just the selected date range. A short date range may show fewer responses than expected.
- Responses missing? Check that the survey is published and that users are meeting the targeting and sampling criteria. See NPS targeting settings.
- Export is empty? Verify the date range includes dates when the survey was live and receiving responses.
-
Integration not receiving NPS 2.0 events? V2 uses
appcues:v2:step_interactioninstead ofappcues:nps_score. We're still rolling out support to NPS 2.0 across our integrations.