Required Datapoints
- NPS or CSAT scores
- Product usage signals (e.g., feature adoption, frequency)
- Milestone achievements (e.g., onboarding completion)
- Support/CS interactions or qualitative notes
- Optional: account tenure, renewal status
Referral Readiness Score is a predictive metric that assesses how likely a user or account is to make a referral based on behavioral, usage, and sentiment signals. It helps identify high-potential advocates before they take action.
Referral Readiness Score is a key indicator of latent advocacy potential and referral timing accuracy, reflecting how a blend of behavior, satisfaction, and product milestones predicts which users are primed to refer—even before being prompted.
The relevance and interpretation of this metric shift depending on the model or product:
A rising score signals product trust, value alignment, and readiness to promote, while a declining score suggests churn risk, disengagement, or unqualified referrer segments.
By scoring users or accounts based on thresholds (e.g., NPS + activation milestone), you can proactively identify and prioritize high-quality advocacy candidates.
Referral Readiness Score informs:
These are the main factors that directly impact the metric. Understanding these lets you know what levers you can pull to improve the outcome
Actionable ideas to optimize this KPI, from fast, low-effort wins to strategic initiatives that drive measurable impact.
Activities commonly tied to improving or operationalizing this KPI.
| Activity | Description |
|---|---|
| Referral Campaign Targeting | Referral Campaign Targeting involves identifying, defining, and prioritizing target customer segments for referral campaigns. It gives teams a clear plan for where to focus, how to sequence work, and what to measure. Relevant KPIs include Referral Readiness Score. |
| Health Scoring | Health Scoring is a systematic process for assessing the overall status and engagement of customer accounts. It turns signals into decisions, interventions, and measurable follow-up. Relevant KPIs include Referral Readiness Score. |
| NPS Programs | NPS Programs focuses on the systematic collection, analysis, and application of Net Promoter Score (NPS) feedback from customers to guide go-to-market strategies. It coordinates execution across touchpoints so teams can move users or accounts toward the target outcome. Relevant KPIs include Referral Readiness Score. |
| Lifecycle Nurturing | Lifecycle Nurturing is a strategic process that proactively guides and supports customers throughout their entire journey with a product or service, from initial onboarding through ongoing value realization and renewal. It helps teams translate strategy into repeatable execution. Relevant KPIs include Referral Readiness Score. |
| Intent Monitoring | Intent Monitoring focuses on the ongoing process of tracking, interpreting, and utilizing signals that reveal a prospective customer’s interest, needs, and readiness to engage with a solution. It turns signals into decisions, interventions, and measurable follow-up. Relevant KPIs include Referral Readiness Score. |
NPS = 9 (+40 pts)
Onboarding complete (+20 pts)
Active weekly user (+15 pts)
CS call flagged as “delighted” (+25 pts)
Score = 100 (Referral-Ready)
This KPI is associated with the following stages in the AAARRR (Pirate Metrics) funnel:
This KPI is classified as a lagging Indicator. It reflects the results of past actions or behaviors and is used to validate performance or assess the impact of previous strategies.
This role is directly accountable for the KPI and is expected to drive progress and decisions around it.
These roles contribute directly to performance and typically partner on execution, reporting, or optimization.
These leading indicators influence this KPI and act as early signals that forecast future changes in this KPI.
These lagging indicators confirm, quantify, or amplify this KPI and help explain the broader business impact on this KPI after the fact.
How this KPI is structured in Cube.js, including its key measures, dimensions, and calculation logic for consistent reporting.
cube('UserBehavior', { sql: `SELECT * FROM user_behavior`, measures: { npsScore: { sql: `nps_score`, type: 'avg', title: 'Average NPS Score', description: 'Average Net Promoter Score for users.' }, csatScore: { sql: `csat_score`, type: 'avg', title: 'Average CSAT Score', description: 'Average Customer Satisfaction Score for users.' }, featureAdoption: { sql: `feature_adoption`, type: 'avg', title: 'Feature Adoption Rate', description: 'Average rate of feature adoption by users.' }, usageFrequency: { sql: `usage_frequency`, type: 'avg', title: 'Usage Frequency', description: 'Average frequency of product usage by users.' } }, dimensions: { userId: { sql: `user_id`, type: 'string', primaryKey: true, title: 'User ID', description: 'Unique identifier for each user.' }, createdAt: { sql: `created_at`, type: 'time', title: 'Created At', description: 'Timestamp when the user behavior record was created.' } }})cube('Milestones', { sql: `SELECT * FROM milestones`, measures: { onboardingCompletion: { sql: `onboarding_completion`, type: 'count', title: 'Onboarding Completion Count', description: 'Count of users who have completed onboarding.' } }, dimensions: { milestoneId: { sql: `milestone_id`, type: 'string', primaryKey: true, title: 'Milestone ID', description: 'Unique identifier for each milestone.' }, achievedAt: { sql: `achieved_at`, type: 'time', title: 'Achieved At', description: 'Timestamp when the milestone was achieved.' } }})cube('SupportInteractions', { sql: `SELECT * FROM support_interactions`, measures: { interactionCount: { sql: `interaction_id`, type: 'count', title: 'Support Interaction Count', description: 'Count of support interactions per user.' } }, dimensions: { interactionId: { sql: `interaction_id`, type: 'string', primaryKey: true, title: 'Interaction ID', description: 'Unique identifier for each support interaction.' }, interactionDate: { sql: `interaction_date`, type: 'time', title: 'Interaction Date', description: 'Date of the support interaction.' } }})cube('AccountDetails', { sql: `SELECT * FROM account_details`, measures: { accountTenure: { sql: `account_tenure`, type: 'avg', title: 'Average Account Tenure', description: 'Average tenure of accounts in months.' }, renewalStatus: { sql: `renewal_status`, type: 'count', title: 'Renewal Status Count', description: 'Count of accounts by renewal status.' } }, dimensions: { accountId: { sql: `account_id`, type: 'string', primaryKey: true, title: 'Account ID', description: 'Unique identifier for each account.' }, renewalDate: { sql: `renewal_date`, type: 'time', title: 'Renewal Date', description: 'Date of the account renewal.' } }})Note: This is a reference implementation and should be used as a starting point. You’ll need to adapt it to match your own data model and schema