Как посчитать annual vs monthly mix в SQL

Закрепи формулу annual vs monthly mix в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать annual vs monthly mix в Telegram

Зачем считать 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.

Закрепи формулу annual vs monthly mix в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать annual vs monthly mix в Telegram

Динамика 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.

Связанные темы

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% — типична.