SKILL.md
CSAT / NPS Analysis Skill
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.
Required Inputs
Ask for these only if they aren't already provided:
- The metric & data — NPS (0–10 ratings), CSAT (e.g. 1–5 or % satisfied), or CES; the response counts/distribution.
- The verbatims — open-text comments (the gold; paste what you have).
- Context — segment, time period, and the prior score for trend.
Output Format
[CSAT / NPS / CES] Readout: [segment, period]
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:
- Promoters love: the 2–3 recurring reasons people rate high (protect/amplify these).
- Detractors hurt by: the 2–3 recurring pains (these are your fix list).
- Passives need: what would move them up. 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.
Programmatic Helper
scripts/nps.py (stdlib only) computes NPS / CSAT from the rating distribution:
# 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
