NPS explained simply for PMs
Contents:
What is NPS and why PMs still care
Net Promoter Score is a one-question loyalty metric introduced by Fred Reichheld in 2003. You ask users a single thing — "How likely are you to recommend this product to a friend or colleague?" — on a 0-to-10 scale. From that one number, you split respondents into three buckets and compute a score from -100 to +100. That is the entire metric.
The reason PMs at Stripe, Notion, Linear, and Airbnb still track NPS twenty years later is not because the science is bulletproof — it isn't — but because it is cheap to collect, easy to benchmark over time, and trivially explainable to a non-technical exec. When a board member asks "are customers happy?", a CSAT survey forces you to pick a feature; an NPS line going up and to the right ends the question in one slide.
NPS is not a quality score. It is not satisfaction. It is willingness to vouch — and that distinction matters because a user can love your onboarding (high CSAT) and still refuse to recommend you (low NPS) because the brand feels embarrassing to share. Keep that nuance in mind when stakeholders treat the three metrics as interchangeable.
The buckets work like this:
| Score range | Bucket | What they actually do |
|---|---|---|
| 9-10 | Promoters | Refer organically, tolerate price hikes |
| 7-8 | Passives | Stay, but churn fast under competitive pressure |
| 0-6 | Detractors | Complain publicly, churn, drag down virality |
Load-bearing rule: Passives are not in the numerator — but they sit in the denominator and dilute the score. Forget that and you'll mis-read every benchmark you see.
The NPS formula and SQL recipe
The formula is deliberately simple:
NPS = % promoters − % detractorsIf you have 40% promoters, 40% passives, 20% detractors, your NPS is 40 − 20 = 20. Passives "eat" the base — they push percentages of the other two groups down without contributing to either side of the subtraction. This is why a product with mostly lukewarm users (lots of 7s and 8s) ends up with an unimpressive NPS even when nobody is actively unhappy.
Here is a SQL recipe assuming responses live in a table nps_responses(user_id, score, answered_at):
WITH groups AS (
SELECT
CASE
WHEN score >= 9 THEN 'promoter'
WHEN score >= 7 THEN 'passive'
ELSE 'detractor'
END AS grp
FROM nps_responses
WHERE answered_at >= NOW() - INTERVAL '30 day'
),
counts AS (
SELECT
COUNT(*) FILTER (WHERE grp = 'promoter')::NUMERIC AS promoters,
COUNT(*) FILTER (WHERE grp = 'detractor')::NUMERIC AS detractors,
COUNT(*)::NUMERIC AS total
FROM groups
)
SELECT
ROUND(100 * (promoters - detractors) / NULLIF(total, 0), 1) AS nps
FROM counts;Two details that bite people: ::NUMERIC is mandatory in Postgres because integer division silently truncates to zero, and NULLIF(total, 0) protects you on weeks with no responses. Both bugs are silent — your dashboard renders a clean "0" and nobody notices for a quarter.
If you want a dialect-aware view of the same calculation, here's the dialect map most teams hit:
| Dialect | Cast you need | NULL guard |
|---|---|---|
| Postgres | ::NUMERIC |
NULLIF(total, 0) |
| BigQuery | SAFE_DIVIDE |
Built into SAFE_DIVIDE |
| Snowflake | ::FLOAT |
NULLIF(total, 0) |
What counts as a good NPS
This is where most PMs get nervous, because the benchmarks floating around the internet are mostly survey-vendor marketing. A reasonable working frame:
- 50+ — excellent, typical of beloved consumer brands (Apple, Tesla in their best years).
- 30-50 — good, healthy SaaS territory.
- 0-30 — average, most B2B tools live here.
- Below 0 — more detractors than promoters; treat as a five-alarm fire.
These ranges hide enormous industry variance. A telecom carrier with NPS 20 is doing well; a consumer mobile app with NPS 20 is in trouble. B2B tools usually score higher than B2C because the user did not pick the tool — they're being polite about something IT installed for them.
Sanity check: Trend matters more than the absolute number. NPS 25 climbing to 32 over six months is healthier than NPS 60 drifting down to 52.
Cultural and regional drift also matters. Users in some markets almost never give a 10 even when delighted — anything above 7 reads as enthusiastic. Comparing your global NPS to a US-survey benchmark without segmenting by region gives you a number that is wrong in both directions at once.
How to collect NPS without lying to yourself
This is where the metric earns or loses its credibility. The five questions you have to answer before shipping a survey:
When do you ask? After a meaningful experience. The honest moments are post-onboarding (day 7 or 14, once the user has actually used the product), on subscription renewal, or after a "win" event like first successful export. Asking on day zero gets you noise. Asking in the middle of a paywall flow gets you a salty number.
How often? No more than once every 60-90 days for the same user. Above that, response quality collapses — people start clicking the closest number to get rid of the modal. Notion runs theirs quarterly. Linear pulls a sample monthly so no individual user is hit more than four times a year.
Where? In-product modals and email both work. Surveys triggered after a support ticket closure produce a support-flavored NPS — useful but not comparable to your in-product baseline, because the population has self-selected as "had a problem recently."
Who? Active users only. Asking dormant users their loyalty is asking strangers about a restaurant they once visited. Define "active" sharply — last 14 days for high-frequency products, last 30 for B2B SaaS — and stick to it.
Sample size? Aim for at least 200-300 responses per segment per measurement window. Below that, your confidence interval is wide enough to swallow most month-over-month moves. If you only have 80 responses, report a 90-day rolling average instead of a monthly point.
The single biggest collection upgrade is the open-ended follow-up question: "What's the one thing we could improve?" A bare 0-10 score without that field throws away roughly 80% of the value. The free-text answers are where actual product decisions get made.
Using NPS in product decisions
NPS is a barometer, not a compass. It tells you the weather, not which direction to walk. Treating it as a primary KPI is how teams end up gaming the survey instead of fixing the product.
What NPS is actually good for:
- Spotting drift over 6-12 month windows. If your trend rolls over, something structural changed — a price hike, a redesign, a churn cohort.
- Segmenting by tier, tenure, plan, channel. A flat aggregate hides that your enterprise NPS is NPS 55 while self-serve is NPS 12. Same product, two different stories.
- Mining detractor comments. This is the highest-ROI activity in the entire NPS workflow. Read every detractor verbatim for a quarter and you'll know your roadmap.
- Triangulating with churn and retention. NPS dropping in isolation is interesting; NPS dropping while D30 retention also slips is an emergency.
What NPS is not good for: setting team OKRs. The moment you tell a customer success team their bonus depends on NPS, you have created an incentive to skip detractors in the sample. Use outcome metrics — churn, revenue retention, expansion — as KPIs, and treat NPS as a leading-indicator dashboard panel.
Common pitfalls
The most frequent mistake is reporting NPS as a percentage. It is not a percentage. "Our NPS is 40%" is wrong on two levels — the symbol is meaningless and it implies a 0-100 scale rather than the actual -100-to-+100 range. Strip the % from every chart and report it as a signed integer. This sounds pedantic but executives will quote your number back at you, and the wrong framing compounds quarter over quarter.
Another trap is biased sampling masquerading as the real number. If you only survey users who completed a happy path, or you only show the modal to users who already left a 5-star app store review, you're measuring a self-selected ceiling. The fix is mechanical: trigger the survey on a fixed time-since-signup or a fixed event count, not on engagement signals that correlate with loving the product.
The wrong-benchmark comparison is endemic. PMs see "global SaaS NPS averages 30" in a vendor blog post and panic when their score is 18. That global number is meaningless for your category. Compare to yourself last quarter, and to whatever direct competitors publish in their investor materials — that's it.
Asking too often quietly destroys data quality. Users who see the same modal monthly stop reading it; they click the middle of the scale just to dismiss it. You end up with a beautiful sample size full of 7s — your NPS becomes artificially neutral and stops moving regardless of what you ship.
Skipping the open-ended follow-up is the cardinal sin. A number without context lets every stakeholder project their preferred theory onto the data. Marketing thinks pricing is the issue; engineering thinks it's bugs; sales thinks it's competitors. The verbatim comments are the only thing that resolves these arguments — without them, NPS reviews become political theater.
Finally, setting NPS as a target metric invites the same gaming you'd expect from any goal: surveys go out only to happy users, modals time their appearance to post-success moments, the team learns the shape of the number rather than the shape of the customer. Pick an outcome metric to optimize, and let NPS stay an honest thermometer.
Related reading
- NPS vs CSAT — difference and when to use
- How to calculate CSAT in SQL
- How to calculate CES in SQL
- Product metrics PM interview questions
If you want to drill questions like this — metric definitions, edge cases, pitfalls a stakeholder will trap you with — NAILDD is launching with hundreds of PM and analyst questions across exactly this pattern.
FAQ
Can I use a 0-5 scale instead of 0-10?
You can, but it is no longer NPS in the canonical sense. The 0-10 scale and the 9/7/0 cutoffs are what makes the score comparable to published benchmarks. If you compress to 0-5, call it a "loyalty score" internally and accept that you can't compare to any external number. The compressed scale also loses sensitivity — users distinguish 8 from 9 in their heads, but a 4-vs-5 split forces a coarser judgment.
What's a good NPS for B2B SaaS in 2026?
Healthy B2B SaaS lands between 30 and 50, with top-tier developer tools and infrastructure products pushing into the 50s. Anything above 60 should make you slightly suspicious of your sample. Below 20, dig into segments before panicking — often a single unhappy customer cohort drags the aggregate down.
Why are passives excluded from the formula?
The metric is designed around enthusiastic referral. Passives won't actively recommend you, but they also won't actively warn people off. Counting them as half-promoters or half-detractors would mush the signal — the point of NPS is to surface the gap between people who'll vouch for you and people who won't. Passives still affect the math because they sit in the total response count, which is why a product with mostly 7s and 8s scores lower than it "feels."
How many responses do I need for a reliable NPS?
At least 200-300 per segment per measurement window for the confidence interval to be tight enough to interpret month-over-month moves. Below that, treat trend lines as suggestive rather than conclusive — and report rolling averages instead of point estimates. A 30-response monthly NPS swinging from 25 to 40 is almost certainly noise.
Should NPS be a team KPI?
Better not. Making NPS the target metric reliably produces sampling games and modal-timing tricks rather than product improvements. Use an outcome metric — net revenue retention, churn rate, expansion ARR — as the KPI, and let NPS sit on the dashboard as a leading indicator. That separation keeps the score honest.
What should I do with detractors?
Reach out. A personal email from a PM to a detractor — not a templated apology from support — converts a meaningful share into engaged users, and frequently into your best promoters. The conversation also produces the highest-quality product feedback you'll ever get. Budget an hour a week for detractor outreach during the first two quarters of running the survey; it usually pays for itself within one quarter.