Как посчитать Trial Conversion в SQL

Проверь себя · 1/3разбор после ответа
Вы пишете 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;
Закрепи формулу trial conversion в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать trial conversion в Telegram

По тарифам / сегментам

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 — это оплата? Да, но это не «полноценная» конверсия.

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

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 месяцев — она честнее показывает реальную ценность клиента.