Как посчитать Trial Conversion в SQL
LAG(price) OVER (PARTITION BY product_id), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?Содержание:
Зачем Trial Conversion
В SaaS и подписочных моделях главная воронка: trial → paid. Если CR падает на 5 п.п. — катастрофа: пятилетний срок жизни клиента превратился в трёхлетний, unit-экономика просела.
Что такое Trial Conversion
Trial Conversion — доля пользователей, перешедших с бесплатного пробного периода (trial) на платную подписку (paid).
Trial Conversion = paid_users / trial_users × 100%Окно обычно: 30 / 60 / 90 дней с начала trial (зависит от модели).
Базовый расчёт
Данные: subscriptions(user_id, started_at, plan_type, paid_at).
WITH trial_users AS (
SELECT user_id, started_at
FROM subscriptions
WHERE plan_type = 'trial'
AND started_at >= '2026-01-01'
AND started_at < '2026-04-01'
),
converted AS (
SELECT DISTINCT t.user_id
FROM trial_users t
JOIN subscriptions s ON s.user_id = t.user_id
WHERE s.plan_type IN ('basic', 'premium')
AND s.paid_at IS NOT NULL
AND s.started_at > t.started_at
AND s.started_at < t.started_at + INTERVAL '30 days'
)
SELECT
(SELECT COUNT(*) FROM trial_users) AS trials,
(SELECT COUNT(*) FROM converted) AS converted,
(SELECT COUNT(*) FROM converted)::NUMERIC * 100
/ NULLIF((SELECT COUNT(*) FROM trial_users), 0) AS trial_conv_pct;Важно: временное окно для конверсии должно соответствовать модели (30/60/90 дней).
Trial Conversion по когортам
WITH cohort AS (
SELECT
user_id,
DATE_TRUNC('month', started_at) AS cohort_month
FROM subscriptions
WHERE plan_type = 'trial'
AND started_at >= '2026-01-01'
),
converted AS (
SELECT
c.cohort_month,
c.user_id
FROM cohort c
JOIN subscriptions s ON s.user_id = c.user_id
AND s.plan_type IN ('basic', 'premium')
AND s.paid_at IS NOT NULL
AND s.started_at < (SELECT MIN(started_at) FROM subscriptions WHERE user_id = c.user_id AND plan_type = 'trial') + INTERVAL '30 days'
)
SELECT
c.cohort_month,
COUNT(DISTINCT c.user_id) AS trials,
COUNT(DISTINCT cv.user_id) AS converted,
COUNT(DISTINCT cv.user_id)::NUMERIC * 100
/ NULLIF(COUNT(DISTINCT c.user_id), 0) AS conv_pct
FROM cohort c
LEFT JOIN converted cv ON cv.user_id = c.user_id
GROUP BY c.cohort_month
ORDER BY c.cohort_month;По тарифам / сегментам
WITH stats AS (
SELECT
u.acquisition_channel,
COUNT(DISTINCT CASE WHEN s.plan_type = 'trial' THEN s.user_id END) AS trials,
COUNT(DISTINCT CASE WHEN s.plan_type IN ('basic','premium') AND s.paid_at IS NOT NULL THEN s.user_id END) AS paid
FROM users u
JOIN subscriptions s ON s.user_id = u.user_id
WHERE s.started_at >= '2026-01-01'
GROUP BY u.acquisition_channel
)
SELECT
acquisition_channel,
trials,
paid,
paid::NUMERIC * 100 / NULLIF(trials, 0) AS conv_pct
FROM stats
ORDER BY conv_pct DESC;Частые ошибки
Ошибка 1. Не фиксировать окно конверсии. Пользователь заплатил через год после trial — это конверсия? В стандартной логике — нет.
Ошибка 2. Включать тех, у кого не было trial. Если пользователь пришёл сразу на платный тариф, минуя trial, — это не trial conversion, а прямая покупка.
Ошибка 3. Повторный trial. Пользователь брал trial дважды (на разные продукты). Считайте уникальных по паре user_id × продукт.
Ошибка 4. Сравнивать когорты с разной длиной окна. У январской когорты на конверсию есть 4 месяца, у апрельской — только 1. Такое сравнение нечестное. Сравнивайте когорты на одинаковом окне.
Ошибка 5. Конверсия без учёта выручки. 30% конверсии в оплату могут приносить по $10/мес с клиента, а 5% — по $1000/мес с enterprise-клиента. Смотрите на конверсию, взвешенную по выручке.
Ошибка 6. Игнорировать переход на тариф ниже. Пользователь ушёл с premium на basic — это оплата? Да, но это не «полноценная» конверсия.
Связанные темы
- Как посчитать MRR в SQL
- Как посчитать MRR Churn в SQL
- Как посчитать LTV в SQL
- Holdout vs A/B на практике
FAQ
Какая Trial Conversion считается хорошей?
В B2B SaaS хорошим считается 15–25%, в B2C — 5–15%. Точная планка зависит от цены и сложности продукта: чем дороже и сложнее продукт, тем ниже нормальная конверсия.
Free trial или freemium?
Free trial ограничивает доступ по времени, freemium — по набору функций. Конверсия в оплату обычно выше у free trial, потому что на пользователя давит дедлайн.
Какое окно конверсии?
Берите длительность trial плюс 7 дней grace-периода. Например, если trial длится 14 дней, окно конверсии — 21 день.
Trial Conversion упал — что делать?
Разложите падение по возможным причинам: онбординг (пользователи не активируются?), ценность (продукт не показывает пользу?), цена (стало дорого?) и конкуренты (ушли к ним?). Дальше копайте в тот блок, который просел сильнее всего.
Trial → Paid → Churn — это conversion?
Формально да, но это низкокачественная конверсия: человек заплатил и почти сразу отвалился. Смотрите на удержанную конверсию через 90 дней или 12 месяцев — она честнее показывает реальную ценность клиента.