Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyse CSAT / NPS / CES survey results and turn the score into actions. Use when asked to analyse NPS, CSAT, or CES data, compute an NPS score, interpret survey verbatims, or build a voice-of-customer readout. Produces a readout — the computed score, the trend & benchmark, themed analysis of the comments (what drives promoters vs. detractors), and prioritised actions. Includes a stdlib NPS/CSAT calculator.
.claude/skills/mohitagw15856-csat-nps-analysis/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 48% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 49% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 146% | 0% |
A satisfaction score on its own is a vanity number — the value is in why it's that number and what to do. This skill computes the score correctly (NPS is %promoters − %detractors, not an average), reads the verbatims for the themes driving promoters and detractors, and turns it into a prioritised action list — so a survey becomes a roadmap, not a slide.
Ask for these only if they aren't already provided:
1. The score — computed (use the helper for NPS/CSAT): the headline number, the distribution (promoters/passives/detractors for NPS), the trend vs. last period, and the benchmark (industry/your target). State the formula — NPS is a net of percentages, not an average.
2. What's driving it — theme the verbatims:
Quote a representative comment per theme.
3. Segments — where the score is notably worse/better (plan, tenure, channel), if the data allows — the average hides this.
4. Actions — prioritised: the highest-frequency × highest-impact detractor themes first, each with an owner and the metric it should move. A score with no actions is wasted.
scripts/nps.py (stdlib only) computes NPS / CSAT from the rating distribution:
bash# NPS from 0-10 counts (11 numbers, ratings 0..10): python3 scripts/nps.py nps 12 5 8 ... # CSAT % satisfied (ratings 4-5 on a 1-5 scale): python3 scripts/nps.py csat 2 3 10 40 55 python3 scripts/nps.py nps "...counts..." --json
Voice-of-customer practice — correct NPS/CSAT/CES computation, verbatim theming, and action prioritisation.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | pass→pass | 13,276 | 13,245 | -0% | 1 | 1 | 0% | 2,010 | 2,970 | +48% | 0 | 0 | — |
case-01 | fail→pass | 11,545 | 13,039 | +13% | 1 | 1 | 0% | 2,518 | 3,114 | +24% | 0 | 0 | — |
case-02 | pass→pass | 7,926 | 8,872 | +12% | 1 | 1 | 0% | 1,569 | 2,337 | +49% | 0 | 0 | — |
case-03 | pass→pass | 5,759 | 12,027 | +109% | 1 | 1 | 0% | 1,087 | 2,675 | +146% | 0 | 0 | — |
case-04 | pass→pass | 8,225 | 7,420 | -10% | 1 | 1 | 0% | 1,631 | 2,189 | +34% | 0 | 0 | — |
case-05 | fail→pass | 12,348 | 14,553 | +18% | 1 | 1 | 0% | 1,927 | 3,254 | +69% | 0 | 0 | — |
case-06 | pass→pass | 8,451 | 10,086 | +19% | 1 | 1 | 0% | 1,443 | 2,597 | +80% | 0 | 0 | — |
case-08 | pass→pass | 9,580 | 10,566 | +10% | 1 | 1 | 0% | 1,577 | 2,663 | +69% | 0 | 0 | — |
case-09 | pass→pass | 13,660 | 12,794 | -6% | 1 | 1 | 0% | 2,243 | 2,849 | +27% | 0 | 0 | — |
case-10 | pass→pass | 23,994 | 11,050 | -54% | 1 | 1 | 0% | 1,758 | 2,578 | +47% | 0 | 0 | — |
case-11 | pass→pass | 11,383 | 13,550 | +19% | 1 | 1 | 0% | 1,882 | 3,028 | +61% | 0 | 0 | — |
case-12 | pass→pass | 5,916 | 6,469 | +9% | 1 | 1 | 0% | 1,247 | 2,182 | +75% | 0 | 0 | — |
case-13 | pass→pass | 11,505 | 10,754 | -7% | 1 | 1 | 0% | 1,949 | 2,589 | +33% | 0 | 0 | — |
case-14 | pass→pass | 8,360 | 70,202 | +740% | 1 | 1 | 0% | 1,831 | 2,703 | +48% | 0 | 0 | — |
case-15 | pass→pass | 11,247 | 9,123 | -19% | 1 | 1 | 0% | 1,783 | 2,387 | +34% | 0 | 0 | — |
case-20 | pass→pass | 12,271 | 16,474 | +34% | 1 | 1 | 0% | 2,652 | 3,808 | +44% | 0 | 0 | — |
case-16 | pass→pass | 7,555 | 6,129 | -19% | 1 | 1 | 0% | 1,307 | 1,844 | +41% | 0 | 0 | — |
case-17 | pass→pass | 20,331 | 7,684 | -62% | 1 | 1 | 0% | 1,218 | 2,233 | +83% | 0 | 0 | — |
case-18 | pass→pass | 10,342 | 5,359 | -48% | 1 | 1 | 0% | 1,771 | 1,659 | -6% | 0 | 0 | — |
case-19 | pass→pass | 15,924 | 16,374 | +3% | 1 | 1 | 0% | 2,865 | 3,987 | +39% | 0 | 0 | — |
case-21 | pass→pass | 9,562 | 9,099 | -5% | 1 | 1 | 0% | 1,531 | 2,285 | +49% | 0 | 0 | — |
case-22 | pass→pass | 11,052 | 11,447 | +4% | 1 | 1 | 0% | 2,023 | 2,816 | +39% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.