Complete system for collecting, analyzing, and operationalizing customer feedback to drive product decisions, reduce churn, and increase expansion revenue.
yaml
voc_program:
company: "[Company Name]"
product: "[Product/Service]"
stage: "[Pre-PMF | Growth | Scale | Enterprise]"
customer_count: "[approximate]"
current_nps: "[score or unknown]"
current_churn: "[monthly % or unknown]"
primary_goal: "[reduce churn | improve NPS | prioritize roadmap | find PMF]"
segments:
- name: "[Enterprise / SMB / Consumer]"
size: "[count]"
arr_contribution: "[%]"
priority: "[1-3]"
existing_channels:
- "[list current feedback collection methods]"
gaps:
- "[what feedback are you NOT collecting?]"
Score your current program (1-5 per dimension):
Dimension1 (Ad Hoc)3 (Structured)5 (Operationalized)CollectionSporadic, reactive onlyMultiple channels, some regularityAutomated, multi-channel, triggeredAnalysisRead individual commentsTag and categorizeQuantified themes, trend trackingDistributionStays with support teamShared in meetingsReal-time dashboards, auto-routedActionOccasional fixesQuarterly roadmap inputClosed-loop, feedback drives decisionsMeasurementNo trackingNPS or CSAT existsFull metric suite, benchmarked
Score interpretation:
Design feedback collection around the customer journey:
yaml
collection_channels:
# ALWAYS-ON (continuous)
in_app_widget:
placement: "[specific screens/moments]"
trigger: "User-initiated (feedback button)"
format: "Open text + optional category selector"
volume: "High"
quality: "Medium (context-rich but brief)"
support_tickets:
source: "[Intercom / Zendesk / Help Scout / email]"
tagging: "Auto-tag feedback themes (see taxonomy)"
volume: "High"
quality: "High (real problems, real context)"
feature_request_board:
tool: "[Canny / ProductBoard / custom]"
voting: true
status_updates: true # Close the loop!
volume: "Medium"
quality: "High (considered requests)"
# PERIODIC (scheduled)
nps_survey:
frequency: "Quarterly"
trigger: "Email to active users (>30 days tenure)"
follow_up: "Open text for score explanation"
segments: "[by plan tier, tenure, usage level]"
csat_survey:
trigger: "After key interactions (onboarding complete, support resolved, feature shipped)"
format: "1-5 stars + optional comment"
ces_survey:
trigger: "After task completion (setup, first report, integration)"
question: "How easy was it to [specific task]? (1-7)"
# EVENT-DRIVEN (triggered)
onboarding_check_in:
trigger: "Day 7, Day 30, Day 90"
format: "Short email survey (3 questions max)"
cancellation_survey:
trigger: "On churn/downgrade"
format: "Required reason + optional comment"
options:
- "Too expensive"
- "Missing features I need"
- "Too complex / hard to use"
- "Switched to competitor"
- "No longer need this type of product"
- "Poor support experience"
- "Other: [free text]"
win_loss_interview:
trigger: "After closed-won or closed-lost deal"
format: "15-min call or async survey"
renewal_feedback:
trigger: "30 days before renewal"
format: "Health check + satisfaction + roadmap preview"
Customer BaseConfidence 95%, ±5%Confidence 90%, ±5%Minimum Viable100807430500217176501,000278213755,00035725810010,000+370264150
Expected response rates by channel:
TypeWhenDurationSampleGoalDiscoveryPre-build, exploring problem45-60 min8-12Validate problem existsUsabilityFeature in development30-45 min5-7Test assumptionsSatisfactionOngoing, quarterly30 min5-8 per segmentDeep qualitative NPSChurnAfter cancellation15-20 minAll willingUnderstand why they leftWin/LossAfter deal close20-30 min5+ per quarterSales process feedbackAdvisoryStrategic, quarterly60 min3-5 power usersCo-create roadmap
yaml
interview:
type: "[Discovery / Satisfaction / Churn / Win-Loss]"
participant: "[name, role, company, segment]"
date: "[YYYY-MM-DD]"
interviewer: "[name]"
pre_interview:
- Review account history (usage data, support tickets, NPS scores)
- Check CRM for relationship context
- Prepare 3 hypotheses to test
warm_up: # 3-5 min
- "Tell me about your role and what a typical week looks like."
- "How long have you been using [product]?"
- "[Acknowledge something specific about their usage]"
context: # 5-10 min
- "What problem were you trying to solve when you found us?"
- "What were you using before? What worked/didn't?"
- "Walk me through how [product] fits into your workflow."
core_exploration: # 15-20 min
- "Walk me through the last time you used [specific feature]."
- "What's the most valuable thing [product] does for you?"
- "What's the most frustrating thing?"
- "Tell me about a time [product] didn't work the way you expected."
- "What workaround have you built because we're missing something?"
outcome_assessment: # 5-10 min
- "How do you measure the value you get from [product]?"
- "What would happen if you lost access tomorrow?"
- "On a scale of 1-10, how likely would you recommend us? Why that number?"
future_vision: # 5 min
- "If you had a magic wand, what would [product] do that it doesn't today?"
- "What's changing in your world that we should know about?"
close: # 2 min
- "Anything I didn't ask that I should have?"
- "Would you be open to joining our advisory group / beta testing?"
- Thank + follow-up timeline
post_interview:
key_quotes: []
surprises: []
hypotheses_confirmed: []
hypotheses_invalidated: []
action_items: []
The Mom Test (Rob Fitzpatrick):
Five Whys for Root Cause:
Silence technique: After they answer, count to 5 silently. They'll often add the most valuable insight in the silence.
Mirror technique: Repeat their last 3 words as a question. They'll elaborate without you leading.
After every 5 interviews in a batch:
yaml
synthesis:
batch: "[Interview batch name]"
dates: "[range]"
participants: "[count, segments]"
themes:
- theme: "[Name]"
frequency: "[X of Y participants mentioned]"
severity: "[Critical / High / Medium / Low]"
representative_quotes:
- "[exact quote]" — [participant type]
- "[exact quote]" — [participant type]
implications: "[what this means for product/business]"
recommended_action: "[specific next step]"
surprises:
- "[Things you didn't expect]"
segments_divergence:
- "[Where different segments disagreed]"
confidence_level: "[High / Medium / Low]"
next_steps: []
yaml
feedback_taxonomy:
product:
usability:
- "Confusing UI / navigation"
- "Feature hard to find"
- "Too many steps to complete task"
- "Mobile experience issues"
functionality:
- "Feature doesn't work as expected"
- "Missing capability"
- "Performance / speed"
- "Integration issues"
reliability:
- "Bugs / errors"
- "Data loss / corruption"
- "Downtime / availability"
experience:
onboarding:
- "Setup too complex"
- "Documentation unclear"
- "Time to value too long"
support:
- "Response time"
- "Resolution quality"
- "Self-service gaps"
communication:
- "Product updates unclear"
- "Billing confusion"
- "Status page / transparency"
value:
pricing:
- "Too expensive"
- "Wrong packaging / tiers"
- "Hidden costs"
- "Competitor cheaper"
roi:
- "Can't measure value"
- "Not delivering promised results"
- "Value decreased over time"
strategic:
market_fit:
- "Wrong audience"
- "Use case mismatch"
- "Outgrew the product"
competitive:
- "Competitor has feature X"
- "Switching to competitor"
- "Industry trend we're missing"
For every piece of feedback, score:
DimensionScaleGuideSentiment-2 to +2-2=angry, -1=frustrated, 0=neutral, +1=positive, +2=delightedUrgency1-51=nice-to-have, 3=important, 5=blocking/churningFrequencyCountHow many unique customers mention thisRevenue at risk$ARR of customers mentioning this themeEffort to fixS/M/L/XLEngineering estimate
When processing feedback, apply tags automatically:
text
IF contains("cancel", "churn", "leaving", "switching") → tag: churn_risk, urgency: 5
IF contains("bug", "error", "broken", "crash") → tag: bug_report, urgency: 4
IF contains("wish", "would be nice", "if only") → tag: feature_request, urgency: 2
IF contains("love", "amazing", "best") → tag: positive_signal, sentiment: +2
IF contains("competitor", "alternative", "other tool") → tag: competitive_intel
IF contains("price", "cost", "expensive", "cheaper") → tag: pricing_feedback
IF contains("confusing", "hard to", "can't figure") → tag: usability_issue, urgency: 3
Question: "How likely are you to recommend [product] to a colleague? (0-10)"
Scoring:
Benchmarks by industry:
IndustryPoorAverageGoodExcellentSaaS B2B<2020-4040-6060+SaaS B2C<1010-3030-5050+E-commerce<2020-4040-6060+Financial Services<1010-3030-5050+Healthcare Tech<1515-3535-5555+
NPS follow-up questions (by score):
NPS action rules:
Question: "How satisfied were you with [specific interaction]? (1-5)" Score: (Satisfied responses [4-5] / Total responses) × 100
Benchmarks: 75% = decent, 85% = good, 90%+ = excellent
When to use: After specific interactions (support, onboarding, feature launch)
Question: "How easy was it to [specific task]? (1-7, 1=very difficult, 7=very easy)" Score: Average of all responses
Benchmarks: <4 = high effort (problem), 4-5 = acceptable, 5+ = low effort (good)
Why CES matters: CES is the strongest predictor of future purchasing behavior. High-effort experiences drive 96% of disloyalty.
Combine metrics for overall VoC health:
yaml
voc_health_score:
nps:
weight: 30
score: "[0-100 normalized: (NPS + 100) / 2]"
csat:
weight: 20
score: "[CSAT %]"
ces:
weight: 15
score: "[(CES / 7) × 100]"
feedback_volume:
weight: 10
score: "[trend: increasing = good]"
response_rate:
weight: 10
score: "[survey response rate %]"
closed_loop_rate:
weight: 15
score: "[% of feedback items with documented response/action]"
total: "[weighted sum / 100]"
grade: "[A: 80+, B: 65-79, C: 50-64, D: 35-49, F: <35]"
Score each feature request:
FactorFormulaWeightReach# customers requesting (or affected) per quarter25%ImpactScore 0.5 (minimal), 1 (low), 2 (medium), 3 (high)25%Confidence% confidence in estimates (50-100%)20%EffortPerson-weeks to build15%Revenue SignalARR at risk or expansion ARR15%
RICE-V Score = (Reach × Impact × Confidence × Revenue Signal) / Effort
text
1. Is this blocking revenue? (churn risk from top accounts)
→ YES: Fast-track (Sprint 1)
→ NO: Continue ↓
2. Does it affect >20% of customers?
→ YES: High priority (next quarter)
→ NO: Continue ↓
3. Is it from a strategic segment we're targeting?
→ YES: Medium-high priority
→ NO: Continue ↓
4. Does it align with product vision?
→ YES: Backlog with planned quarter
→ NO: Decline with explanation (close the loop!)
Not every feature request should be built. Decline gracefully:
Template: "Thanks for this suggestion! We've heard this from [X] customers. Right now, our roadmap is focused on [theme] because [reason]. We're not planning to build this in the next [timeframe], but we've logged it. Here's what we ARE building that might help: [alternative]. We'll update this request if our plans change."
When to say no:
text
COLLECT → ANALYZE → ACT → COMMUNICATE
↑ |
└──────────────────────────────┘
Acknowledgment (within 24 hours): "Thanks for sharing this feedback. We've logged it as [category] and it's being reviewed by our [product/engineering] team. We'll update you when we have a plan."
In Progress: "Quick update on your feedback about [topic] — we're actively working on this. Expected [timeframe]. Here's what's changing: [brief description]."
Shipped: "Remember when you told us about [original feedback]? We fixed it! Here's what changed: [specific improvement]. Try it out and let us know what you think."
Declined (see "Saying No" above)
TypeAcknowledgeTriageResolve/RespondBug report4 hours24 hoursPer severity SLAFeature request48 hours1 weekQuarterly reviewComplaint4 hours24 hours72 hoursPraise24 hoursN/AShare internallyChurn feedback24 hours48 hours1 week (win-back)NPS detractor24 hours48 hours1 week
yaml
feedback_item:
id: "FB-[YYYY]-[####]"
source: "[channel]"
customer: "[name, segment, ARR]"
date_received: "[YYYY-MM-DD]"
category: "[from taxonomy]"
sentiment: "[-2 to +2]"
urgency: "[1-5]"
status: "[New | Acknowledged | Triaging | In Progress | Shipped | Declined | Won't Fix]"
assigned_to: "[team/person]"
date_acknowledged: "[YYYY-MM-DD]"
date_resolved: "[YYYY-MM-DD]"
resolution: "[what was done]"
customer_notified: "[yes/no + date]"
customer_satisfied: "[yes/no/unknown]"
linked_items:
jira: "[ticket ID]"
roadmap: "[feature/initiative]"
other_feedback: "[related FB IDs]"
yaml
weekly_voc:
period: "[week of YYYY-MM-DD]"
volume:
total_feedback: "[count]"
by_channel:
support: "[count]"
in_app: "[count]"
surveys: "[count]"
interviews: "[count]"
trend: "[↑/↓/→ vs last week]"
metrics:
nps: "[score] ([↑/↓] [X] from last period)"
csat: "[%] ([↑/↓] [X]%)"
ces: "[score] ([↑/↓])"
top_themes:
- theme: "[#1 theme]"
mentions: "[count]"
sentiment: "[avg]"
revenue_at_risk: "[$]"
action: "[what we're doing]"
- theme: "[#2]"
# ...
- theme: "[#3]"
# ...
alerts:
- "[Enterprise detractor: Company X, NPS dropped from 8 to 3]"
- "[New theme emerging: Y mentioned by 5 customers this week]"
closed_loop:
items_received: "[count]"
items_acknowledged: "[count] ([%])"
items_resolved: "[count]"
avg_resolution_time: "[days]"
wins:
- "[Positive feedback / testimonial / case study lead]"
Structure:
Go deeper quarterly:
When making product decisions, rank evidence:
Rule: Never build based on Level 6-7 alone. Always triangulate with Level 1-3.
yaml
product_decision:
what: "[Feature/change being considered]"
voc_evidence:
quantitative:
customers_requesting: "[count]"
arr_represented: "[$]"
nps_impact: "[detractors mentioning this]"
support_tickets: "[count related]"
qualitative:
interview_quotes:
- "[quote]" — [segment]
themes_connected: "[from taxonomy]"
behavioral:
usage_data: "[relevant metrics]"
churn_correlation: "[if applicable]"
decision: "[Build / Decline / Investigate further]"
confidence: "[High / Medium / Low]"
expected_impact:
nps_change: "[estimated]"
churn_reduction: "[estimated]"
expansion_revenue: "[estimated]"
success_metrics:
- "[How we'll know this worked]"
review_date: "[When to check impact]"
Structure:
Selection criteria:
When customers mention competitors:
yaml
competitive_mention:
competitor: "[name]"
context: "[switching to / comparing / switched from]"
feature_gap: "[what competitor has that we don't]"
our_advantage: "[what they like about us vs competitor]"
customer_segment: "[type]"
deal_size: "[$]"
action: "[product response needed?]"
Track quarterly: "Competitor mention frequency" — rising mentions of a specific competitor = early warning.
Customer feedback reveals pricing issues:
SignalMeaningAction"Too expensive" with no specificsPerception problem, not price problemImprove value communication"Feature X should be in my plan"Packaging issueReview tier boundaries"Competitor is cheaper"Price positioningCompetitive analysis"I'd pay more for Y"Expansion opportunityTest premium tier/add-on"Not sure what I'm paying for"Value clarity gapImprove billing page, add ROI dashboard
If you have multiple products:
Simplified system when you have <50 customers:
Rate your VoC program (0-100):
DimensionWeight0-255075100Collection coverage15%1 channel3 channels5+ channelsFull journey coverageAnalysis depth15%Read commentsCategorizeQuantified themesPredictive insightsResponse time10%WeeksDaysHoursReal-time SLA metClosed-loop rate15%<20%40-60%60-80%>80% with satisfaction checkDecision influence15%IgnoredOccasional inputRegular roadmap inputSystematic decision driverMetric tracking10%NoneNPS existsNPS + CSAT + CESFull suite + benchmarksSegmentation10%NoneBy plan tierMulti-dimensionalPersona-level insightsROI measurement10%NoneAnecdotalFeature-level impactRevenue-attributed
Use these to interact:
Built by AfrexAI — Turning customer voices into revenue decisions.