NPS metric and benchmarks

Train product sense and metrics
400+ questions on metrics, case interviews, retention, unit economics.
Join the waitlist

What NPS measures and why PMs care

Net Promoter Score (NPS) is a one-question loyalty metric that asks: "On a scale from 0 to 10, how likely are you to recommend us to a friend or colleague?" Respondents at 9–10 are promoters, 7–8 are passives, and 0–6 are detractors. The score itself is the percentage of promoters minus the percentage of detractors, so it ranges from −100 to +100.

Why every PM dashboard at Stripe, Airbnb, and Notion still tracks NPS despite two decades of criticism: it correlates well with referral behavior, it survives across cultures with minor adjustments, and a single number gets you into a CEO review without an explainer slide. The trade-off is that NPS hides intensity, hides causation, and reacts slowly. You use it the way you use a thermometer — not the way you use an MRI.

For an analyst, NPS sits next to retention and revenue retention as a leading indicator. If NPS drops 8 points in a month while DAU is flat, something has changed in the experience — pricing surprise, broken onboarding, support backlog — that has not yet hit the revenue line. That is the value of the metric: lead time on bad news.

Load-bearing trick: treat NPS as a direction and a segment cut, never as an absolute target. "+42 across the product" tells you nothing. "+58 for power users, −4 for trial cohort week 1" tells you what to fix this sprint.

The formula and a worked example

NPS = % promoters − % detractors

Passives are excluded from the arithmetic, which is the part newcomers always question. The reasoning is intentional: passives are satisfied enough not to complain but not enthusiastic enough to recommend, so they neither add to nor subtract from your organic growth engine. They show up indirectly through the denominator.

Score Group Behavioral signal
9–10 Promoters Refer others, expand seats, write reviews
7–8 Passives Stay for now, churn on a better offer
0–6 Detractors Cancel, downgrade, post negative reviews

Say you survey 400 users: 180 score 9–10, 140 score 7–8, and 80 score 0–6. Promoter share is 45%, detractor share is 20%, so NPS is +25. The 35% passives are not in the calculation, but they shape the math — if you converted half of them into promoters next quarter, your NPS would climb to roughly +42 without any detractor reduction.

This is also why "raise NPS by 10 points" is usually easier through the passive band than through the detractor tail — passives are closer to flipping than detractors are to redeeming.

NPS in Python and SQL

The Python version is short and reads like a pivot table. Bin the raw scores, normalize, subtract.

import pandas as pd

df = pd.DataFrame({
    "user_id": range(1, 401),
    "score": [10, 9, 8, 7, 6, 5, 10, 9, 8, 3] * 40,
})

df["group"] = pd.cut(
    df["score"],
    bins=[-1, 6, 8, 10],
    labels=["detractor", "passive", "promoter"],
)

share = df["group"].value_counts(normalize=True)
nps = (share.get("promoter", 0) - share.get("detractor", 0)) * 100

print(f"NPS: {nps:+.0f}")
print(share.round(3))

The SQL pattern is the same idea expressed with conditional aggregates. The cast to a numeric type matters — integer division in Postgres will silently round to zero.

SELECT
    ROUND(
        (COUNT(*) FILTER (WHERE score >= 9)::NUMERIC / COUNT(*) * 100)
      - (COUNT(*) FILTER (WHERE score <= 6)::NUMERIC / COUNT(*) * 100),
        1
    ) AS nps,
    COUNT(*) AS responses
FROM nps_surveys
WHERE survey_date >= DATE '2026-01-01';

For trend tracking — which is the only NPS view that actually drives decisions — group by month and keep response count visible. A "rising" NPS on 30 responses last month and 600 this month is not a real trend, it is a sampling artifact.

SELECT
    DATE_TRUNC('month', survey_date) AS month,
    COUNT(*) AS responses,
    ROUND(
        (COUNT(*) FILTER (WHERE score >= 9)::NUMERIC / COUNT(*) * 100)
      - (COUNT(*) FILTER (WHERE score <= 6)::NUMERIC / COUNT(*) * 100),
        1
    ) AS nps
FROM nps_surveys
GROUP BY 1
ORDER BY 1;

The segment cut is where insight actually lives. Join to your user table, slice by plan tier, acquisition channel, or tenure bucket, and order descending.

SELECT
    u.plan_tier,
    COUNT(*) AS responses,
    ROUND(
        (COUNT(*) FILTER (WHERE s.score >= 9)::NUMERIC / COUNT(*) * 100)
      - (COUNT(*) FILTER (WHERE s.score <= 6)::NUMERIC / COUNT(*) * 100),
        1
    ) AS nps
FROM nps_surveys s
JOIN users u USING (user_id)
WHERE s.survey_date >= DATE '2026-01-01'
GROUP BY 1
HAVING COUNT(*) >= 100
ORDER BY nps DESC;

The HAVING COUNT(*) >= 100 guard is the single most-skipped line in production NPS queries. Without it, a segment with 12 responses and one angry user reports NPS −8 and lands in the CEO deck.

Benchmarks by industry

Absolute NPS numbers depend heavily on industry, survey channel, and culture. The same product can show NPS +52 in an in-app prompt and +21 in a delayed email blast — same users, different selection bias. Benchmark against your own past, your direct competitors, and your industry distribution, in that order.

Industry Typical NPS range Notes
Consumer fintech +30 to +50 High variance; Apple Card-style products skew higher
SaaS (PLG) +30 to +45 Notion, Figma sit toward the top of the band
Marketplaces +10 to +30 Two-sided dynamics drag the average
Ride-share / delivery 0 to +25 Operational issues compress the score
Telecom / ISPs −10 to +15 Structurally low; +20 is a milestone
Streaming / media +30 to +55 Netflix-tier products clear +50
Enterprise SaaS +20 to +40 B2B surveys oversample champions

Treat these as orientation, not a target. A consumer fintech sitting at +32 with consistent monthly growth is healthier than a competitor at +48 that fell from +57 last quarter. The slope beats the level.

Train product sense and metrics
400+ questions on metrics, case interviews, retention, unit economics.
Join the waitlist

NPS as a guardrail metric

In A/B tests, NPS makes a useful guardrail but a terrible primary metric. Two reasons. First, NPS is slow — the response window is days to weeks, far longer than most test horizons. Second, it is noisy at small sample sizes — a 20-point swing on 200 responses is well inside the confidence band.

The right pattern is: pick a primary metric that moves quickly (activation, conversion, 7-day retention), set NPS as a guardrail that must not regress by more than a defined threshold, and review the guardrail at the end of the rollout window rather than at decision time. For more on this pattern see the guardrail metrics in A/B testing write-up.

Sanity check: if your test moved conversion by +3.2% with p < 0.01 but NPS dropped by 9 points in the treatment, you shipped a dark pattern, not a win. Roll back, investigate, redesign.

Common pitfalls

The first pitfall is comparing NPS across channels as if they were the same metric. An in-app prompt right after a successful workflow oversamples promoters because the user just had a good moment. A post-cancellation email oversamples detractors for the inverse reason. If you average them together, you get a number that means nothing, and any month-over-month "trend" is just a shift in your survey mix.

The second is chasing the promoter band when the detractor band is the problem. A common executive instinct is to add referral campaigns and delight features to convert passives into promoters. The math usually favors the other direction: it is easier to identify the top three reasons detractors gave low scores and remove those friction points than to nudge happy users into being delighted. Detractor work also reduces churn, which compounds, while delight work tends to be one-off.

A third trap is treating NPS as statistically free. NPS is a difference of two proportions on a non-random sample of the user base. Confidence intervals on differences of proportions get wide fast at small N, and self-selection inflates the underlying variance. If your monthly response count is below 300, do not report month-over-month changes without an explicit confidence band or a bootstrap confidence interval around the score.

The fourth is ignoring the follow-up question. The single most useful field in any NPS survey is the open-text "why?" answer that follows the rating. PMs who tag and cluster these responses can move the score; PMs who only track the number cannot. The cost is low — a weekly 30-minute review of detractor comments will surface 80% of the actionable patterns.

The fifth is culture-blind global rollouts. Score-anchoring varies sharply by country. In Japan and parts of Northern Europe, a 9 is exceptional praise; in the US, a 9 is closer to "good but not perfect". If you operate globally, report NPS by country and avoid the headline "global NPS" number — it is the average of incompatible scales.

If you want to drill product-metric interview questions like this one daily, NAILDD is launching with 500+ analyst and PM problems in exactly this format.

FAQ

How often should we measure NPS?

For SaaS, monthly relationship NPS plus transactional NPS at key moments (onboarding completion, support ticket close, first invoice) is the standard cadence. For consumer apps, quarterly relationship NPS with rolling 90-day windows smooths sampling noise. Surveying more than once a quarter to the same user lowers response rates and trains users to ignore your prompts, so resist the urge to ask weekly even if your tool makes it easy.

What is a "good" NPS for an early-stage product?

There is no universal floor, but for a pre-PMF consumer product anything above zero is encouraging, and above +20 with at least 200 responses is a useful signal that the loop is working. For a paid B2B tool with a champion-led sales motion, anything below +30 is worth investigating, because B2B surveys are structurally biased toward enthusiastic respondents — a low score among your own champions is a real problem.

How do I make NPS changes statistically defensible?

Treat it as a difference of two proportions across two time windows. The most honest approach is a bootstrap: resample the responses with replacement a few thousand times, recompute NPS, and report the 5th–95th percentile band. If the two periods' bands overlap, the change is not significant regardless of how large the point estimate looks. For larger samples, a z-test on the difference of (promoter − detractor) shares between the two periods is acceptable.

Should B2B and B2C teams use different NPS playbooks?

Yes. In B2B you survey decision-makers and economic buyers, weight one response per account, and look at score distribution rather than mean — a bimodal distribution (lots of 10s, lots of 3s) signals a champion problem masking a real fit issue. In B2C every user is one vote, and the open-text follow-up matters more because you cannot interview your customers individually. The math is the same; the segmentation and interpretation differ.

Why are passives excluded from the formula?

The original framework assumed that only promoters produce organic growth and only detractors produce active churn risk, while passives are inert. Empirically this is mostly true — referral rates from passives are close to zero, and so are negative-WOM rates. The cost of the choice is that the metric is not sensitive to large shifts inside the 7–8 band, which is one of several reasons sophisticated teams pair NPS with a full distribution chart, not just the headline number.

What replaces NPS if I think it is broken?

Nothing replaces it cleanly, which is why it persists. The closest substitutes are the PMF survey ("how would you feel if you could no longer use this product?" with 40% "very disappointed" as the rough PMF threshold), CSAT for transactional moments, and retention curves for behavioral truth. The right answer is usually to keep NPS as one input among several, never as the single number on a wall chart.