
Product Manager Toolkit
- 896 installs
- 23.5k repo stars
- Updated July 17, 2026
- alirezarezvani/claude-skills
product-manager-toolkit is a planning skill that generates structured Product Requirements Documents turning vague ideas into clear, prioritized specifications for developers and agents who need executable product scope
About
product-manager-toolkit is a PRD generation skill from alirezarezvani/claude-skills that structures product discovery into agent-executable documents. The template includes document metadata fields for author, draft or approved status, created and updated dates, reviewers, and target release quarter. Core sections cover problem statement with user pain focus, affected user segments, evidence links from interviews, support tickets, analytics, or churn analysis, and quantified impact if the problem goes unsolved. Developers and product leads reach for product-manager-toolkit when an idea lacks clear requirements, priorities, or success criteria before agents or engineers write code. Output PRDs give coding agents concrete scope, acceptance framing, and review checkpoints instead of ambiguous feature requests.
- Generates complete PRD templates with problem statement, user stories, solution overview, success metrics and technical
- Enforces standardized sections including evidence-based validation and priority-ranked user stories
- Produces artifacts that serve as hard-gate before implementation work begins
- Includes success metrics and risk assessment fields for every project
- Creates handoff-ready specs that feed directly into implementation planning
Product Manager Toolkit by the numbers
- 896 all-time installs (skills.sh)
- +12 installs in the week ending Jul 29, 2026 (Skillselion tracking)
- Ranked #528 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 31, 2026 (Skillselion catalog sync)
npx skills add https://github.com/alirezarezvani/claude-skills --skill product-manager-toolkitAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 896 |
|---|---|
| repo stars | ★ 23.5k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 17, 2026 |
| Repository | alirezarezvani/claude-skills ↗ |
How do you write a PRD agents can execute?
Generate structured Product Requirements Documents that turn vague ideas into clear, prioritized specs an agent can execute.
Who is it for?
Developers or tech leads scoping features who need a PRD template with problem, evidence, and priority sections before coding starts.
Skip if: Teams with an approved PRD already in place who only need implementation or code review without replanning scope.
When should I use this skill?
A feature idea is vague, lacks prioritized requirements, or the developer asks for a PRD before agent-driven implementation.
What you get
A structured Product Requirements Document with problem statement, user segments, evidence, priorities, and target release metadata.
- Product Requirements Document
- Prioritized requirement list
By the numbers
- PRD template includes author, status, reviewers, and target release metadata fields
Files
Product Manager Toolkit
Essential tools and frameworks for modern product management, from discovery to delivery.
---
Table of Contents
- Quick Start
- Core Workflows
- Feature Prioritization
- Customer Discovery
- PRD Development
- Tools Reference
- RICE Prioritizer
- Customer Interview Analyzer
- Input/Output Examples
- Integration Points
- Common Pitfalls
---
Quick Start
For Feature Prioritization
# Create sample data file
python scripts/rice_prioritizer.py sample
# Run prioritization with team capacity
python scripts/rice_prioritizer.py sample_features.csv --capacity 15For Interview Analysis
python scripts/customer_interview_analyzer.py interview_transcript.txtFor PRD Creation
1. Choose template from references/prd_templates.md 2. Fill sections based on discovery work 3. Review with engineering for feasibility 4. Version control in project management tool
---
Core Workflows
Feature Prioritization Process
Gather → Score → Analyze → Plan → Validate → ExecuteStep 1: Gather Feature Requests
- Customer feedback (support tickets, interviews)
- Sales requests (CRM pipeline blockers)
- Technical debt (engineering input)
- Strategic initiatives (leadership goals)
Step 2: Score with RICE
# Input: CSV with features
python scripts/rice_prioritizer.py features.csv --capacity 20See references/frameworks.md for RICE formula and scoring guidelines.
Step 3: Analyze Portfolio
Review the tool output for:
- Quick wins vs big bets distribution
- Effort concentration (avoid all XL projects)
- Strategic alignment gaps
Step 4: Generate Roadmap
- Quarterly capacity allocation
- Dependency identification
- Stakeholder communication plan
Step 5: Validate Results
Before finalizing the roadmap:
- [ ] Compare top priorities against strategic goals
- [ ] Run sensitivity analysis (what if estimates are wrong by 2x?)
- [ ] Review with key stakeholders for blind spots
- [ ] Check for missing dependencies between features
- [ ] Validate effort estimates with engineering
Step 6: Execute and Iterate
- Share roadmap with team
- Track actual vs estimated effort
- Revisit priorities quarterly
- Update RICE inputs based on learnings
---
Customer Discovery Process
Plan → Recruit → Interview → Analyze → Synthesize → ValidateStep 1: Plan Research
- Define research questions
- Identify target segments
- Create interview script (see
references/frameworks.md)
Step 2: Recruit Participants
- 5-8 interviews per segment
- Mix of power users and churned users
- Incentivize appropriately
Step 3: Conduct Interviews
- Use semi-structured format
- Focus on problems, not solutions
- Record with permission
- Take minimal notes during interview
Step 4: Analyze Insights
python scripts/customer_interview_analyzer.py transcript.txtExtracts:
- Pain points with severity
- Feature requests with priority
- Jobs to be done patterns
- Sentiment and key themes
- Notable quotes
Step 5: Synthesize Findings
- Group similar pain points across interviews
- Identify patterns (3+ mentions = pattern)
- Map to opportunity areas using Opportunity Solution Tree
- Prioritize opportunities by frequency and severity
Step 6: Validate Solutions
Before building:
- [ ] Create solution hypotheses (see
references/frameworks.md) - [ ] Test with low-fidelity prototypes
- [ ] Measure actual behavior vs stated preference
- [ ] Iterate based on feedback
- [ ] Document learnings for future research
---
PRD Development Process
Scope → Draft → Review → Refine → Approve → TrackStep 1: Choose Template
Select from references/prd_templates.md:
| Template | Use Case | Timeline |
|---|---|---|
| Standard PRD | Complex features, cross-team | 6-8 weeks |
| One-Page PRD | Simple features, single team | 2-4 weeks |
| Feature Brief | Exploration phase | 1 week |
| Agile Epic | Sprint-based delivery | Ongoing |
Step 2: Draft Content
- Lead with problem statement
- Define success metrics upfront
- Explicitly state out-of-scope items
- Include wireframes or mockups
Step 3: Review Cycle
- Engineering: feasibility and effort
- Design: user experience gaps
- Sales: market validation
- Support: operational impact
Step 4: Refine Based on Feedback
- Address technical constraints
- Adjust scope to fit timeline
- Document trade-off decisions
Step 5: Approval and Kickoff
- Stakeholder sign-off
- Sprint planning integration
- Communication to broader team
Step 6: Track Execution
After launch:
- [ ] Compare actual metrics vs targets
- [ ] Conduct user feedback sessions
- [ ] Document what worked and what didn't
- [ ] Update estimation accuracy data
- [ ] Share learnings with team
---
Tools Reference
RICE Prioritizer
Advanced RICE framework implementation with portfolio analysis.
Features:
- RICE score calculation with configurable weights
- Portfolio balance analysis (quick wins vs big bets)
- Quarterly roadmap generation based on capacity
- Multiple output formats (text, JSON, CSV)
CSV Input Format:
name,reach,impact,confidence,effort,description
User Dashboard Redesign,5000,high,high,l,Complete redesign
Mobile Push Notifications,10000,massive,medium,m,Add push support
Dark Mode,8000,medium,high,s,Dark theme optionCommands:
# Create sample data
python scripts/rice_prioritizer.py sample
# Run with default capacity (10 person-months)
python scripts/rice_prioritizer.py features.csv
# Custom capacity
python scripts/rice_prioritizer.py features.csv --capacity 20
# JSON output for integration
python scripts/rice_prioritizer.py features.csv --output json
# CSV output for spreadsheets
python scripts/rice_prioritizer.py features.csv --output csv---
Customer Interview Analyzer
NLP-based interview analysis for extracting actionable insights.
Capabilities:
- Pain point extraction with severity assessment
- Feature request identification and classification
- Jobs-to-be-done pattern recognition
- Sentiment analysis per section
- Theme and quote extraction
- Competitor mention detection
Commands:
# Analyze interview transcript
python scripts/customer_interview_analyzer.py interview.txt
# JSON output for aggregation
python scripts/customer_interview_analyzer.py interview.txt json---
Input/Output Examples
→ See references/input-output-examples.md for details
Integration Points
Compatible tools and platforms:
| Category | Platforms |
|---|---|
| Analytics | Amplitude, Mixpanel, Google Analytics |
| Roadmapping | ProductBoard, Aha!, Roadmunk, Productplan |
| Design | Figma, Sketch, Miro |
| Development | Jira, Linear, GitHub, Asana |
| Research | Dovetail, UserVoice, Pendo, Maze |
| Communication | Slack, Notion, Confluence |
JSON export enables integration with most tools:
# Export for Jira import
python scripts/rice_prioritizer.py features.csv --output json > priorities.json
# Export for dashboard
python scripts/customer_interview_analyzer.py interview.txt json > insights.json---
Common Pitfalls to Avoid
| Pitfall | Description | Prevention |
|---|---|---|
| Solution-First | Jumping to features before understanding problems | Start every PRD with problem statement |
| Analysis Paralysis | Over-researching without shipping | Set time-boxes for research phases |
| Feature Factory | Shipping features without measuring impact | Define success metrics before building |
| Ignoring Tech Debt | Not allocating time for platform health | Reserve 20% capacity for maintenance |
| Stakeholder Surprise | Not communicating early and often | Weekly async updates, monthly demos |
| Metric Theater | Optimizing vanity metrics over real value | Tie metrics to user value delivered |
---
Best Practices
Writing Great PRDs:
- Start with the problem, not the solution
- Include clear success metrics upfront
- Explicitly state what's out of scope
- Use visuals (wireframes, flows, diagrams)
- Keep technical details in appendix
- Version control all changes
Effective Prioritization:
- Mix quick wins with strategic bets
- Consider opportunity cost of delays
- Account for dependencies between features
- Buffer 20% for unexpected work
- Revisit priorities quarterly
- Communicate decisions with context
Customer Discovery:
- Ask "why" five times to find root cause
- Focus on past behavior, not future intentions
- Avoid leading questions ("Wouldn't you love...")
- Interview in the user's natural environment
- Watch for emotional reactions (pain = opportunity)
- Validate qualitative with quantitative data
---
Quick Reference
# Prioritization
python scripts/rice_prioritizer.py features.csv --capacity 15
# Interview Analysis
python scripts/customer_interview_analyzer.py interview.txt
# Generate sample data
python scripts/rice_prioritizer.py sample
# JSON outputs
python scripts/rice_prioritizer.py features.csv --output json
python scripts/customer_interview_analyzer.py interview.txt json---
Reference Documents
references/prd_templates.md- PRD templates for different contextsreferences/frameworks.md- Detailed framework documentation (RICE, MoSCoW, Kano, JTBD, etc.)
Product Requirements Document (PRD)
Document Info
| Field | Value |
|---|---|
| Author | [Your Name] |
| Status | Draft / In Review / Approved |
| Created | YYYY-MM-DD |
| Last Updated | YYYY-MM-DD |
| Reviewers | [Names] |
| Target Release | [Quarter or Date] |
---
Problem Statement
What problem are we solving?
[Describe the user problem in 2-3 sentences. Focus on the pain, not the solution.]
Who is affected?
[Identify the user segment(s) experiencing this problem.]
How do we know this is a problem?
[Link to evidence: interview insights, support tickets, analytics data, churn analysis.]
What happens if we do nothing?
[Quantify the cost of inaction: lost revenue, churn risk, competitive disadvantage.]
---
User Stories
| # | As a... | I want to... | So that... | Priority |
|---|---|---|---|---|
| 1 | [role] | [capability] | [benefit] | Must Have |
| 2 | [role] | [capability] | [benefit] | Should Have |
| 3 | [role] | [capability] | [benefit] | Nice to Have |
---
Solution Overview
Proposed Solution
[High-level description of what we will build. 3-5 sentences.]
Key User Flows
[Describe the primary user interactions. Include wireframes or mockups if available.]
1. Flow 1: [Description] 2. Flow 2: [Description] 3. Flow 3: [Description]
How It Works
[Explain the mechanism or approach. Include technical considerations if relevant.]
---
Success Metrics
| Metric | Current | Target | Timeframe |
|---|---|---|---|
| [Primary metric] | [Baseline] | [Goal] | [When] |
| [Secondary metric] | [Baseline] | [Goal] | [When] |
| [Guardrail metric] | [Baseline] | [Must not worsen] | [When] |
How We Will Measure
[Describe tracking approach: analytics events, surveys, A/B test design.]
---
Technical Requirements
System Requirements
- [Requirement 1: e.g., API response time < 200ms]
- [Requirement 2: e.g., Support 10K concurrent users]
- [Requirement 3: e.g., Mobile responsive]
Dependencies
- [Dependency 1: e.g., Payment service API update]
- [Dependency 2: e.g., Design system component]
Security & Privacy
- [Data handling requirements]
- [Authentication/authorization needs]
- [Compliance considerations]
---
Timeline
| Phase | Dates | Deliverables |
|---|---|---|
| Design | [Start - End] | Wireframes, user flows, design specs |
| Development | [Start - End] | Feature implementation, unit tests |
| QA | [Start - End] | Test plan execution, bug fixes |
| Beta | [Start - End] | Limited rollout, feedback collection |
| GA | [Date] | Full release, documentation, training |
---
Risks
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| [Risk 1] | High/Med/Low | High/Med/Low | [Plan] |
| [Risk 2] | High/Med/Low | High/Med/Low | [Plan] |
---
Out of Scope
The following items are explicitly NOT included in this release:
- [Item 1: brief explanation of why]
- [Item 2: brief explanation of why]
- [Item 3: brief explanation of why]
---
Decision Log
| # | Decision | Date | Decided By | Rationale |
|---|---|---|---|---|
| 1 | [Decision] | [Date] | [Name] | [Why] |
---
Change History
| Version | Date | Author | Changes |
|---|---|---|---|
| 0.1 | [Date] | [Name] | Initial draft |
feature,reach,impact,confidence,effort
Example Feature 1,500,3,0.8,5
Example Feature 2,1000,2,0.9,3
Example Feature 3,300,1,1.0,2
Product Management Frameworks
Comprehensive reference for prioritization, discovery, and measurement frameworks.
---
Table of Contents
- Prioritization Frameworks
- RICE Framework
- Value vs Effort Matrix
- MoSCoW Method
- ICE Scoring
- Kano Model
- Discovery Frameworks
- Customer Interview Guide
- Hypothesis Template
- Opportunity Solution Tree
- Jobs to Be Done
- Metrics Frameworks
- North Star Metric
- HEART Framework
- Funnel Analysis
- Feature Success Metrics
- Strategic Frameworks
- Product Vision Template
- Competitive Analysis
- Go-to-Market Checklist
---
Prioritization Frameworks
RICE Framework
Formula:
RICE Score = (Reach × Impact × Confidence) / EffortComponents:
| Component | Description | Values |
|---|---|---|
| Reach | Users affected per quarter | Numeric count (e.g., 5000) |
| Impact | Effect on each user | massive=3x, high=2x, medium=1x, low=0.5x, minimal=0.25x |
| Confidence | Certainty in estimates | high=100%, medium=80%, low=50% |
| Effort | Person-months required | xl=13, l=8, m=5, s=3, xs=1 |
Example Calculation:
Feature: Mobile Push Notifications
Reach: 10,000 users
Impact: massive (3x)
Confidence: medium (80%)
Effort: medium (5 person-months)
RICE = (10,000 × 3 × 0.8) / 5 = 4,800Interpretation Guidelines:
- 1000+: High priority - strong candidates for next quarter
- 500-999: Medium priority - consider for roadmap
- 100-499: Low priority - keep in backlog
- <100: Deprioritize - requires new data to reconsider
When to Use RICE:
- Quarterly roadmap planning
- Comparing features across different product areas
- Communicating priorities to stakeholders
- Resolving prioritization debates with data
RICE Limitations:
- Requires reasonable estimates (garbage in, garbage out)
- Doesn't account for dependencies
- May undervalue platform investments
- Reach estimates can be gaming-prone
---
Value vs Effort Matrix
Low Effort High Effort
+--------------+------------------+
High Value | QUICK WINS | BIG BETS |
| [Do First] | [Strategic] |
+--------------+------------------+
Low Value | FILL-INS | TIME SINKS |
| [Maybe] | [Avoid] |
+--------------+------------------+Quadrant Definitions:
| Quadrant | Characteristics | Action |
|---|---|---|
| Quick Wins | High impact, low effort | Prioritize immediately |
| Big Bets | High impact, high effort | Plan strategically, validate ROI |
| Fill-Ins | Low impact, low effort | Use to fill sprint gaps |
| Time Sinks | Low impact, high effort | Avoid unless required |
Portfolio Balance:
- Ideal mix: 40% Quick Wins, 30% Big Bets, 20% Fill-Ins, 10% Buffer
- Review balance quarterly
- Adjust based on team morale and strategic goals
---
MoSCoW Method
| Category | Definition | Sprint Allocation |
|---|---|---|
| Must Have | Critical for launch; product fails without it | 60% of capacity |
| Should Have | Important but workarounds exist | 20% of capacity |
| Could Have | Desirable enhancements | 10% of capacity |
| Won't Have | Explicitly out of scope (this release) | 0% - documented |
Decision Criteria for "Must Have":
- Regulatory/legal requirement
- Core user job cannot be completed without it
- Explicitly promised to customers
- Security or data integrity requirement
Common Mistakes:
- Everything becomes "Must Have" (scope creep)
- Not documenting "Won't Have" items
- Treating "Should Have" as optional (they're important)
- Forgetting to revisit for next release
---
ICE Scoring
Formula:
ICE Score = (Impact + Confidence + Ease) / 3| Component | Scale | Description |
|---|---|---|
| Impact | 1-10 | Expected effect on key metric |
| Confidence | 1-10 | How sure are you about impact? |
| Ease | 1-10 | How easy to implement? |
When to Use ICE vs RICE:
- ICE: Early-stage exploration, quick estimates
- RICE: Quarterly planning, cross-team prioritization
---
Kano Model
Categories of feature satisfaction:
| Type | Absent | Present | Priority |
|---|---|---|---|
| Basic (Must-Be) | Dissatisfied | Neutral | High - table stakes |
| Performance (Linear) | Neutral | Satisfied proportionally | Medium - differentiation |
| Excitement (Delighter) | Neutral | Very satisfied | Strategic - competitive edge |
| Indifferent | Neutral | Neutral | Low - skip unless cheap |
| Reverse | Satisfied | Dissatisfied | Avoid - remove if exists |
Feature Classification Questions: 1. How would you feel if the product HAS this feature? 2. How would you feel if the product DOES NOT have this feature?
---
Discovery Frameworks
Customer Interview Guide
Structure (35 minutes total):
1. CONTEXT QUESTIONS (5 min)
└── Build rapport, understand role
2. PROBLEM EXPLORATION (15 min)
└── Dig into pain points
3. SOLUTION VALIDATION (10 min)
└── Test concepts if applicable
4. WRAP-UP (5 min)
└── Referrals, follow-upDetailed Script:
Phase 1: Context (5 min)
"Thanks for taking the time. Before we dive in..."
- What's your role and how long have you been in it?
- Walk me through a typical day/week.
- What tools do you use for [relevant task]?Phase 2: Problem Exploration (15 min)
"I'd love to understand the challenges you face with [area]..."
- What's the hardest part about [task]?
- Can you tell me about the last time you struggled with this?
- What did you do? What happened?
- How often does this happen?
- What does it cost you (time, money, frustration)?
- What have you tried to solve it?
- Why didn't those solutions work?Phase 3: Solution Validation (10 min)
"Based on what you've shared, I'd like to get your reaction to an idea..."
[Show prototype/concept - keep it rough to invite honest feedback]
- What's your initial reaction?
- How does this compare to what you do today?
- What would prevent you from using this?
- How much would this be worth to you?
- Who else would need to approve this purchase?Phase 4: Wrap-up (5 min)
"This has been incredibly helpful..."
- Anything else I should have asked?
- Who else should I talk to about this?
- Can I follow up if I have more questions?Interview Best Practices:
- Never ask "would you use this?" (people lie about future behavior)
- Ask about past behavior: "Tell me about the last time..."
- Embrace silence - count to 7 before filling gaps
- Watch for emotional reactions (pain = opportunity)
- Record with permission; take minimal notes during
---
Hypothesis Template
Format:
We believe that [building this feature/making this change]
For [target user segment]
Will [achieve this measurable outcome]
We'll know we're right when [specific metric moves by X%]
We'll know we're wrong when [falsification criteria]Example:
We believe that adding saved payment methods
For returning customers
Will increase checkout completion rate
We'll know we're right when checkout completion increases by 15%
We'll know we're wrong when completion rate stays flat after 2 weeks
or saved payment adoption is < 20%Hypothesis Quality Checklist:
- [ ] Specific user segment defined
- [ ] Measurable outcome (number, not "better")
- [ ] Timeframe for measurement
- [ ] Clear falsification criteria
- [ ] Based on evidence (interviews, data)
---
Opportunity Solution Tree
Structure:
[DESIRED OUTCOME]
│
├── Opportunity 1: [User problem/need]
│ ├── Solution A
│ ├── Solution B
│ └── Experiment: [Test to validate]
│
├── Opportunity 2: [User problem/need]
│ ├── Solution C
│ └── Solution D
│
└── Opportunity 3: [User problem/need]
└── Solution EExample:
[Increase monthly active users by 20%]
│
├── Users forget to return
│ ├── Weekly email digest
│ ├── Mobile push notifications
│ └── Test: A/B email frequency
│
├── New users don't find value quickly
│ ├── Improved onboarding wizard
│ └── Personalized first experience
│
└── Users churn after free trial
├── Extended trial for engaged users
└── Friction audit of upgrade flowProcess: 1. Start with measurable outcome (not solution) 2. Map opportunities from user research 3. Generate multiple solutions per opportunity 4. Design small experiments to validate 5. Prioritize based on learning potential
---
Jobs to Be Done
JTBD Statement Format:
When [situation/trigger]
I want to [motivation/job]
So I can [expected outcome]Example:
When I'm running late for a meeting
I want to notify attendees quickly
So I can set appropriate expectations and reduce anxietyForce Diagram:
┌─────────────────┐
Push from │ │ Pull toward
current ──────>│ SWITCH │<────── new
solution │ DECISION │ solution
│ │
└─────────────────┘
^ ^
| |
Anxiety of | | Habit of
change ──────┘ └────── status quoInterview Questions for JTBD:
- When did you first realize you needed something like this?
- What were you using before? Why did you switch?
- What almost prevented you from switching?
- What would make you go back to the old way?
---
Metrics Frameworks
North Star Metric Framework
Criteria for a Good NSM: 1. Measures value delivery: Captures what users get from product 2. Leading indicator: Predicts business success 3. Actionable: Teams can influence it 4. Measurable: Trackable on regular cadence
Examples by Business Type:
| Business | North Star Metric | Why |
|---|---|---|
| Spotify | Time spent listening | Measures engagement value |
| Airbnb | Nights booked | Core transaction metric |
| Slack | Messages sent in channels | Team collaboration value |
| Dropbox | Files stored/synced | Storage utility delivered |
| Netflix | Hours watched | Entertainment value |
Supporting Metrics Structure:
[NORTH STAR METRIC]
│
├── Breadth: How many users?
├── Depth: How engaged are they?
└── Frequency: How often do they engage?---
HEART Framework
| Metric | Definition | Example Signals |
|---|---|---|
| Happiness | Subjective satisfaction | NPS, CSAT, survey scores |
| Engagement | Depth of involvement | Session length, actions/session |
| Adoption | New user behavior | Signups, feature activation |
| Retention | Continued usage | D7/D30 retention, churn rate |
| Task Success | Efficiency & effectiveness | Completion rate, time-on-task, errors |
Goals-Signals-Metrics Process: 1. Goal: What user behavior indicates success? 2. Signal: How would success manifest in data? 3. Metric: How do we measure the signal?
Example:
Feature: New checkout flow
Goal: Users complete purchases faster
Signal: Reduced time in checkout, fewer drop-offs
Metrics:
- Median checkout time (target: <2 min)
- Checkout completion rate (target: 85%)
- Error rate (target: <2%)---
Funnel Analysis Template
Standard Funnel:
Acquisition → Activation → Retention → Revenue → Referral
│ │ │ │ │
│ │ │ │ │
How do First Come back Pay for Tell
they find "aha" regularly value others
you? momentMetrics per Stage:
| Stage | Key Metrics | Typical Benchmark |
|---|---|---|
| Acquisition | Visitors, CAC, channel mix | Varies by channel |
| Activation | Signup rate, onboarding completion | 20-30% visitor→signup |
| Retention | D1/D7/D30 retention, churn | D1: 40%, D7: 20%, D30: 10% |
| Revenue | Conversion rate, ARPU, LTV | 2-5% free→paid |
| Referral | NPS, viral coefficient, referrals/user | NPS > 50 is excellent |
Analysis Framework: 1. Map current conversion rates at each stage 2. Identify biggest drop-off point 3. Qualitative research: Why are users leaving? 4. Hypothesis: What would improve conversion? 5. Test and measure
---
Feature Success Metrics
| Metric | Definition | Target Range |
|---|---|---|
| Adoption | % users who try feature | 30-50% within 30 days |
| Activation | % who complete core action | 60-80% of adopters |
| Frequency | Uses per user per time | Weekly for engagement features |
| Depth | % of feature capability used | 50%+ of core functionality |
| Retention | Continued usage over time | 70%+ at 30 days |
| Satisfaction | Feature-specific NPS/rating | NPS > 30, Rating > 4.0 |
Measurement Cadence:
- Week 1: Adoption and initial activation
- Week 4: Retention and depth
- Week 8: Long-term satisfaction and business impact
---
Strategic Frameworks
Product Vision Template
Format:
FOR [target customer]
WHO [statement of need or opportunity]
THE [product name] IS A [product category]
THAT [key benefit, compelling reason to use]
UNLIKE [primary competitive alternative]
OUR PRODUCT [statement of primary differentiation]Example:
FOR busy professionals
WHO need to stay informed without information overload
Briefme IS A personalized news digest
THAT delivers only relevant stories in 5 minutes
UNLIKE traditional news apps that require active browsing
OUR PRODUCT learns your interests and filters automatically---
Competitive Analysis Framework
| Dimension | Us | Competitor A | Competitor B |
|---|---|---|---|
| Target User | |||
| Core Value Prop | |||
| Pricing | |||
| Key Features | |||
| Strengths | |||
| Weaknesses | |||
| Market Position |
Strategic Questions: 1. Where do we have parity? (table stakes) 2. Where do we differentiate? (competitive advantage) 3. Where are we behind? (gaps to close or ignore) 4. What can only we do? (unique capabilities)
---
Go-to-Market Checklist
Pre-Launch (4 weeks before):
- [ ] Success metrics defined and instrumented
- [ ] Launch/rollback criteria established
- [ ] Support documentation ready
- [ ] Sales enablement materials complete
- [ ] Marketing assets prepared
- [ ] Beta feedback incorporated
Launch Week:
- [ ] Staged rollout plan (1% → 10% → 50% → 100%)
- [ ] Monitoring dashboards live
- [ ] On-call rotation scheduled
- [ ] Communications ready (in-app, email, blog)
- [ ] Support team briefed
Post-Launch (2 weeks after):
- [ ] Metrics review vs. targets
- [ ] User feedback synthesized
- [ ] Bug/issue triage complete
- [ ] Iteration plan defined
- [ ] Stakeholder update sent
---
Framework Selection Guide
| Situation | Recommended Framework |
|---|---|
| Quarterly roadmap planning | RICE + Portfolio Matrix |
| Sprint-level prioritization | MoSCoW |
| Quick feature comparison | ICE |
| Understanding user satisfaction | Kano |
| User research synthesis | JTBD + Opportunity Tree |
| Feature experiment design | Hypothesis Template |
| Success measurement | HEART + Feature Metrics |
| Strategy communication | North Star + Vision |
---
Last Updated: January 2025
product-manager-toolkit reference
Input/Output Examples
RICE Prioritizer Example
Input (features.csv):
name,reach,impact,confidence,effort
Onboarding Flow,20000,massive,high,s
Search Improvements,15000,high,high,m
Social Login,12000,high,medium,m
Push Notifications,10000,massive,medium,m
Dark Mode,8000,medium,high,sCommand:
python scripts/rice_prioritizer.py features.csv --capacity 15Output:
============================================================
RICE PRIORITIZATION RESULTS
============================================================
📊 TOP PRIORITIZED FEATURES
1. Onboarding Flow
RICE Score: 16000.0
Reach: 20000 | Impact: massive | Confidence: high | Effort: s
2. Search Improvements
RICE Score: 4800.0
Reach: 15000 | Impact: high | Confidence: high | Effort: m
3. Social Login
RICE Score: 3072.0
Reach: 12000 | Impact: high | Confidence: medium | Effort: m
4. Push Notifications
RICE Score: 3840.0
Reach: 10000 | Impact: massive | Confidence: medium | Effort: m
5. Dark Mode
RICE Score: 2133.33
Reach: 8000 | Impact: medium | Confidence: high | Effort: s
📈 PORTFOLIO ANALYSIS
Total Features: 5
Total Effort: 19 person-months
Total Reach: 65,000 users
Average RICE Score: 5969.07
🎯 Quick Wins: 2 features
• Onboarding Flow (RICE: 16000.0)
• Dark Mode (RICE: 2133.33)
🚀 Big Bets: 0 features
📅 SUGGESTED ROADMAP
Q1 - Capacity: 11/15 person-months
• Onboarding Flow (RICE: 16000.0)
• Search Improvements (RICE: 4800.0)
• Dark Mode (RICE: 2133.33)
Q2 - Capacity: 10/15 person-months
• Push Notifications (RICE: 3840.0)
• Social Login (RICE: 3072.0)---
Customer Interview Analyzer Example
Input (interview.txt):
Customer: Jane, Enterprise PM at TechCorp
Date: 2024-01-15
Interviewer: What's the hardest part of your current workflow?
Jane: The biggest frustration is the lack of real-time collaboration.
When I'm working on a PRD, I have to constantly ping my team on Slack
to get updates. It's really frustrating to wait for responses,
especially when we're on a tight deadline.
I've tried using Google Docs for collaboration, but it doesn't
integrate with our roadmap tools. I'd pay extra for something that
just worked seamlessly.
Interviewer: How often does this happen?
Jane: Literally every day. I probably waste 30 minutes just on
back-and-forth messages. It's my biggest pain point right now.Command:
python scripts/customer_interview_analyzer.py interview.txtOutput:
============================================================
CUSTOMER INTERVIEW ANALYSIS
============================================================
📋 INTERVIEW METADATA
Segments found: 1
Lines analyzed: 15
😟 PAIN POINTS (3 found)
1. [HIGH] Lack of real-time collaboration
"I have to constantly ping my team on Slack to get updates"
2. [MEDIUM] Tool integration gaps
"Google Docs...doesn't integrate with our roadmap tools"
3. [HIGH] Time wasted on communication
"waste 30 minutes just on back-and-forth messages"
💡 FEATURE REQUESTS (2 found)
1. Real-time collaboration - Priority: High
2. Seamless tool integration - Priority: Medium
🎯 JOBS TO BE DONE
When working on PRDs with tight deadlines
I want real-time visibility into team updates
So I can avoid wasted time on status checks
📊 SENTIMENT ANALYSIS
Overall: Negative (pain-focused interview)
Key emotions: Frustration, Time pressure
💬 KEY QUOTES
• "It's really frustrating to wait for responses"
• "I'd pay extra for something that just worked seamlessly"
• "It's my biggest pain point right now"
🏷️ THEMES
- Collaboration friction
- Tool fragmentation
- Time efficiency---
Product Requirements Document (PRD) Templates
Standard PRD Template
1. Executive Summary
Purpose: One-page overview for executives and stakeholders
Components:
- Problem Statement (2-3 sentences)
- Proposed Solution (2-3 sentences)
- Business Impact (3 bullet points)
- Timeline (High-level milestones)
- Resources Required (Team size and budget)
- Success Metrics (3-5 KPIs)
2. Problem Definition
2.1 Customer Problem
- Who: Target user persona(s)
- What: Specific problem or need
- When: Context and frequency
- Where: Environment and touchpoints
- Why: Root cause analysis
- Impact: Cost of not solving
2.2 Market Opportunity
- Market Size: TAM, SAM, SOM
- Growth Rate: Annual growth percentage
- Competition: Current solutions and gaps
- Timing: Why now?
2.3 Business Case
- Revenue Potential: Projected impact
- Cost Savings: Efficiency gains
- Strategic Value: Alignment with company goals
- Risk Assessment: What if we don't do this?
3. Solution Overview
3.1 Proposed Solution
- High-Level Description: What we're building
- Key Capabilities: Core functionality
- User Journey: End-to-end flow
- Differentiation: Unique value proposition
3.2 In Scope
- Feature 1: Description and priority
- Feature 2: Description and priority
- Feature 3: Description and priority
3.3 Out of Scope
- Explicitly what we're NOT doing
- Future considerations
- Dependencies on other teams
3.4 MVP Definition
- Core Features: Minimum viable feature set
- Success Criteria: Definition of "working"
- Timeline: MVP delivery date
- Learning Goals: What we want to validate
4. User Stories & Requirements
4.1 User Stories
As a [persona]
I want to [action]
So that [outcome/benefit]
Acceptance Criteria:
- [ ] Criterion 1
- [ ] Criterion 2
- [ ] Criterion 34.2 Functional Requirements
| ID | Requirement | Priority | Notes |
|---|---|---|---|
| FR1 | User can... | P0 | Critical for MVP |
| FR2 | System should... | P1 | Important |
| FR3 | Feature must... | P2 | Nice to have |
4.3 Non-Functional Requirements
- Performance: Response times, throughput
- Scalability: User/data growth targets
- Security: Authentication, authorization, data protection
- Reliability: Uptime targets, error rates
- Usability: Accessibility standards, device support
- Compliance: Regulatory requirements
5. Design & User Experience
5.1 Design Principles
- Principle 1: Description
- Principle 2: Description
- Principle 3: Description
5.2 Wireframes/Mockups
- Link to Figma/Sketch files
- Key screens and flows
- Interaction patterns
5.3 Information Architecture
- Navigation structure
- Data organization
- Content hierarchy
6. Technical Specifications
6.1 Architecture Overview
- System architecture diagram
- Technology stack
- Integration points
- Data flow
6.2 API Design
- Endpoints and methods
- Request/response formats
- Authentication approach
- Rate limiting
6.3 Database Design
- Data model
- Key entities and relationships
- Migration strategy
6.4 Security Considerations
- Authentication method
- Authorization model
- Data encryption
- PII handling
7. Go-to-Market Strategy
7.1 Launch Plan
- Soft Launch: Beta users, timeline
- Full Launch: All users, timeline
- Marketing: Campaigns and channels
- Support: Documentation and training
7.2 Pricing Strategy
- Pricing model
- Competitive analysis
- Value proposition
7.3 Success Metrics
| Metric | Target | Measurement Method |
|---|---|---|
| Adoption Rate | X% | Daily Active Users |
| User Satisfaction | X/10 | NPS Score |
| Revenue Impact | $X | Monthly Recurring Revenue |
| Performance | <Xms | P95 Response Time |
8. Risks & Mitigations
| Risk | Probability | Impact | Mitigation Strategy |
|---|---|---|---|
| Technical debt | Medium | High | Allocate 20% for refactoring |
| User adoption | Low | High | Beta program with feedback loops |
| Scope creep | High | Medium | Weekly stakeholder reviews |
9. Timeline & Milestones
| Milestone | Date | Deliverables | Success Criteria |
|---|---|---|---|
| Design Complete | Week 2 | Mockups, IA | Stakeholder approval |
| MVP Development | Week 6 | Core features | All P0s complete |
| Beta Launch | Week 8 | Limited release | 100 beta users |
| Full Launch | Week 12 | General availability | <1% error rate |
10. Team & Resources
10.1 Team Structure
- Product Manager: [Name]
- Engineering Lead: [Name]
- Design Lead: [Name]
- Engineers: X FTEs
- QA: X FTEs
10.2 Budget
- Development: $X
- Infrastructure: $X
- Marketing: $X
- Total: $X
11. Appendix
- User Research Data
- Competitive Analysis
- Technical Diagrams
- Legal/Compliance Docs
---
Agile Epic Template
Epic: [Epic Name]
Overview
Epic ID: EPIC-XXX Theme: [Product Theme] Quarter: QX 20XX Status: Discovery | In Progress | Complete
Problem Statement
[2-3 sentences describing the problem]
Goals & Objectives
1. Objective 1 2. Objective 2 3. Objective 3
Success Metrics
- Metric 1: Target
- Metric 2: Target
- Metric 3: Target
User Stories
| Story ID | Title | Priority | Points | Status |
|---|---|---|---|---|
| US-001 | As a... | P0 | 5 | To Do |
| US-002 | As a... | P1 | 3 | To Do |
Dependencies
- Dependency 1: Team/System
- Dependency 2: Team/System
Acceptance Criteria
- [ ] All P0 stories complete
- [ ] Performance targets met
- [ ] Security review passed
- [ ] Documentation updated
---
One-Page PRD Template
[Feature Name] - One-Page PRD
Date: [Date] Author: [PM Name] Status: Draft | In Review | Approved
Problem
What problem are we solving? For whom? [2-3 sentences]
Solution
What are we building? [2-3 sentences]
Why Now?
What's driving urgency?
- Reason 1
- Reason 2
- Reason 3
Success Metrics
| Metric | Current | Target |
|---|---|---|
| KPI 1 | X | Y |
| KPI 2 | X | Y |
Scope
In: Feature 1, Feature 2, Feature 3 Out: Feature A, Feature B
User Flow
Step 1 → Step 2 → Step 3 → Success!Risks
1. Risk 1 → Mitigation 2. Risk 2 → Mitigation
Timeline
- Design: Week 1-2
- Development: Week 3-6
- Testing: Week 7
- Launch: Week 8
Resources
- Engineering: X developers
- Design: X designer
- QA: X tester
Open Questions
1. Question 1? 2. Question 2?
---
Feature Brief Template (Lightweight)
Feature: [Name]
Context
Why are we considering this?
Hypothesis
We believe that [building this feature] For [these users] Will [achieve this outcome] We'll know we're right when [we see this metric]
Proposed Solution
High-level approach
Effort Estimate
- Size: XS | S | M | L | XL
- Confidence: High | Medium | Low
Next Steps
1. [ ] User research 2. [ ] Design exploration 3. [ ] Technical spike 4. [ ] Stakeholder review
#!/usr/bin/env python3
"""
Customer Interview Analyzer
Extracts insights, patterns, and opportunities from user interviews
"""
import re
from typing import Dict, List, Tuple, Set
from collections import Counter, defaultdict
import json
class InterviewAnalyzer:
"""Analyze customer interviews for insights and patterns"""
def __init__(self):
# Pain point indicators
self.pain_indicators = [
'frustrat', 'annoy', 'difficult', 'hard', 'confus', 'slow',
'problem', 'issue', 'struggle', 'challeng', 'pain', 'waste',
'manual', 'repetitive', 'tedious', 'boring', 'time-consuming',
'complicated', 'complex', 'unclear', 'wish', 'need', 'want'
]
# Positive indicators
self.delight_indicators = [
'love', 'great', 'awesome', 'amazing', 'perfect', 'easy',
'simple', 'quick', 'fast', 'helpful', 'useful', 'valuable',
'save', 'efficient', 'convenient', 'intuitive', 'clear'
]
# Feature request indicators
self.request_indicators = [
'would be nice', 'wish', 'hope', 'want', 'need', 'should',
'could', 'would love', 'if only', 'it would help', 'suggest',
'recommend', 'idea', 'what if', 'have you considered'
]
# Jobs to be done patterns
self.jtbd_patterns = [
r'when i\s+(.+?),\s+i want to\s+(.+?)\s+so that\s+(.+)',
r'i need to\s+(.+?)\s+because\s+(.+)',
r'my goal is to\s+(.+)',
r'i\'m trying to\s+(.+)',
r'i use \w+ to\s+(.+)',
r'helps me\s+(.+)',
]
def analyze_interview(self, text: str) -> Dict:
"""Analyze a single interview transcript"""
text_lower = text.lower()
sentences = self._split_sentences(text)
analysis = {
'pain_points': self._extract_pain_points(sentences),
'delights': self._extract_delights(sentences),
'feature_requests': self._extract_requests(sentences),
'jobs_to_be_done': self._extract_jtbd(text_lower),
'sentiment_score': self._calculate_sentiment(text_lower),
'key_themes': self._extract_themes(text_lower),
'quotes': self._extract_key_quotes(sentences),
'metrics_mentioned': self._extract_metrics(text),
'competitors_mentioned': self._extract_competitors(text)
}
return analysis
def _split_sentences(self, text: str) -> List[str]:
"""Split text into sentences"""
# Simple sentence splitting
sentences = re.split(r'[.!?]+', text)
return [s.strip() for s in sentences if s.strip()]
def _extract_pain_points(self, sentences: List[str]) -> List[Dict]:
"""Extract pain points from sentences"""
pain_points = []
for sentence in sentences:
sentence_lower = sentence.lower()
for indicator in self.pain_indicators:
if indicator in sentence_lower:
# Extract context around the pain point
pain_points.append({
'quote': sentence,
'indicator': indicator,
'severity': self._assess_severity(sentence_lower)
})
break
return pain_points[:10] # Return top 10
def _extract_delights(self, sentences: List[str]) -> List[Dict]:
"""Extract positive feedback"""
delights = []
for sentence in sentences:
sentence_lower = sentence.lower()
for indicator in self.delight_indicators:
if indicator in sentence_lower:
delights.append({
'quote': sentence,
'indicator': indicator,
'strength': self._assess_strength(sentence_lower)
})
break
return delights[:10]
def _extract_requests(self, sentences: List[str]) -> List[Dict]:
"""Extract feature requests and suggestions"""
requests = []
for sentence in sentences:
sentence_lower = sentence.lower()
for indicator in self.request_indicators:
if indicator in sentence_lower:
requests.append({
'quote': sentence,
'type': self._classify_request(sentence_lower),
'priority': self._assess_request_priority(sentence_lower)
})
break
return requests[:10]
def _extract_jtbd(self, text: str) -> List[Dict]:
"""Extract Jobs to Be Done patterns"""
jobs = []
for pattern in self.jtbd_patterns:
matches = re.findall(pattern, text, re.IGNORECASE)
for match in matches:
if isinstance(match, tuple):
job = ' → '.join(match)
else:
job = match
jobs.append({
'job': job,
'pattern': pattern.pattern if hasattr(pattern, 'pattern') else pattern
})
return jobs[:5]
def _calculate_sentiment(self, text: str) -> Dict:
"""Calculate overall sentiment of the interview"""
positive_count = sum(1 for ind in self.delight_indicators if ind in text)
negative_count = sum(1 for ind in self.pain_indicators if ind in text)
total = positive_count + negative_count
if total == 0:
sentiment_score = 0
else:
sentiment_score = (positive_count - negative_count) / total
if sentiment_score > 0.3:
sentiment_label = 'positive'
elif sentiment_score < -0.3:
sentiment_label = 'negative'
else:
sentiment_label = 'neutral'
return {
'score': round(sentiment_score, 2),
'label': sentiment_label,
'positive_signals': positive_count,
'negative_signals': negative_count
}
def _extract_themes(self, text: str) -> List[str]:
"""Extract key themes using word frequency"""
# Remove common words
stop_words = {'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at',
'to', 'for', 'of', 'with', 'by', 'from', 'as', 'is',
'was', 'are', 'were', 'been', 'be', 'have', 'has',
'had', 'do', 'does', 'did', 'will', 'would', 'could',
'should', 'may', 'might', 'must', 'can', 'shall',
'it', 'i', 'you', 'we', 'they', 'them', 'their'}
# Extract meaningful words
words = re.findall(r'\b[a-z]{4,}\b', text)
meaningful_words = [w for w in words if w not in stop_words]
# Count frequency
word_freq = Counter(meaningful_words)
# Extract themes (top frequent meaningful words)
themes = [word for word, count in word_freq.most_common(10) if count >= 3]
return themes
def _extract_key_quotes(self, sentences: List[str]) -> List[str]:
"""Extract the most insightful quotes"""
scored_sentences = []
for sentence in sentences:
if len(sentence) < 20 or len(sentence) > 200:
continue
score = 0
sentence_lower = sentence.lower()
# Score based on insight indicators
if any(ind in sentence_lower for ind in self.pain_indicators):
score += 2
if any(ind in sentence_lower for ind in self.request_indicators):
score += 2
if 'because' in sentence_lower:
score += 1
if 'but' in sentence_lower:
score += 1
if '?' in sentence:
score += 1
if score > 0:
scored_sentences.append((score, sentence))
# Sort by score and return top quotes
scored_sentences.sort(reverse=True)
return [s[1] for s in scored_sentences[:5]]
def _extract_metrics(self, text: str) -> List[str]:
"""Extract any metrics or numbers mentioned"""
metrics = []
# Find percentages
percentages = re.findall(r'\d+%', text)
metrics.extend(percentages)
# Find time metrics
time_metrics = re.findall(r'\d+\s*(?:hours?|minutes?|days?|weeks?|months?)', text, re.IGNORECASE)
metrics.extend(time_metrics)
# Find money metrics
money_metrics = re.findall(r'\$[\d,]+', text)
metrics.extend(money_metrics)
# Find general numbers with context
number_contexts = re.findall(r'(\d+)\s+(\w+)', text)
for num, context in number_contexts:
if context.lower() not in ['the', 'a', 'an', 'and', 'or', 'of']:
metrics.append(f"{num} {context}")
return list(set(metrics))[:10]
def _extract_competitors(self, text: str) -> List[str]:
"""Extract competitor mentions"""
# Common competitor indicators
competitor_patterns = [
r'(?:use|used|using|tried|trying|switch from|switched from|instead of)\s+(\w+)',
r'(\w+)\s+(?:is better|works better|is easier)',
r'compared to\s+(\w+)',
r'like\s+(\w+)',
r'similar to\s+(\w+)',
]
competitors = set()
for pattern in competitor_patterns:
matches = re.findall(pattern, text, re.IGNORECASE)
competitors.update(matches)
# Filter out common words
common_words = {'this', 'that', 'it', 'them', 'other', 'another', 'something'}
competitors = [c for c in competitors if c.lower() not in common_words and len(c) > 2]
return list(competitors)[:5]
def _assess_severity(self, text: str) -> str:
"""Assess severity of pain point"""
if any(word in text for word in ['very', 'extremely', 'really', 'totally', 'completely']):
return 'high'
elif any(word in text for word in ['somewhat', 'bit', 'little', 'slightly']):
return 'low'
return 'medium'
def _assess_strength(self, text: str) -> str:
"""Assess strength of positive feedback"""
if any(word in text for word in ['absolutely', 'definitely', 'really', 'very']):
return 'strong'
return 'moderate'
def _classify_request(self, text: str) -> str:
"""Classify the type of request"""
if any(word in text for word in ['ui', 'design', 'look', 'color', 'layout']):
return 'ui_improvement'
elif any(word in text for word in ['feature', 'add', 'new', 'build']):
return 'new_feature'
elif any(word in text for word in ['fix', 'bug', 'broken', 'work']):
return 'bug_fix'
elif any(word in text for word in ['faster', 'slow', 'performance', 'speed']):
return 'performance'
return 'general'
def _assess_request_priority(self, text: str) -> str:
"""Assess priority of request"""
if any(word in text for word in ['critical', 'urgent', 'asap', 'immediately', 'blocking']):
return 'critical'
elif any(word in text for word in ['need', 'important', 'should', 'must']):
return 'high'
elif any(word in text for word in ['nice', 'would', 'could', 'maybe']):
return 'low'
return 'medium'
def aggregate_interviews(interviews: List[Dict]) -> Dict:
"""Aggregate insights from multiple interviews"""
aggregated = {
'total_interviews': len(interviews),
'common_pain_points': defaultdict(list),
'common_requests': defaultdict(list),
'jobs_to_be_done': [],
'overall_sentiment': {
'positive': 0,
'negative': 0,
'neutral': 0
},
'top_themes': Counter(),
'metrics_summary': set(),
'competitors_mentioned': Counter()
}
for interview in interviews:
# Aggregate pain points
for pain in interview.get('pain_points', []):
indicator = pain.get('indicator', 'unknown')
aggregated['common_pain_points'][indicator].append(pain['quote'])
# Aggregate requests
for request in interview.get('feature_requests', []):
req_type = request.get('type', 'general')
aggregated['common_requests'][req_type].append(request['quote'])
# Aggregate JTBD
aggregated['jobs_to_be_done'].extend(interview.get('jobs_to_be_done', []))
# Aggregate sentiment
sentiment = interview.get('sentiment_score', {}).get('label', 'neutral')
aggregated['overall_sentiment'][sentiment] += 1
# Aggregate themes
for theme in interview.get('key_themes', []):
aggregated['top_themes'][theme] += 1
# Aggregate metrics
aggregated['metrics_summary'].update(interview.get('metrics_mentioned', []))
# Aggregate competitors
for competitor in interview.get('competitors_mentioned', []):
aggregated['competitors_mentioned'][competitor] += 1
# Process aggregated data
aggregated['common_pain_points'] = dict(aggregated['common_pain_points'])
aggregated['common_requests'] = dict(aggregated['common_requests'])
aggregated['top_themes'] = dict(aggregated['top_themes'].most_common(10))
aggregated['metrics_summary'] = list(aggregated['metrics_summary'])
aggregated['competitors_mentioned'] = dict(aggregated['competitors_mentioned'])
return aggregated
def format_single_interview(analysis: Dict) -> str:
"""Format single interview analysis"""
output = ["=" * 60]
output.append("CUSTOMER INTERVIEW ANALYSIS")
output.append("=" * 60)
# Sentiment
sentiment = analysis['sentiment_score']
output.append(f"\n📊 Overall Sentiment: {sentiment['label'].upper()}")
output.append(f" Score: {sentiment['score']}")
output.append(f" Positive signals: {sentiment['positive_signals']}")
output.append(f" Negative signals: {sentiment['negative_signals']}")
# Pain Points
if analysis['pain_points']:
output.append("\n🔥 Pain Points Identified:")
for i, pain in enumerate(analysis['pain_points'][:5], 1):
output.append(f"\n{i}. [{pain['severity'].upper()}] {pain['quote'][:100]}...")
# Feature Requests
if analysis['feature_requests']:
output.append("\n💡 Feature Requests:")
for i, req in enumerate(analysis['feature_requests'][:5], 1):
output.append(f"\n{i}. [{req['type']}] Priority: {req['priority']}")
output.append(f" \"{req['quote'][:100]}...\"")
# Jobs to Be Done
if analysis['jobs_to_be_done']:
output.append("\n🎯 Jobs to Be Done:")
for i, job in enumerate(analysis['jobs_to_be_done'], 1):
output.append(f"{i}. {job['job']}")
# Key Themes
if analysis['key_themes']:
output.append("\n🏷️ Key Themes:")
output.append(", ".join(analysis['key_themes']))
# Key Quotes
if analysis['quotes']:
output.append("\n💬 Key Quotes:")
for i, quote in enumerate(analysis['quotes'][:3], 1):
output.append(f'{i}. "{quote}"')
# Metrics
if analysis['metrics_mentioned']:
output.append("\n📈 Metrics Mentioned:")
output.append(", ".join(analysis['metrics_mentioned']))
# Competitors
if analysis['competitors_mentioned']:
output.append("\n🏢 Competitors Mentioned:")
output.append(", ".join(analysis['competitors_mentioned']))
return "\n".join(output)
def main():
import sys
import argparse
parser = argparse.ArgumentParser(
description="Customer Interview Analyzer - Extracts insights, patterns, and opportunities from user interviews"
)
parser.add_argument(
"file", nargs="?", default=None,
help="Interview transcript text file to analyze"
)
parser.add_argument(
"--json", action="store_true",
help="Output results as JSON"
)
args = parser.parse_args()
if not args.file:
print("Usage: python customer_interview_analyzer.py <interview_file.txt>")
print("\nThis tool analyzes customer interview transcripts to extract:")
print(" - Pain points and frustrations")
print(" - Feature requests and suggestions")
print(" - Jobs to be done")
print(" - Sentiment analysis")
print(" - Key themes and quotes")
sys.exit(1)
with open(args.file, 'r') as f:
interview_text = f.read()
analyzer = InterviewAnalyzer()
analysis = analyzer.analyze_interview(interview_text)
if args.json:
print(json.dumps(analysis, indent=2))
else:
print(format_single_interview(analysis))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
RICE Prioritization Framework
Calculates RICE scores for feature prioritization
RICE = (Reach x Impact x Confidence) / Effort
"""
import json
import csv
from typing import List, Dict, Tuple
import argparse
class RICECalculator:
"""Calculate RICE scores for feature prioritization"""
def __init__(self):
self.impact_map = {
'massive': 3.0,
'high': 2.0,
'medium': 1.0,
'low': 0.5,
'minimal': 0.25
}
self.confidence_map = {
'high': 100,
'medium': 80,
'low': 50
}
self.effort_map = {
'xl': 13,
'l': 8,
'm': 5,
's': 3,
'xs': 1
}
def calculate_rice(self, reach: int, impact: str, confidence: str, effort: str) -> float:
"""
Calculate RICE score
Args:
reach: Number of users/customers affected per quarter
impact: massive/high/medium/low/minimal
confidence: high/medium/low (percentage)
effort: xl/l/m/s/xs (person-months)
"""
impact_score = self.impact_map.get(impact.lower(), 1.0)
confidence_score = self.confidence_map.get(confidence.lower(), 50) / 100
effort_score = self.effort_map.get(effort.lower(), 5)
if effort_score == 0:
return 0
rice_score = (reach * impact_score * confidence_score) / effort_score
return round(rice_score, 2)
def prioritize_features(self, features: List[Dict]) -> List[Dict]:
"""
Calculate RICE scores and rank features
Args:
features: List of feature dictionaries with RICE components
"""
for feature in features:
feature['rice_score'] = self.calculate_rice(
feature.get('reach', 0),
feature.get('impact', 'medium'),
feature.get('confidence', 'medium'),
feature.get('effort', 'm')
)
# Sort by RICE score descending
return sorted(features, key=lambda x: x['rice_score'], reverse=True)
def analyze_portfolio(self, features: List[Dict]) -> Dict:
"""
Analyze the feature portfolio for balance and insights
"""
if not features:
return {}
total_effort = sum(
self.effort_map.get(f.get('effort', 'm').lower(), 5)
for f in features
)
total_reach = sum(f.get('reach', 0) for f in features)
effort_distribution = {}
impact_distribution = {}
for feature in features:
effort = feature.get('effort', 'm').lower()
impact = feature.get('impact', 'medium').lower()
effort_distribution[effort] = effort_distribution.get(effort, 0) + 1
impact_distribution[impact] = impact_distribution.get(impact, 0) + 1
# Calculate quick wins (high impact, low effort)
quick_wins = [
f for f in features
if f.get('impact', '').lower() in ['massive', 'high']
and f.get('effort', '').lower() in ['xs', 's']
]
# Calculate big bets (high impact, high effort)
big_bets = [
f for f in features
if f.get('impact', '').lower() in ['massive', 'high']
and f.get('effort', '').lower() in ['l', 'xl']
]
return {
'total_features': len(features),
'total_effort_months': total_effort,
'total_reach': total_reach,
'average_rice': round(sum(f['rice_score'] for f in features) / len(features), 2),
'effort_distribution': effort_distribution,
'impact_distribution': impact_distribution,
'quick_wins': len(quick_wins),
'big_bets': len(big_bets),
'quick_wins_list': quick_wins[:3], # Top 3 quick wins
'big_bets_list': big_bets[:3] # Top 3 big bets
}
def generate_roadmap(self, features: List[Dict], team_capacity: int = 10) -> List[Dict]:
"""
Generate a quarterly roadmap based on team capacity
Args:
features: Prioritized feature list
team_capacity: Person-months available per quarter
"""
quarters = []
current_quarter = {
'quarter': 1,
'features': [],
'capacity_used': 0,
'capacity_available': team_capacity
}
for feature in features:
effort = self.effort_map.get(feature.get('effort', 'm').lower(), 5)
if current_quarter['capacity_used'] + effort <= team_capacity:
current_quarter['features'].append(feature)
current_quarter['capacity_used'] += effort
else:
# Move to next quarter
current_quarter['capacity_available'] = team_capacity - current_quarter['capacity_used']
quarters.append(current_quarter)
current_quarter = {
'quarter': len(quarters) + 1,
'features': [feature],
'capacity_used': effort,
'capacity_available': team_capacity - effort
}
if current_quarter['features']:
current_quarter['capacity_available'] = team_capacity - current_quarter['capacity_used']
quarters.append(current_quarter)
return quarters
def format_output(features: List[Dict], analysis: Dict, roadmap: List[Dict]) -> str:
"""Format the results for display"""
output = ["=" * 60]
output.append("RICE PRIORITIZATION RESULTS")
output.append("=" * 60)
# Top prioritized features
output.append("\n📊 TOP PRIORITIZED FEATURES\n")
for i, feature in enumerate(features[:10], 1):
output.append(f"{i}. {feature.get('name', 'Unnamed')}")
output.append(f" RICE Score: {feature['rice_score']}")
output.append(f" Reach: {feature.get('reach', 0)} | Impact: {feature.get('impact', 'medium')} | "
f"Confidence: {feature.get('confidence', 'medium')} | Effort: {feature.get('effort', 'm')}")
output.append("")
# Portfolio analysis
output.append("\n📈 PORTFOLIO ANALYSIS\n")
output.append(f"Total Features: {analysis.get('total_features', 0)}")
output.append(f"Total Effort: {analysis.get('total_effort_months', 0)} person-months")
output.append(f"Total Reach: {analysis.get('total_reach', 0):,} users")
output.append(f"Average RICE Score: {analysis.get('average_rice', 0)}")
output.append(f"\n🎯 Quick Wins: {analysis.get('quick_wins', 0)} features")
for qw in analysis.get('quick_wins_list', []):
output.append(f" • {qw.get('name', 'Unnamed')} (RICE: {qw['rice_score']})")
output.append(f"\n🚀 Big Bets: {analysis.get('big_bets', 0)} features")
for bb in analysis.get('big_bets_list', []):
output.append(f" • {bb.get('name', 'Unnamed')} (RICE: {bb['rice_score']})")
# Roadmap
output.append("\n\n📅 SUGGESTED ROADMAP\n")
for quarter in roadmap:
output.append(f"\nQ{quarter['quarter']} - Capacity: {quarter['capacity_used']}/{quarter['capacity_used'] + quarter['capacity_available']} person-months")
for feature in quarter['features']:
output.append(f" • {feature.get('name', 'Unnamed')} (RICE: {feature['rice_score']})")
return "\n".join(output)
def load_features_from_csv(filepath: str) -> List[Dict]:
"""Load features from CSV file"""
features = []
with open(filepath, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
feature = {
'name': row.get('name', ''),
'reach': int(row.get('reach', 0)),
'impact': row.get('impact', 'medium'),
'confidence': row.get('confidence', 'medium'),
'effort': row.get('effort', 'm'),
'description': row.get('description', '')
}
features.append(feature)
return features
def create_sample_csv(filepath: str):
"""Create a sample CSV file for testing"""
sample_features = [
['name', 'reach', 'impact', 'confidence', 'effort', 'description'],
['User Dashboard Redesign', '5000', 'high', 'high', 'l', 'Complete redesign of user dashboard'],
['Mobile Push Notifications', '10000', 'massive', 'medium', 'm', 'Add push notification support'],
['Dark Mode', '8000', 'medium', 'high', 's', 'Implement dark mode theme'],
['API Rate Limiting', '2000', 'low', 'high', 'xs', 'Add rate limiting to API'],
['Social Login', '12000', 'high', 'medium', 'm', 'Add Google/Facebook login'],
['Export to PDF', '3000', 'medium', 'low', 's', 'Export reports as PDF'],
['Team Collaboration', '4000', 'massive', 'low', 'xl', 'Real-time collaboration features'],
['Search Improvements', '15000', 'high', 'high', 'm', 'Enhance search functionality'],
['Onboarding Flow', '20000', 'massive', 'high', 's', 'Improve new user onboarding'],
['Analytics Dashboard', '6000', 'high', 'medium', 'l', 'Advanced analytics for users'],
]
with open(filepath, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(sample_features)
print(f"Sample CSV created at: {filepath}")
def main():
parser = argparse.ArgumentParser(description='RICE Framework for Feature Prioritization')
parser.add_argument('input', nargs='?', help='CSV file with features or "sample" to create sample')
parser.add_argument('--capacity', type=int, default=10, help='Team capacity per quarter (person-months)')
parser.add_argument('--output', choices=['text', 'json', 'csv'], default='text', help='Output format')
args = parser.parse_args()
# Create sample if requested
if args.input == 'sample':
create_sample_csv('sample_features.csv')
return
# Use sample data if no input provided
if not args.input:
features = [
{'name': 'User Dashboard', 'reach': 5000, 'impact': 'high', 'confidence': 'high', 'effort': 'l'},
{'name': 'Push Notifications', 'reach': 10000, 'impact': 'massive', 'confidence': 'medium', 'effort': 'm'},
{'name': 'Dark Mode', 'reach': 8000, 'impact': 'medium', 'confidence': 'high', 'effort': 's'},
{'name': 'API Rate Limiting', 'reach': 2000, 'impact': 'low', 'confidence': 'high', 'effort': 'xs'},
{'name': 'Social Login', 'reach': 12000, 'impact': 'high', 'confidence': 'medium', 'effort': 'm'},
]
else:
features = load_features_from_csv(args.input)
# Calculate RICE scores
calculator = RICECalculator()
prioritized = calculator.prioritize_features(features)
analysis = calculator.analyze_portfolio(prioritized)
roadmap = calculator.generate_roadmap(prioritized, args.capacity)
# Output results
if args.output == 'json':
result = {
'features': prioritized,
'analysis': analysis,
'roadmap': roadmap
}
print(json.dumps(result, indent=2))
elif args.output == 'csv':
# Output prioritized features as CSV
if prioritized:
keys = prioritized[0].keys()
print(','.join(keys))
for feature in prioritized:
print(','.join(str(feature.get(k, '')) for k in keys))
else:
print(format_output(prioritized, analysis, roadmap))
if __name__ == "__main__":
main()
Related skills
How it compares
Use product-manager-toolkit to scope and document requirements; switch to implementation skills once the PRD is approved.
FAQ
What sections does product-manager-toolkit include in a PRD?
product-manager-toolkit PRDs include document metadata, problem statement, affected user segments, evidence from interviews or analytics, impact if unsolved, and fields for reviewers and target release dates.
Who should use product-manager-toolkit?
product-manager-toolkit suits developers and leads with vague feature ideas who need clear, prioritized requirements documented before agents or engineers begin implementation work.
Is Product Manager Toolkit safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.