Feedback Analysis
Overview
Customer feedback analysis transforms raw feedback into actionable intelligence across six interconnected capability areas. All capabilities share a common data pipeline: unified multi-channel feedback collection feeds sentiment detection, which powers NPS/CSAT scoring, feature clustering, ticket triage, churn signals, and ultimately roadmap prioritization.
Six Capability Areas:
-
Sentiment Analysis — Multi-channel emotion detection beyond positive/negative/neutral
-
NPS/CSAT Frameworks — Dual-track score + text analysis with mismatch detection
-
Feature Request Clustering — Group and prioritize by frequency, emotion, and churn correlation
-
Support Ticket Triage — Hierarchical taxonomy-based categorization and routing
-
Churn Signal Detection — Behavioral and textual early warning systems
-
Feedback-to-Roadmap Translation — Convert clusters to ranked product decisions
When to Invoke
Invoke Skill({ skill: 'feedback-analysis' }) when:
-
Analyzing customer feedback at scale (>50 items)
-
Processing NPS/CSAT survey responses
-
Triaging support tickets or classifying issues
-
Detecting early churn signals in user behavior or feedback
-
Prioritizing the product roadmap from customer requests
-
Synthesizing qualitative feedback into actionable themes
-
Running feedback campaigns and evaluating results
The Six-Phase Process
Phase 1: Multi-Channel Data Unification (MANDATORY FIRST STEP)
Iron Law: All analysis degrades without unified data. Single-channel view creates blind spots.
Channels to unify:
- In-app surveys (NPS, CSAT, CES)
- Support tickets (Zendesk, Intercom, Freshdesk)
- App store reviews (iOS, Android)
- Social mentions (Twitter/X, Reddit, LinkedIn)
- Chat transcripts (live chat, chatbot logs)
- Product reviews (G2, Capterra, Trustpilot)
- Email responses
Output: A unified feedback dataset with source, timestamp, channel, user tier, and raw text per item.
Phase 2: Sentiment Analysis
Method: NLP-based multi-dimensional sentiment classification.
Classifications:
-
Polarity: Positive / Negative / Neutral
-
Emotion: Frustration, Satisfaction, Confusion, Delight, Urgency
-
Intensity: High / Medium / Low
-
Topic: Product area, feature, support experience, pricing
Key Pattern — Mismatch Detection (Critical Insight):
A customer scoring 8 (NPS Passive) with deeply negative text is high churn risk. A customer scoring 6 (NPS Detractor) with positive text is recoverable. Mismatch = highest priority segment for intervention.
Mismatch Types:
- High score + negative text → At-risk, intervention needed
- Low score + positive text → Recoverable, reduce friction
- Neutral score + high emotion → Emerging issue, monitor closely
Output: Sentiment-tagged dataset with polarity, emotion, intensity, and mismatch flags.
Phase 3: NPS/CSAT Frameworks
Dual-Track Analysis: Process numerical scores AND open-text responses in parallel.
NPS Segments:
-
Promoters (9-10): Surface testimonials, referral triggers
-
Passives (7-8): Identify friction points preventing promotion
-
Detractors (0-6): Root cause analysis, recovery playbooks
CSAT Layers:
-
Score distribution by product area, agent, date range, cohort
-
Text sentiment correlation with CSAT score
-
Trend analysis: rolling averages, anomaly detection on score drops
-
Causation analysis: what drove score changes?
Multi-Dimensional Segmentation:
Dimensions to segment by:
- User tier (free, pro, enterprise)
- Acquisition channel
- Product area (onboarding, core feature, billing, support)
- Agent/team (for support CSAT)
- Cohort (joined date, plan upgrade date)
- Region/language
Output: NPS/CSAT dashboard data with trend lines, mismatch segments, and causation narratives.
Phase 4: Feature Request Clustering
Method: Group verbatims into themes without manual tagging using pattern detection.
Clustering Dimensions:
-
Frequency: How many users requested this?
-
Emotional Weight: How strongly do they feel? (high emotion = high priority)
-
Churn Correlation: Does absence of this feature correlate with churned users?
-
Segment Impact: Which user tiers/cohorts are most affected?
Category Taxonomy:
Request Categories:
- Bug Report (broken functionality)
- Feature Gap (missing capability)
- UX Friction (confusing/slow workflow)
- Performance Issue (speed, reliability)
- Integration Request (connect to other tools)
- Pricing Feedback (too expensive, wrong tier)
- Documentation Gap (can't figure out how to use it)
Prioritization Formula:
Priority Score = (Frequency × 0.3) + (Emotion Weight × 0.3) + (Churn Correlation × 0.4)
Output: Ranked feature request list with evidence count, sentiment weight, and churn correlation per cluster.
Phase 5: Support Ticket Triage
Taxonomy Design: Hierarchical, max 30-50 tags to prevent tag bloat.
Recommended Taxonomy Structure:
Level 1 (Category): Level 2 (Subcategory): Level 3 (Root Cause):
- Technical Issue - Login/Auth - Password reset broken
- Billing - Charge dispute - Double-charged
- Feature Usage - Onboarding - Setup wizard unclear
- Performance - Slow response - Database timeout
- Integration - API error - Rate limit exceeded
- Account Management - Team permissions - Role not propagating
Triage Modes:
-
Rule-based: Fast pattern matching for obvious categories
-
AI-powered: NLP for ambiguous tickets (45% faster routing per Zendesk data)
-
Human review: Escalation queue for complex/sensitive cases
Priority Scoring:
Ticket Priority = Urgency (language cues) + Impact (user tier/revenue) + Sentiment (frustration level)
- P0: Critical + Enterprise user + High frustration
- P1: High urgency + Any paid user + Negative sentiment
- P2: Medium urgency + Any user + Neutral/negative
- P3: Low urgency + Any user + Neutral
Output: Categorized and prioritized ticket queue with taxonomy assignments and routing rules.
Phase 6: Churn Signal Detection
Behavioral Profile Clustering:
User Engagement Profiles:
- Power User: High session frequency, feature breadth, collaborative
- Dabbler: Irregular sessions, single workflow, no integrations
- One-Feature User: Deep single-feature use, no expansion
- Trial Tourist: Onboarding complete, then disengaged
Early Warning Signals (detect BEFORE explicit churn):
-
Session frequency drop (>50% decrease week-over-week)
-
Feature contraction (fewer features used than prior period)
-
Support ticket surge (3+ tickets in 2 weeks)
-
Negative sentiment spike in recent feedback
-
Admin account downgrade events
-
Billing inquiry (pricing-related tickets/queries)
-
Export activity (data portability requests)
Churn Risk Scoring:
Churn Risk = (Behavioral signals × 0.4) + (Feedback sentiment × 0.3) + (Support ticket pattern × 0.3) Risk Tiers:
- High (>0.7): Trigger immediate retention playbook
- Medium (0.4-0.7): Proactive outreach + success check-in
- Low (<0.4): Monitor, standard touchpoints
Reason Code Generation: Each high-risk user gets a human-readable reason code:
-
"Feature-gap: Missing [X] blocking workflow"
-
"Billing: Perceives pricing as misaligned with value"
-
"Support: 3 unresolved critical tickets in 14 days"
Output: Churn risk cohort with risk scores, reason codes, and triggered playbook recommendations.
Phase 7: Feedback-to-Roadmap Translation
Input: Completed phases 1-6 (sentiment, NPS/CSAT, clusters, triage, churn signals)
Prioritization Matrix:
Roadmap Score = (Feature Request Frequency × 0.25) + (Churn Correlation × 0.35) + (NPS Impact × 0.25) + (Support Volume × 0.15)
Stakeholder Output Format:
Roadmap Recommendation: [Feature/Fix Name]
Evidence Summary: [N] users requested this across [channels] Sentiment: [Avg. emotional weight and polarity] Churn Correlation: [% of churned users mentioned this] NPS Impact: [Correlation to Detractor-to-Promoter potential] Support Impact: [Ticket volume and priority distribution]
Recommended Action: [Implement / Investigate / Defer / Decline] Priority Tier: P0 / P1 / P2 / P3 Supporting Quotes: [3-5 verbatim user quotes]
Continuous Loop: Feed roadmap decisions back into feedback collection ("Did we solve the problem?").
Output: Ranked roadmap items with quantitative evidence, stakeholder narrative, and action recommendations.
Iron Laws
-
ALWAYS unify channels first — single-channel analysis creates blind spots that lead to wrong prioritization decisions.
-
ALWAYS run mismatch detection — numerical scores alone miss high-churn-risk Passives and recoverable Detractors.
-
ALWAYS produce an actionable output — analysis that doesn't result in a decision, playbook trigger, or roadmap item has failed its purpose.
-
NEVER use flat taxonomy with >50 tags — tag bloat causes inconsistent categorization; use hierarchical taxonomy with 30-50 leaf nodes.
-
ALWAYS correlate feature requests with churn data — frequency alone is a poor proxy for priority; churn correlation is the real signal.
Anti-Patterns
Anti-Pattern Why It Fails Correct Approach
Analyzing only NPS scores without text Misses mismatch segments (fake Promoters, recoverable Detractors) Always run dual-track score + text analysis
Flat taxonomy with 200+ ticket tags Agents use first matching tag; root cause data is lost Hierarchical taxonomy, max 50 leaf nodes
Clustering by frequency alone Missing features that don't come up often but cause 80% of churn Weight clusters by churn correlation (0.4 weight)
Waiting for explicit churn to detect it Post-churn analysis doesn't save the customer Behavioral early warning signals, 14-day detection horizon
Roadmap items without evidence count Stakeholders can't evaluate priority or trade-offs Every roadmap item needs: frequency, sentiment weight, churn %, quotes
Single-channel feedback collection Blind spots by channel; social complaints ≠ support tickets Unify all channels before analysis
Enforcement Hooks
Input validated against schemas/input.schema.json before execution. Output contract defined in schemas/output.schema.json . Pre-execution hook: hooks/pre-execute.cjs
Post-execution hook (observability): hooks/post-execute.cjs
Memory Protocol (MANDATORY)
Before starting: Read .claude/context/memory/learnings.md
Check for:
-
Previous feedback analysis results
-
Known data quality issues in feedback channels
-
Prior roadmap decisions from feedback
After completing:
-
New pattern discovered → .claude/context/memory/learnings.md
-
Issue found → .claude/context/memory/issues.md
-
Roadmap decision → .claude/context/memory/decisions.md
ASSUME INTERRUPTION: If it's not in memory, it didn't happen.