Как посчитать annual vs monthly mix в SQL
Содержание:
Зачем считать mix
Годовые подписки = upfront cash, ниже churn, но annual discount «жжёт» revenue. Monthly = выше gross MRR, выше churn. Mix annual/monthly — стратегический выбор: рост cash flow vs MRR. SaaS-компании часто пушат annual на 15-20% discount чтобы получить cash и снизить voluntary churn.
Базовая разбивка
SELECT
billing_interval,
COUNT(*) AS active_subs,
SUM(mrr) AS total_mrr,
COUNT(*)::NUMERIC * 100 / SUM(COUNT(*)) OVER () AS pct_of_subs,
SUM(mrr) * 100.0 / SUM(SUM(mrr)) OVER () AS pct_of_mrr
FROM subscriptions
WHERE status = 'active'
GROUP BY billing_interval;Если annual 30% subs, но 50% MRR — annual юзеры более ценные.
ARPU и churn по типу
SELECT
billing_interval,
AVG(mrr) AS avg_mrr,
SUM(CASE WHEN churned_at IS NOT NULL THEN 1 ELSE 0 END)::NUMERIC * 100
/ COUNT(*) AS churn_pct,
AVG(EXTRACT(EPOCH FROM (COALESCE(churned_at, CURRENT_DATE) - subscription_start)) / 86400) AS avg_tenure_days
FROM subscriptions
WHERE subscription_start >= '2025-01-01'
GROUP BY billing_interval;Стандарт: annual churn 5-15%, monthly 30-50% (за год).
Annual discount экономика
WITH revenue_by_type AS (
SELECT
billing_interval,
AVG(mrr * 12) AS annual_revenue_per_user,
AVG(discount_pct) AS avg_discount,
SUM(CASE WHEN churned_at IS NOT NULL THEN 1 ELSE 0 END)::NUMERIC / COUNT(*) AS churn_rate
FROM subscriptions
WHERE subscription_start >= '2025-01-01'
GROUP BY billing_interval
)
SELECT
billing_interval,
annual_revenue_per_user,
annual_revenue_per_user * (1 - churn_rate) AS expected_year_1_revenue,
annual_revenue_per_user * POWER(1 - churn_rate, 2) AS expected_year_2_revenue,
annual_revenue_per_user * POWER(1 - churn_rate, 3) AS expected_year_3_revenue
FROM revenue_by_type;Несмотря на discount, annual часто даёт больше total revenue через 2-3 года из-за меньшего churn.
Динамика mix
SELECT
DATE_TRUNC('month', subscription_start)::DATE AS month,
billing_interval,
COUNT(*) AS new_subs,
COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY DATE_TRUNC('month', subscription_start)) AS pct
FROM subscriptions
WHERE subscription_start >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY DATE_TRUNC('month', subscription_start), billing_interval
ORDER BY month, billing_interval;Если annual share растёт — pricing-стратегия работает. Падает — кампания по annual нужна.
Частые ошибки
Ошибка 1. Сравнивать annual price с monthly без discount. Annual обычно с discount 15-20%. Чистое сравнение MRR vs ARR / 12 — без учёта.
Ошибка 2. Считать annual churn как monthly. Annual churn measured per year. Не нужно × 12.
Ошибка 3. Игнорировать downgrade annual → monthly. Юзер мог перейти с annual на monthly при renewal. Отслеживайте отдельно.
Ошибка 4. ARPU annual = ARPU monthly × 12. Только если нет discount и нет дополнительных features.
Ошибка 5. Не учитывать deferred revenue для annual. В финансах annual amounts распределяются по 12 месяцам. В analytics обычно — accrual.
Связанные темы
- Как посчитать MRR в SQL
- Как посчитать churn в SQL
- Как посчитать ARR в SQL
- Как посчитать renewal rate в SQL
FAQ
Какой annual mix хороший?
Top SaaS компании: 40-60% MRR из annual. SMB — обычно 20-40%.
Annual discount какой?
15-20% — стандарт. Больше — cash-обмен, но снижает retention dollars.
Annual → monthly downgrade — что значит?
Customer не уверен в продукте. Часто previous churn signal.
Annual users реально менее churnful?
Да, в 2-4 раза. Lock-in работает.
Monthly → annual upsell?
ABM-кампании, in-app prompts, специальные offers. Конверсия 5-15% — типична.