ARPU stands for Average Revenue Per User, which is the average revenue generated from each customer.
It is an essential metric for evaluating profitability and growth, especially for companies adopting SaaS business models or subscription-based business models.
This metric is regularly monitored (usually monthly) by executives, product managers, and marketing personnel to optimize pricing strategies, measure the effectiveness of upselling initiatives, and assess the health of the business.
Note that ARPU may also be referred to as ARPC (Average Revenue Per Customer) or ARPA (Average Revenue Per Account).
The sample data we’re using is payment data from a subscription-based business. You can download the data from this page.
In this dataset, each row represents a monthly payment history for one customer, and the columns contain the following information:
To calculate ARPU, we need information on MRR (Monthly Recurring Revenue) or ARR (Annual Recurring Revenue).
Generally, ARPU is the average monthly revenue obtained from each customer, calculated based on MRR. However, in some cases, ARPU may refer to the average annual revenue per customer, calculated using ARR.
For this example, we’ll calculate ARPU as the average monthly revenue obtained from each customer.
First, select “Summarize” from the column header menu of the payment date.
In the summarize dialog, select “Payment Date” for the group and choose “Month” as the date unit with truncation. When calculating annual ARPU, you would select “Year” instead.
Next, select “Payment Amount” for the value and choose SUM as the aggregation function.
Finally, change the column name to “MRR” and click the Preview button. When calculating annual ARPU, you would change the column name to “ARR” instead.
This completes the setup for aggregating MRR (or ARR).
Next, we’ll aggregate the customer count information needed for ARPU calculation.
In the summarize dialog, select “Customer ID” for the value and choose “Count Unique” as the aggregation function.
Then, click the edit icon to change the new column name to “Customer Count” and click the Execute button.
We have now aggregated the MRR (or ARR) and customer count needed for ARPU calculation.
Finally, to calculate ARPU, select “Create Calculation” > “Standard” from the column header menu of the MRR (or ARR) column.
In the Create Calculation dialog, enter
MRR / Customer Count
in the calculation editor. When
calculating annual ARPU, the formula would be
ARR / Customer Count
.
Lastly, ensure “Create a new column” is checked, set the column name to “ARPU”, change “Create after this column” to the last column, and execute.
We have successfully calculated ARPU.
If you want to calculate ARPU (Average Revenue Per User/Average Revenue Per Customer) using a custom R command with this payment data, please refer to the following R code.
# Step 1: Change payment date to monthly. When calculating ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer) per year (annual/yearly), change the payment date to a monthly basis.
# - When calculating monthly ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer), truncate the date by "month"
# - When calculating annual (yearly) ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer), truncate the date by "year"
mutate(`Payment Date` = floor_date(`Payment Date`, unit = "month")) %>%
# Step 2: Aggregate monthly MRR and customer count. (When calculating annual (yearly) ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer), aggregate ARR and customer count)
# Since we've already truncated the date by "month", we're aggregating the monthly revenue (MRR) and customer count
# If the date is truncated by "year", it becomes annual revenue, so we would aggregate ARR (Annual Recurring Revenue) and customer count
group_by(`Payment Date`) %>%
summarize(
MRR = sum(`Payment Amount`, na.rm = TRUE), # Total revenue for that month (MRR) / Total revenue for the year (ARR)
`Customer Count` = n_distinct(`Customer ID`) # Unique customer count for that month
) %>%
# Step 3: Calculate monthly ARPU. (When calculating annual (yearly) ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer), calculate annual ARPU)
# When calculating monthly ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer), divide MRR by customer count to calculate ARPU
# When calculating annual (yearly) ARPU (Average Revenue Per User/Average Revenue Per Customer/Average Revenue Generated Per Customer), divide ARR by customer count to calculate ARPU
mutate(
ARPU = MRR / Customer Count, # For annual ARPU calculation, use ARR/Customer Count
# Specify the position of the ARPU column
# If the MRR column exists, place after it; if not, place after the last column
.after = ifelse(
"MRR" %in% names(.), # Check if MRR column exists
"MRR", # If it exists, place after MRR
last_col() # If it doesn't exist, place after the last column
)
R command for calculating annual (yearly) ARPU (Average Revenue Per Customer)
# Step 1: Change payment date to annual basis
# - When calculating monthly ARPU (Average Revenue Per Customer), truncate the date by "month"
# - When calculating annual ARPU (Average Revenue Per Customer), truncate the date by "year"
mutate(`Payment Date` = floor_date(`Payment Date`, unit = "year")) %>%
# Step 2: Aggregate annual ARR and customer count
# Since we've already truncated the date by "year", we're aggregating the annual revenue (ARR) and customer count
group_by(`Payment Date`) %>%
summarize(
ARR = sum(`Payment Amount`, na.rm = TRUE), # Total revenue for that year (ARR)
`Customer Count` = n_distinct(`Customer ID`) # Unique customer count for that year
) %>%
# Step 3: Calculate annual ARPU
# When calculating annual ARPU (Average Revenue Per Customer), divide ARR by customer count to calculate ARPU
mutate(
ARPU = ARR / Customer Count, # Calculate annual ARPU
# Specify the position of the ARPU column
# If the ARR column exists, place after it; if not, place after the last column
.after = ifelse(
"ARR" %in% names(.), # Check if ARR column exists
"ARR", # If it exists, place after ARR
last_col() # If it doesn't exist, place after the last column
)
)