pm-feedback — User feedback analysis
Part of the Personal Corp framework — running a one-person business through AI agents.
Structure raw feedback into a decision-driving insight report. Built-in classification, sentiment, theme clustering, NPS, trend analysis, source triangulation, and persona extraction.
Inputs
| Field |
Required |
Notes |
| Feedback data |
yes |
Excel / CSV / pasted text / review screenshots |
| Purpose |
no |
Product improvement / satisfaction / topic-specific (e.g. post-launch reaction); default product improvement |
| Time range |
no |
For freshness tagging and trend analysis |
| Source channels |
no |
Multiple channels enable triangulation |
Mode: ≤ 20 items → close-read mode (item-by-item with detailed reading); > 20 → statistical mode (auto-classify + aggregated report).
Step 1 — Pre-process data
- Drop exact duplicates
- Merge near-duplicates (similarity > 90%), record merge count
- Ultra-short items (< 5 chars, no substance like "good"/"bad") → counted separately, not in deep analysis
- If a rating column exists (1-10 or 1-5 stars) → extract for NPS
- Identify source channel (in-app feedback, app store, support ticket, social media, etc.)
Step 2 — Classification
Six-category taxonomy:
| Category |
Criterion |
Example |
| Feature request |
User wants something not yet built |
"I'd like batch export" |
| Bug report |
Existing feature behaves incorrectly |
"Save button loses my data" |
| Usage question |
User can't find or doesn't know how |
"How do I change my password?" |
| UX complaint |
Feature exists but experience is poor |
"Loading is too slow" / "UI too cluttered" |
| Positive review |
Satisfaction, praise, recommendation |
"Love this feature!" |
| Other |
Unclassifiable or off-topic |
Spam, ads, noise |
When ambiguous (one item spans multiple), tag primary + secondary.
Step 3 — Sentiment analysis
| Sentiment |
Signals |
Calibration |
| Positive |
Likes, praise, recommends, thanks |
Pure factual praise ("works") = neutral, not positive |
| Neutral |
Statement of fact, question, calm suggestion |
Feature requests = neutral by default unless angry |
| Negative |
Complaint, anger, disappointment, threats |
"I wish you supported X" = neutral; "Why don't you support X yet?" = negative |
Negative-intensity grading:
- Mild: calm dissatisfaction ("not very convenient")
- Medium: explicit disappointment ("very disappointed", "bad experience")
- Severe: threats ("I'll uninstall if not fixed", "I'll file a complaint") → high-priority handling
Step 4 — Theme clustering
Apply two methods to extract core themes.
Method A — Affinity mapping:
- Split observations: decompose each feedback item into independent observation cards
- Natural cluster: group by similarity without preset labels — let themes emerge
- Name themes: label each cluster ("payment flow friction", "search results irrelevant")
- Identify hierarchy: group small clusters under larger themes (e.g. "payment friction" + "long refund cycle" → "transaction experience")
- Flag outliers: items that fit no cluster — possible early signals
Method B — Thematic coding:
- Open coding: tag each item with descriptive labels ("slow load", "crash", "hidden entry point")
- Axial coding: group descriptive labels into abstract themes ("slow load" + "crash" → "performance issues")
- Selective coding: identify core themes and their relationships
- Quantify frequency: count mentions and share per theme
Cluster output:
| Theme |
Sub-theme |
Mentions |
Share |
Representative quote |
| {theme 1} |
{sub-a} |
{N} |
{X%} |
"verbatim quote" |
Step 5 — NPS analysis (if rating data exists)
- NPS = % Promoters (9-10) − % Detractors (0-6)
- Industry benchmarks: SaaS avg 30-40, consumer apps avg 20-30
- 5-star → 10-pt mapping: 5★=10, 4★=8, 3★=6, 2★=4, 1★=2
Step 6 — Trend analysis (if time data exists)
MoM (or WoW) change calculation:
- Aggregate by week or month per category
- Growth rate = (current − previous) / previous × 100%
- Watch for > 30% changes — flag as "needs attention"
Inflection-point detection:
- 3+ consecutive periods in one direction → established trend
- Sudden direction reversal → trigger investigation
- Correlate with external events: releases, campaigns, competitor moves
Trend output:
- Time-series description per category
- Mark significant changes + likely cause
- Early-warning: which metrics are deteriorating, which improving
Step 7 — Triangulation
When data spans multiple channels, cross-validate to lift confidence.
Method triangulation: same problem confirmed by different methods
- e.g. theme cluster says "slow load = top pain" → check if NPS detractors' open-ended answers also concentrate on performance
Source triangulation: same finding across channels
- App-store complaints + support tickets + community chatter all cite "crash" → high confidence
- Single-channel finding → tag "single-source, needs validation"
Time triangulation: persistence of the same problem
3 weeks consistent → systemic
- One-off → likely transient or already fixed
Confidence tiers:
| Tier |
Conditions |
Tag |
| High |
Multi-source + multi-method + persistent |
Decision-ready |
| Medium |
2 of the 3 dimensions support |
Recommend more data before deciding |
| Low |
Single source or single method |
Reference only, validate further |
Step 8 — Persona extraction
Identify typical user types from the feedback corpus.
Method:
- Behavior cluster: infer user types (newbie / veteran / power user / occasional)
- Need cluster: which users care about efficiency, which about experience, which about price
- Sentiment cluster: loyal advocates / silent users / vocal complainers / churn-edge
Persona template:
[Persona name]: {one-sentence description}
- Typical traits: {usage frequency, focus, behavior pattern}
- Core need: {primary concern}
- Main pain: {recurring problem}
- Feedback style: {how they express}
- Estimated share: {% of feedback corpus}
- Quote: "{verbatim}"
Cap at 3-5 personas — more loses actionability.
Step 9 — Pain-point ranking
Pain priority = Frequency × Severity × User weight × Confidence
| Dimension |
Scoring |
| Frequency |
High (> 10) = 3, Medium (3-10) = 2, Low (< 3) = 1 |
| Severity |
Critical (feature broken) = 3, Severe (blocks core flow) = 2, Mild (annoying but usable) = 1 |
| User weight |
Paying = 1.5, Free = 1.0 (or 1.0 if no segmentation data) |
| Confidence |
High (triangulated) = 1.2, Medium = 1.0, Low (single source) = 0.8 |
Sort descending; output Top 10.
Step 10 — Generate report
# User Feedback Analysis Report
**Period:** {date range}
**Total feedback:** {N} (after dedup: {M})
**Sources:** {channel list}
## 1. Classification
| Category | Count | Share | MoM change (if available) |
|---|---|---|---|
## 2. Sentiment
**Positive:** {X}% | **Neutral:** {Y}% | **Negative:** {Z}%
(Negative breakdown: mild {a} / medium {b} / severe {c})
## 3. Themes
| Theme | Sub-theme | Mentions | Share | Confidence |
|---|---|---|---|---|
## 4. NPS (if rating data)
**Score:** {n} (Promoters {X}% − Detractors {Y}%)
**Benchmark:** {above/below} industry by {Δ}
## 5. Trends (if time data)
- Significant rises: {category}, +{X}% MoM
- Significant drops: {category}, −{X}% MoM
- Inflection events: {description}
## 6. Top 10 Pain Points
| Rank | Pain | Freq | Severity | Confidence | Score | Quote | Recommendation |
|---|---|---|---|---|---|---|---|
## 7. Personas
<!-- 3-5 personas -->
## 8. Key Insights
<!-- Each insight: finding + data + confidence + meaning -->
1. {insight 1}
2. {insight 2}
3. {insight 3}
## 9. Improvement Recommendations
| Priority | Recommendation | Linked pain | Expected impact | Validation method |
|---|---|---|---|---|
## 10. Statistical Notes
- Classification confidence: {high/medium} (sample {N})
- Ambiguous classifications: {count}
- Triangulation coverage: {X%} of findings multi-source verified
- Validity: {sufficient sample / limited sample, results reference-only}
Quality bar
- Classifications grounded; ambiguous items tag confidence
- Insights backed by numbers; every insight cites a count
- Recommendations actionable to feature level
- Sample < 50 → tag "limited sample, results reference-only"
- Stats computed via code for accuracy
- Sentiment runs through calibration rules
- Theme clusters MECE (mutually exclusive, collectively exhaustive)
- Triangulation tier explicit per finding
Red lines
- No over-extrapolation — 3 of 20 items mention X ≠ "many users say X"
- Preserve verbatim — every pain point includes a representative quote for traceability
- No fabricated trends — no MoM analysis without history
- No invented personas — personas grounded in cluster results, not imagined
When input is incomplete
- < 10 items → close-read each; skip statistics (sample too small)
- No source/time info → analyze, but tag "missing source/time, recommend supplementing"; skip trend + triangulation
- Mixed languages → group by language, analyze separately
- Single-source → analyze, but tag "single source, recommend cross-channel validation"
Related skills
/pm-prioritize — feature requests from feedback → RICE-rank
/pm-prd — high-frequency requests → PRDs
/pm-competitive — competitor mentions in feedback → enrich competitor study
/pm-metrics — cross-validate feedback trends with product metrics
1---2name: pm-feedback3description: Классифицирует пользовательский фидбек (Excel/CSV/текст) по 6 категориям, делает sentiment-анализ, кластеризацию тем, анализ трендов, триангуляцию по источникам, расчёт NPS и извлечение персон. На выходе — Top-10 болей с рекомендациями к действию. User-invoked only — do NOT auto-trigger. Triggers on /pm-feedback, "анализ обратной связи", "разбор отзывов", "анализ NPS", "analyze user feedback", "VOC analysis", "NPS analysis", "review analysis".4---5
6# pm-feedback — User feedback analysis
7
8
9Part of the Personal Corp framework — running a one-person business through AI agents.
10Structure raw feedback into a decision-driving insight report. Built-in classification, sentiment, theme clustering, NPS, trend analysis, source triangulation, and persona extraction.
11
12## Inputs
13
14| Field | Required | Notes |
15|---|---|---|
16| Feedback data | yes | Excel / CSV / pasted text / review screenshots |
17| Purpose | no | Product improvement / satisfaction / topic-specific (e.g. post-launch reaction); default product improvement |
18| Time range | no | For freshness tagging and trend analysis |
19| Source channels | no | Multiple channels enable triangulation |
20
21**Mode:** ≤ 20 items → close-read mode (item-by-item with detailed reading); > 20 → statistical mode (auto-classify + aggregated report).
22
23## Step 1 — Pre-process data
24
25- Drop exact duplicates
26- Merge near-duplicates (similarity > 90%), record merge count
27- Ultra-short items (< 5 chars, no substance like "good"/"bad") → counted separately, not in deep analysis
28- If a rating column exists (1-10 or 1-5 stars) → extract for NPS
29- Identify source channel (in-app feedback, app store, support ticket, social media, etc.)
30
31## Step 2 — Classification
32
33**Six-category taxonomy:**
34
35| Category | Criterion | Example |
36|---|---|---|
37| **Feature request** | User wants something not yet built | "I'd like batch export" |
38| **Bug report** | Existing feature behaves incorrectly | "Save button loses my data" |
39| **Usage question** | User can't find or doesn't know how | "How do I change my password?" |
40| **UX complaint** | Feature exists but experience is poor | "Loading is too slow" / "UI too cluttered" |
41| **Positive review** | Satisfaction, praise, recommendation | "Love this feature!" |
42| **Other** | Unclassifiable or off-topic | Spam, ads, noise |
43
44When ambiguous (one item spans multiple), tag primary + secondary.
45
46## Step 3 — Sentiment analysis
47
48| Sentiment | Signals | Calibration |
49|---|---|---|
50| **Positive** | Likes, praise, recommends, thanks | Pure factual praise ("works") = neutral, not positive |
51| **Neutral** | Statement of fact, question, calm suggestion | Feature requests = neutral by default unless angry |
52| **Negative** | Complaint, anger, disappointment, threats | "I wish you supported X" = neutral; "Why don't you support X yet?" = negative |
53
54**Negative-intensity grading:**
55- **Mild:** calm dissatisfaction ("not very convenient")
56- **Medium:** explicit disappointment ("very disappointed", "bad experience")
57- **Severe:** threats ("I'll uninstall if not fixed", "I'll file a complaint") → high-priority handling
58
59## Step 4 — Theme clustering
60
61Apply two methods to extract core themes.
62
63**Method A — Affinity mapping:**
64
651. **Split observations:** decompose each feedback item into independent observation cards
662. **Natural cluster:** group by similarity without preset labels — let themes emerge
673. **Name themes:** label each cluster ("payment flow friction", "search results irrelevant")
684. **Identify hierarchy:** group small clusters under larger themes (e.g. "payment friction" + "long refund cycle" → "transaction experience")
695. **Flag outliers:** items that fit no cluster — possible early signals
70
71**Method B — Thematic coding:**
72
731. **Open coding:** tag each item with descriptive labels ("slow load", "crash", "hidden entry point")
742. **Axial coding:** group descriptive labels into abstract themes ("slow load" + "crash" → "performance issues")
753. **Selective coding:** identify core themes and their relationships
764. **Quantify frequency:** count mentions and share per theme
77
78**Cluster output:**
79
80| Theme | Sub-theme | Mentions | Share | Representative quote |
81|---|---|---|---|---|
82| {theme 1} | {sub-a} | {N} | {X%} | "verbatim quote" |
83
84## Step 5 — NPS analysis (if rating data exists)
85
86- **NPS = % Promoters (9-10) − % Detractors (0-6)**
87- Industry benchmarks: SaaS avg 30-40, consumer apps avg 20-30
88- 5-star → 10-pt mapping: 5★=10, 4★=8, 3★=6, 2★=4, 1★=2
89
90## Step 6 — Trend analysis (if time data exists)
91
92**MoM (or WoW) change calculation:**
93- Aggregate by week or month per category
94- Growth rate = (current − previous) / previous × 100%
95- Watch for > 30% changes — flag as "needs attention"
96
97**Inflection-point detection:**
98- 3+ consecutive periods in one direction → established trend
99- Sudden direction reversal → trigger investigation
100- Correlate with external events: releases, campaigns, competitor moves
101
102**Trend output:**
103- Time-series description per category
104- Mark significant changes + likely cause
105- Early-warning: which metrics are deteriorating, which improving
106
107## Step 7 — Triangulation
108
109When data spans multiple channels, cross-validate to lift confidence.
110
111**Method triangulation:** same problem confirmed by different methods
112- e.g. theme cluster says "slow load = top pain" → check if NPS detractors' open-ended answers also concentrate on performance
113
114**Source triangulation:** same finding across channels
115- App-store complaints + support tickets + community chatter all cite "crash" → high confidence
116- Single-channel finding → tag "single-source, needs validation"
117
118**Time triangulation:** persistence of the same problem
119- > 3 weeks consistent → systemic
120- One-off → likely transient or already fixed
121
122**Confidence tiers:**
123
124| Tier | Conditions | Tag |
125|---|---|---|
126| **High** | Multi-source + multi-method + persistent | Decision-ready |
127| **Medium** | 2 of the 3 dimensions support | Recommend more data before deciding |
128| **Low** | Single source or single method | Reference only, validate further |
129
130## Step 8 — Persona extraction
131
132Identify typical user types from the feedback corpus.
133
134**Method:**
1351. **Behavior cluster:** infer user types (newbie / veteran / power user / occasional)
1362. **Need cluster:** which users care about efficiency, which about experience, which about price
1373. **Sentiment cluster:** loyal advocates / silent users / vocal complainers / churn-edge
138
139**Persona template:**
140```
141[Persona name]: {one-sentence description}
142- Typical traits: {usage frequency, focus, behavior pattern}
143- Core need: {primary concern}
144- Main pain: {recurring problem}
145- Feedback style: {how they express}
146- Estimated share: {% of feedback corpus}
147- Quote: "{verbatim}"
148```
149
150Cap at 3-5 personas — more loses actionability.
151
152## Step 9 — Pain-point ranking
153
154**Pain priority = Frequency × Severity × User weight × Confidence**
155
156| Dimension | Scoring |
157|---|---|
158| **Frequency** | High (> 10) = 3, Medium (3-10) = 2, Low (< 3) = 1 |
159| **Severity** | Critical (feature broken) = 3, Severe (blocks core flow) = 2, Mild (annoying but usable) = 1 |
160| **User weight** | Paying = 1.5, Free = 1.0 (or 1.0 if no segmentation data) |
161| **Confidence** | High (triangulated) = 1.2, Medium = 1.0, Low (single source) = 0.8 |
162
163Sort descending; output Top 10.
164
165## Step 10 — Generate report
166
167```markdown
168# User Feedback Analysis Report
169
170**Period:** {date range}
171**Total feedback:** {N} (after dedup: {M})
172**Sources:** {channel list}
173
174## 1. Classification
175| Category | Count | Share | MoM change (if available) |
176|---|---|---|---|
177
178## 2. Sentiment
179**Positive:** {X}% | **Neutral:** {Y}% | **Negative:** {Z}%
180(Negative breakdown: mild {a} / medium {b} / severe {c})
181
182## 3. Themes
183| Theme | Sub-theme | Mentions | Share | Confidence |
184|---|---|---|---|---|
185
186## 4. NPS (if rating data)
187**Score:** {n} (Promoters {X}% − Detractors {Y}%)
188**Benchmark:** {above/below} industry by {Δ}
189
190## 5. Trends (if time data)
191- Significant rises: {category}, +{X}% MoM
192- Significant drops: {category}, −{X}% MoM
193- Inflection events: {description}
194
195## 6. Top 10 Pain Points
196| Rank | Pain | Freq | Severity | Confidence | Score | Quote | Recommendation |
197|---|---|---|---|---|---|---|---|
198
199## 7. Personas
200<!-- 3-5 personas -->
201
202## 8. Key Insights
203<!-- Each insight: finding + data + confidence + meaning -->
2041. {insight 1}
2052. {insight 2}
2063. {insight 3}
207
208## 9. Improvement Recommendations
209| Priority | Recommendation | Linked pain | Expected impact | Validation method |
210|---|---|---|---|---|
211
212## 10. Statistical Notes
213- Classification confidence: {high/medium} (sample {N})
214- Ambiguous classifications: {count}
215- Triangulation coverage: {X%} of findings multi-source verified
216- Validity: {sufficient sample / limited sample, results reference-only}
217```
218
219## Quality bar
220
2211. Classifications grounded; ambiguous items tag confidence
2222. Insights backed by numbers; every insight cites a count
2233. Recommendations actionable to feature level
2244. Sample < 50 → tag "limited sample, results reference-only"
2255. Stats computed via code for accuracy
2266. Sentiment runs through calibration rules
2277. Theme clusters MECE (mutually exclusive, collectively exhaustive)
2288. Triangulation tier explicit per finding
229
230## Red lines
231
2321. **No over-extrapolation** — 3 of 20 items mention X ≠ "many users say X"
2332. **Preserve verbatim** — every pain point includes a representative quote for traceability
2343. **No fabricated trends** — no MoM analysis without history
2354. **No invented personas** — personas grounded in cluster results, not imagined
236
237## When input is incomplete
238
239- **< 10 items** → close-read each; skip statistics (sample too small)
240- **No source/time info** → analyze, but tag "missing source/time, recommend supplementing"; skip trend + triangulation
241- **Mixed languages** → group by language, analyze separately
242- **Single-source** → analyze, but tag "single source, recommend cross-channel validation"
243
244## Related skills
245
246- `/pm-prioritize` — feature requests from feedback → RICE-rank
247- `/pm-prd` — high-frequency requests → PRDs
248- `/pm-competitive` — competitor mentions in feedback → enrich competitor study
249- `/pm-metrics` — cross-validate feedback trends with product metrics
250