Automatically analyze NPS responses with n8n and AI: verbatims, alerts and monthly reports
Published 2 August 2026 · 6 min read
A well-run NPS survey produces two things: a score, and a pile of verbatims nobody reads systematically. The score shows up on a dashboard; the free-text comments — where the actual reasons for dissatisfaction live — get skimmed once a quarter, when someone finds the time. The result: a detractor who writes "I'm cancelling at the end of the month if the billing issue isn't fixed" gets the same treatment as a passive who finds the interface "okay". This guide shows how to build a complete pipeline in n8n: response collection, promoter/passive/detractor classification, LLM verbatim analysis with structured output, immediate alerts on high-stakes detractors, and an AI-generated monthly report.
Why the score alone is not enough
NPS rests on a single question — "How likely is it that you would recommend X to a friend or colleague?" on a 0-to-10 scale — popularized by Frederick Reichheld in his 2003 Harvard Business Review article, "The One Number You Need to Grow": 9-10 are promoters, 7-8 passives, 0-6 detractors, and NPS is the percentage of promoters minus the percentage of detractors.
The academic literature, however, warns against stopping at the number. A study by Keiningham, Cooil, Andreassen and Aksoy published in 2007 in the Journal of Marketing, "A Longitudinal Examination of Net Promoter and Firm Revenue Growth", tested the claim that NPS is the best predictor of growth using longitudinal data (21 firms, over 15,000 interviews) — and found no superiority of NPS over classic satisfaction indices. The practical lesson: the operational value of your survey lies in the verbatims (why people give a 3 or a 9), not in the aggregate score. That is exactly what an LLM can exploit at scale.
Step 1 — Collect responses from any source
Three channels cover most situations, and all three can feed the same pipeline:
- Typeform: the native n8n trigger receives every submission in real time. Credential and webhook setup are covered in our Typeform-n8n connection guide. The score and comment come through as response fields.
- n8n form: for a survey without a third-party tool, the n8n Form Trigger lets you build a multi-step form — page 1 for the score, page 2 for the verbatim, optionally conditioned on the score.
- CSV import: for historical data or surveys run elsewhere (email, internal tool), a CSV export imported into n8n does the job; see how to extract and parse Excel and CSV files in n8n.
Whatever the source, normalize immediately with a Set / Edit Fields node into a common format: score (integer 0-10), verbatim (text, possibly empty), email, source, response_date.
Step 2 — Classify promoters, passives, detractors
No AI needed here: it is a deterministic rule, so a Switch node is enough, with three outputs based on expressions:
- Promoter:
{{ $json.score >= 9 }} - Passive:
{{ $json.score >= 7 && $json.score <= 8 }} - Detractor:
{{ $json.score <= 6 }}
Add the category to the JSON (category: "detractor") for aggregation. Save the AI for what it does better than rules: understanding free text.
Step 3 — Analyze verbatims with an LLM and structured output
This is the heart of the pipeline. An LLM chain (Basic LLM Chain) paired with a Structured Output Parser guarantees a JSON output the downstream nodes can route on, instead of a free-form paragraph. For plain labeling without extraction, the Text Classifier node is a lighter alternative, but here we want several fields at once.
The analysis prompt, with the score as context:
You are analyzing the comment from an NPS survey response.
Score given by the customer: {{ $json.score }}/10.
Comment:
"""{{ $json.verbatim }}"""
Instructions:
- "themes": choose ONLY from: pricing, product, support,
billing, delivery, onboarding, performance, other.
- "sentiment": the tone of the text, independently of the score.
- "urgency": "high" only if the customer mentions cancellation,
a dispute, an operational blocker or an explicit deadline.
- "key_quote": the most significant literal excerpt, unrephrased.
- Do not infer anything that is not in the text.
And the JSON schema given to the Structured Output Parser:
{
"type": "object",
"properties": {
"themes": { "type": "array", "items": { "type": "string" } },
"sentiment": { "type": "string", "enum": ["positive", "neutral", "negative", "mixed"] },
"urgency": { "type": "string", "enum": ["high", "medium", "low"] },
"churn_risk": { "type": "boolean" },
"key_quote": { "type": "string" },
"summary": { "type": "string" }
},
"required": ["themes", "sentiment", "urgency", "churn_risk", "summary"]
}
Two things matter here. First, the closed list of themes in the prompt: without it, the model invents near-duplicate labels ("pricing", "price", "cost") that ruin aggregation, exactly as with AI-powered customer review analysis. Second, an IF node upstream skips the LLM call when verbatim is empty — a model forced to analyze missing text hallucinates.
Step 4 — Alert immediately on high-stakes detractors
An IF node after the analysis combines the signals: {{ $json.category === "detractor" && ($json.urgency === "high" || $json.churn_risk) }}. On that branch:
- Slack message in the support or CS channel, with the score, summary, key quote and customer email — everything needed to call back within the hour;
- Ticket creation in your support tool (Zendesk, Jira, Linear…) with the priority derived from urgency, following the same principle as AI-based support ticket scoring.
"Ordinary" detractors (low score, no urgency signal) go into a normal processing queue: no need to wake up the team for a 6/10 with no comment.
Step 5 — Aggregate and track score evolution
Each enriched response is written to a table: score, category, themes, sentiment, urgency, source, response_date. Two options depending on your stack:
- Supabase if you want SQL queries and a dashboard on top;
- n8n Data Tables to stay inside n8n with no external database — Data Tables easily handle a few hundred responses per month.
The month's NPS is then computed in a Code node: (promoters - detractors) / total * 100, filtered on the period.
The AI-generated monthly report
A monthly Schedule Trigger reads the last 30 days of responses plus the previous period, aggregates the counters (current NPS, previous NPS, volume, theme distribution per category), then hands everything to an LLM tasked with writing the summary: score evolution with hypotheses drawn from the themes, top 3 detractor pain points with quotes, positive signals among promoters, recommended actions. The full pattern — aggregation, synthesis prompt, formatting and delivery by email or Slack — is the same as for an AI-generated summary and audit report.
One important point: compute the numbers (NPS, deltas, theme counts) in a Code node before the LLM call, and feed them to the model in the prompt. An LLM writing from pre-computed figures is reliable; an LLM asked to count items itself across a list of 200 responses is not.
Limits and best practices
- Do not over-react to small volumes: with 20 responses, NPS swings by 10 points when two people change their mind. Always display the volume next to the score.
- Audit the AI analysis regularly: review a sample of classified verbatims every month, especially the
urgency: highones. False negatives (a missed cancellation threat) cost more than false positives. - Watch out for personal data: verbatims sometimes mention names or identifying situations. If your internal policy requires it, anonymize before calling an external API, or use a local model.
- Keep a human in the loop: the Slack alert triggers a callback by a human, not an automated reply to the customer. The AI sorts and prioritizes; it does not run the relationship.
Key takeaways
- The NPS score alone is a poor signal — academic research (Keiningham et al., 2007) shows it does not predict growth better than classic indices; the value is in the verbatims.
- Collect via Typeform, the n8n Form Trigger or CSV import, then normalize into a single format.
- Classify promoters/passives/detractors with a Switch node (deterministic rule), and reserve the LLM for free-text analysis with a Structured Output Parser and a closed theme list.
- Alert in Slack and create a ticket only for detractors with high urgency or detected churn risk.
- Aggregate in Supabase or Data Tables, pre-compute the figures in a Code node, and let the AI write the monthly report from those figures — never the other way around.
FAQ
Frequently asked questions
How many NPS responses per month justify automating the analysis?
From a few dozen responses per month, manual verbatim review becomes inconsistent and detractors slip through. The main benefit is not raw time saved but consistency: every response gets the same treatment, immediately, including the one submitted on a Friday night.
Can I use a local AI model to analyze verbatims instead of a cloud API?
Yes. Verbatims sometimes contain personal data (names, customer context), and a local model via Ollama keeps them off third-party servers. The trade-off is slightly weaker extraction quality on ambiguous verbatims; test on a real sample before deciding.
How should the workflow handle NPS responses with no comment?
An IF node upstream of the AI analysis routes responses without a verbatim straight to aggregation: the score alone is enough for the NPS calculation. This avoids pointless LLM calls and empty or hallucinated JSON outputs on missing text.
Can my computed NPS differ from the one shown in Typeform or my survey tool?
Yes, whenever the scopes differ: Typeform computes over responses collected on its side, while your table may aggregate several sources (n8n form, CSV imports). Document the calculation scope and keep a single source of truth, or the discrepancies will cause internal confusion.
Bundle FlowKit Complet
€269