Annual Recurring Revenue (ARR)
Yearly value of recurring revenue from subscription customers normalized to a 12-month period
Overview
Annual Recurring Revenue (ARR) represents the yearly value of recurring revenue from subscription customers, normalized to a 12-month period. It's the foundational metric for SaaS businesses, providing a clear view of predictable revenue and business growth trajectory.
ARR excludes one-time fees, professional services, and variable usage charges, focusing solely on the predictable, recurring subscription revenue. This makes it an essential metric for understanding the health and growth potential of subscription-based businesses.
ARR = Monthly Recurring Revenue (MRR) × 12
ARR Components
New ARR: Revenue from new customers
Expansion ARR: Upsells and cross-sells to existing customers
Contracted ARR: Downgrades from existing customers
Churned ARR: Revenue lost from canceled customers
Why It Matters
- Business Valuation: Primary metric for SaaS company valuation and fundraising
- Growth Tracking: Measures sustainable, predictable revenue growth
- Financial Planning: Enables accurate forecasting and budget planning
- Investor Relations: Key metric for board meetings and investor updates
- Operational Decisions: Guides hiring, investment, and scaling decisions
- Performance Benchmarking: Industry standard for comparing SaaS performance
How to Measure It
Calculate ARR by annualizing recurring subscription revenue, excluding one-time charges and variable fees.
Basic ARR Calculation
-- Calculate current ARR from active subscriptions
WITH current_subscriptions AS (
SELECT
customer_id,
subscription_id,
plan_name,
monthly_amount,
annual_amount,
billing_frequency,
subscription_status,
start_date,
end_date
FROM subscriptions
WHERE subscription_status = 'active'
AND (end_date IS NULL OR end_date > CURRENT_DATE)
),
arr_calculation AS (
SELECT
customer_id,
subscription_id,
plan_name,
CASE
WHEN billing_frequency = 'monthly' THEN monthly_amount * 12
WHEN billing_frequency = 'quarterly' THEN monthly_amount * 12
WHEN billing_frequency = 'annual' THEN annual_amount
ELSE 0
END as annual_value
FROM current_subscriptions
)
SELECT
COUNT(DISTINCT customer_id) as total_customers,
COUNT(DISTINCT subscription_id) as total_subscriptions,
SUM(annual_value) as current_arr,
AVG(annual_value) as avg_arr_per_customer,
ROUND(SUM(annual_value) / COUNT(DISTINCT customer_id), 2) as arpu_annual
FROM arr_calculation;
ARR Movement Analysis
-- Track ARR movements (new, expansion, contraction, churn)
WITH monthly_arr_changes AS (
SELECT
DATE_TRUNC('month', event_date) as month,
customer_id,
event_type, -- 'new', 'expansion', 'contraction', 'churn'
arr_change
FROM subscription_events
WHERE event_date >= CURRENT_DATE - INTERVAL '12 months'
),
arr_movements AS (
SELECT
month,
SUM(CASE WHEN event_type = 'new' THEN arr_change ELSE 0 END) as new_arr,
SUM(CASE WHEN event_type = 'expansion' THEN arr_change ELSE 0 END) as expansion_arr,
SUM(CASE WHEN event_type = 'contraction' THEN arr_change ELSE 0 END) as contraction_arr,
SUM(CASE WHEN event_type = 'churn' THEN arr_change ELSE 0 END) as churned_arr,
SUM(arr_change) as net_arr_change
FROM monthly_arr_changes
GROUP BY 1
)
SELECT
month,
new_arr,
expansion_arr,
ABS(contraction_arr) as contraction_arr, -- Show as positive
ABS(churned_arr) as churned_arr, -- Show as positive
net_arr_change,
SUM(net_arr_change) OVER (ORDER BY month) as cumulative_arr_change,
ROUND(100.0 * expansion_arr / (new_arr + expansion_arr), 1) as expansion_rate_of_growth
FROM arr_movements
ORDER BY month;
ARR Cohort Analysis
-- Analyze ARR retention by acquisition cohort
WITH customer_cohorts AS (
SELECT
customer_id,
DATE_TRUNC('month', MIN(subscription_start_date)) as acquisition_month,
SUM(CASE WHEN billing_frequency = 'monthly' THEN monthly_amount * 12
WHEN billing_frequency = 'annual' THEN annual_amount
ELSE 0 END) as initial_arr
FROM subscriptions
WHERE subscription_start_date >= '2023-01-01'
GROUP BY 1
),
monthly_customer_arr AS (
SELECT
c.customer_id,
c.acquisition_month,
c.initial_arr,
DATE_TRUNC('month', s.month_date) as revenue_month,
SUM(s.monthly_recurring_revenue * 12) as current_arr
FROM customer_cohorts c
JOIN subscription_revenue s ON c.customer_id = s.customer_id
WHERE s.month_date >= c.acquisition_month
GROUP BY 1, 2, 3, 4
),
cohort_retention AS (
SELECT
acquisition_month,
revenue_month,
EXTRACT(months FROM AGE(revenue_month, acquisition_month)) as months_since_acquisition,
COUNT(DISTINCT customer_id) as active_customers,
SUM(current_arr) as cohort_arr,
SUM(initial_arr) as initial_cohort_arr
FROM monthly_customer_arr
GROUP BY 1, 2, 3
)
SELECT
acquisition_month,
months_since_acquisition,
active_customers,
cohort_arr,
initial_cohort_arr,
ROUND(100.0 * cohort_arr / initial_cohort_arr, 1) as arr_retention_rate,
ROUND(cohort_arr / active_customers, 0) as avg_arr_per_customer
FROM cohort_retention
WHERE months_since_acquisition <= 24
ORDER BY acquisition_month, months_since_acquisition;
ARR Calculation Guidelines
Include only recurring subscription fees. Exclude setup fees, professional services, and variable usage charges. Use committed contract values for annual plans.
Best Practices
1. ARR Recognition Standards
- Include only recurring subscription revenue
- Exclude one-time setup fees and professional services
- Use signed contract value for annual commitments
- Account for discounts and promotional pricing accurately
2. Movement Tracking
- Track new, expansion, contraction, and churned ARR separately
- Monitor net revenue retention rates
- Analyze ARR movements by customer segment
- Use consistent timing for ARR recognition
3. Segmentation Analysis
- By customer size (SMB, mid-market, enterprise)
- By product line or package tier
- By geographic region
- By acquisition channel or sales team
4. Forecasting ARR
- Use historical patterns for seasonal adjustments
- Factor in sales pipeline conversion rates
- Account for expected churn and expansion
- Include contract renewal probabilities
5. Growth Strategies
- New Customer Acquisition: Invest in sales and marketing efficiency
- Expansion Revenue: Drive upsells and cross-sells to existing customers
- Churn Reduction: Improve customer success and product value
- Pricing Optimization: Test pricing strategies and packaging