Как посчитать Upgrade Rate в SQL
WHERE корректно оставит только строки, где столбец channel задан (не равен NULL)?Содержание:
Зачем Upgrade Rate
Upgrade — лучший вид расширения (expansion). Пользователи платят больше, а значит, они вовлечены и продукт решает для них более крупную задачу. Высокий Upgrade Rate коррелирует с product-market fit.
Формула
Upgrade Rate = customers_upgraded / total_customers × 100%
Expansion MRR = SUM(new_plan - old_plan) для upgradedБазовый расчёт
Данные: plan_changes(user_id, old_plan, new_plan, change_at, plan_value).
WITH base AS (
SELECT
user_id,
BOOL_OR(new_plan_value > old_plan_value) AS upgraded
FROM plan_changes
WHERE change_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY user_id
)
SELECT
COUNT(*) AS users_with_changes,
COUNT(*) FILTER (WHERE upgraded) AS upgraded,
COUNT(*) FILTER (WHERE upgraded)::NUMERIC * 100 / NULLIF(COUNT(*), 0) AS upgrade_rate_pct
FROM base;Expansion MRR
SELECT
DATE_TRUNC('month', change_at) AS month,
COUNT(*) FILTER (WHERE new_plan_value > old_plan_value) AS upgrade_events,
SUM(new_plan_value - old_plan_value) FILTER (WHERE new_plan_value > old_plan_value) AS expansion_mrr,
COUNT(*) FILTER (WHERE new_plan_value < old_plan_value) AS downgrade_events,
SUM(old_plan_value - new_plan_value) FILTER (WHERE new_plan_value < old_plan_value) AS contraction_mrr
FROM plan_changes
WHERE change_at >= '2026-01-01'
GROUP BY 1
ORDER BY 1;По сегментам
SELECT
u.segment,
COUNT(DISTINCT u.user_id) AS users,
COUNT(DISTINCT p.user_id) FILTER (WHERE p.new_plan_value > p.old_plan_value) AS upgraded,
COUNT(DISTINCT p.user_id) FILTER (WHERE p.new_plan_value > p.old_plan_value)::NUMERIC * 100
/ NULLIF(COUNT(DISTINCT u.user_id), 0) AS upgrade_rate_pct
FROM users u
LEFT JOIN plan_changes p ON p.user_id = u.user_id
AND p.change_at >= CURRENT_DATE - INTERVAL '180 days'
GROUP BY u.segment
ORDER BY upgrade_rate_pct DESC;Частые ошибки
Ошибка 1. Несколько апгрейдов подряд. Пользователь повышал тариф 3 раза. Считать это как одного апгрейднувшегося пользователя или как 3 события?
Ошибка 2. Апгрейд и даунгрейд у одного клиента. Пользователь повысил тариф в первом квартале и понизил во втором. Учитывать в обоих периодах или брать чистый результат (net)?
Ошибка 3. Стоимость тарифа против набора функций. Если цена тарифа не изменилась, но добавилось больше функций — по деньгам это не апгрейд, хотя вовлечённость может вырасти.
Ошибка 4. Переход с триала на платный — это не апгрейд. Переход с бесплатного плана на первый платный — это конверсия, а не апгрейд.
Ошибка 5. Изменение цен. Если компания подняла цены на тарифы, старые клиенты обычно остаются на прежних условиях (grandfathered). Такой рост выручки не считается апгрейдом.
Связанные темы
- Как посчитать MRR в SQL
- Как посчитать NRR в SQL
- Как посчитать renewal rate в SQL
- Как посчитать MRR Churn в SQL
FAQ
Какой Upgrade Rate считается нормой?
Для B2B-SaaS нормой считается 10-25% в год, для B2C-подписок — 5-15%. Точный ориентир зависит от того, насколько велика разница в ценности между тарифами.
Чем апгрейд отличается от кросс-селла?
Апгрейд — это переход на более высокий тариф того же продукта. Кросс-селл — это продажа отдельного, нового продукта. По деньгам оба увеличивают выручку, но считаются разными типами расширения.
Почему Upgrade Rate падает?
Обычно причин три: тарифная сетка выстроена неудачно, бесплатная версия слишком хороша и не мотивирует платить, либо нет удачного среднего тарифа, в который логично апгрейдиться.
Считать ли автоматический апгрейд по лимиту?
Это когда клиента переводят на более высокий тариф автоматически при превышении лимита. Формально это расширение (expansion), но как сигнал готовности платить оно слабее, чем осознанный апгрейд.
Чем Upgrade Rate отличается от Expansion?
Апгрейд — это только одно измерение: смена тарифа. Расширение (expansion) шире и включает всё сразу: рост числа мест, дополнительные продукты и увеличение потребления.