Required Datapoints
- Total Revenue from All Accounts: The total revenue generated in a given period.
- Number of Accounts: The total number of active customer accounts during that period.
Average Revenue Per User (ARPU) measures the average monthly or yearly revenue generated from each customer account, typically used in subscription-based businesses.
Average Revenue Per Account (ARPA) is a foundational SaaS metric that tracks how much revenue each customer account contributes over a defined period — often monthly or annually. It’s especially valuable in account-based models, where each account may have multiple users or licenses.
The relevance and interpretation of this metric shift depending on the model or product:
A rising ARPA indicates successful expansion, upsells, or premium adoption. A falling ARPA may suggest downgrades, churn within accounts, or pricing misalignment.
Segment by plan, vertical, or acquisition channel to find expansion-ready segments and pricing opportunities.
Average Revenue Per Account (ARPA) 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 |
|---|---|
| Account Segmentation | Account Segmentation focuses on Account Segmentation groups accounts into actionable categories based on factors such as value, product fit, behavior, lifecycle stage, and growth potential. It gives teams a clear plan for where to focus, how to sequence work, and what to measure. Relevant KPIs include Average Revenue Per Account. |
| Expansion Plays | Expansion Plays focuses on Expansion Motion encompasses the strategic activities aimed at increasing the value of existing customer accounts by identifying and pursuing opportunities for upselling, cross-selling, and encouraging broader product adoption. It coordinates execution across touchpoints so teams can move users or accounts toward the target outcome. Relevant KPIs include Average Revenue Per Account and Average Revenue Per Expansion Account. |
| Customer Tiering | Customer Tiering involves grouping customers into distinct categories based on criteria such as revenue potential, product usage, engagement level, industry, or strategic value. It gives teams a clear plan for where to focus, how to sequence work, and what to measure. Relevant KPIs include Average Revenue Per Account. |
A SaaS business calculates ARPA for Q1:
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('Revenue', { sql: `SELECT * FROM revenue`, measures: { totalRevenue: { sql: `total_revenue`, type: 'sum', title: 'Total Revenue', description: 'Total revenue generated from all accounts in a given period.' } }, dimensions: { id: { sql: `id`, type: 'number', primaryKey: true }, createdAt: { sql: `created_at`, type: 'time', title: 'Created At', description: 'The time when the revenue record was created.' } }});cube('Accounts', { sql: `SELECT * FROM accounts`, measures: { numberOfAccounts: { sql: `account_id`, type: 'countDistinct', title: 'Number of Accounts', description: 'The total number of active customer accounts during a given period.' } }, dimensions: { accountId: { sql: `account_id`, type: 'number', primaryKey: true }, createdAt: { sql: `created_at`, type: 'time', title: 'Created At', description: 'The time when the account was created.' } }});cube('AverageRevenuePerAccount', { sql: `SELECT * FROM revenue JOIN accounts ON revenue.account_id = accounts.account_id`, measures: { averageRevenuePerAccount: { sql: `${Revenue.totalRevenue} / NULLIF(${Accounts.numberOfAccounts}, 0)`, type: 'number', title: 'Average Revenue Per Account', description: 'Average Revenue Per User (ARPU) measures the average monthly or yearly revenue generated from each customer account.' } }, joins: { Revenue: { relationship: 'belongsTo', sql: `${CUBE}.account_id = ${Revenue}.account_id` }, Accounts: { relationship: 'belongsTo', sql: `${CUBE}.account_id = ${Accounts}.account_id` } }, dimensions: { accountId: { sql: `account_id`, type: 'number', primaryKey: true }, createdAt: { sql: `created_at`, type: 'time', title: 'Created At', description: 'The time when the record was created.' } }});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