Как посчитать trial extension rate в SQL
Содержание:
Зачем extension rate
Если в продукте есть фича «продлить trial ещё на 7 дней», важно понимать, кто и зачем ею пользуется. Высокий extension rate = trial не успел убедить юзера (или сложный onboarding). Низкая конверсия extension → paid = extension лечит не ту проблему. Trial extension — один из главных рычагов конверсии в paid.
Формула
extension_rate = users_with_extension / users_who_started_trial
extension_to_paid = users_paid_after_extension / users_with_extensionОбе на одной cohort.
Extension rate в SQL
WITH cohort AS (
SELECT user_id, trial_started_at
FROM trials
WHERE trial_started_at BETWEEN '2026-03-01' AND '2026-03-31'
),
extended AS (
SELECT user_id
FROM trial_extensions
WHERE extension_date <= trial_started_at + INTERVAL '14 days'
)
SELECT
(SELECT COUNT(*) FROM cohort) AS trials_started,
(SELECT COUNT(*) FROM extended) AS extensions_granted,
(SELECT COUNT(*) FROM extended)::NUMERIC * 100
/ NULLIF((SELECT COUNT(*) FROM cohort), 0) AS extension_rate_pct;10-20% — типичная extension rate для SaaS B2C.
Extension → paid конверсия
WITH cohort AS (
SELECT user_id, trial_started_at FROM trials
WHERE trial_started_at BETWEEN '2026-03-01' AND '2026-03-31'
),
extended AS (
SELECT DISTINCT user_id
FROM trial_extensions
WHERE extension_date <= (SELECT trial_started_at FROM cohort WHERE cohort.user_id = trial_extensions.user_id) + INTERVAL '14 days'
),
paid AS (
SELECT DISTINCT user_id FROM subscriptions WHERE status = 'active'
)
SELECT
COUNT(*) FILTER (WHERE e.user_id IS NOT NULL) AS extended,
COUNT(*) FILTER (WHERE e.user_id IS NOT NULL AND p.user_id IS NOT NULL) AS paid_after_extension,
COUNT(*) FILTER (WHERE e.user_id IS NOT NULL AND p.user_id IS NOT NULL)::NUMERIC * 100
/ NULLIF(COUNT(*) FILTER (WHERE e.user_id IS NOT NULL), 0) AS extension_to_paid_pct
FROM cohort c
LEFT JOIN extended e USING (user_id)
LEFT JOIN paid p USING (user_id);Если из extended 30% становятся paid — extension работает. Если 5% — extension прячет проблему конверсии.
По каналу
SELECT
u.utm_source,
COUNT(DISTINCT t.user_id) AS trials_started,
COUNT(DISTINCT te.user_id) AS extensions,
COUNT(DISTINCT te.user_id) * 100.0 / NULLIF(COUNT(DISTINCT t.user_id), 0) AS extension_rate_pct
FROM trials t
JOIN users u USING (user_id)
LEFT JOIN trial_extensions te
ON te.user_id = t.user_id
AND te.extension_date <= t.trial_started_at + INTERVAL '14 days'
WHERE t.trial_started_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY u.utm_source
ORDER BY extension_rate_pct DESC;Канал с самым высоким extension rate — там юзеры дольше принимают решение.
Частые ошибки
Ошибка 1. Считать extension вне cohort window. Если юзер расширил trial спустя 6 месяцев — это другой кейс, не «нужно больше времени».
Ошибка 2. Multiple extensions = double count.
Один юзер может продлевать дважды. Используйте DISTINCT user_id.
Ошибка 3. Считать extension rate без конверсии. Высокая extension rate сама по себе ничего не значит. Конверсия в paid важнее.
Ошибка 4. Не различать manual vs automatic extension. Юзер активно запросил продление vs auto-extension от support — разные сигналы.
Ошибка 5. Включать в cohort юзеров без полного trial. Cancellation в первые 24 часа — не успели потрогать. Фильтруйте.
Связанные темы
- Как посчитать trial conversion в SQL
- Как посчитать free-to-paid в SQL
- Как посчитать onboarding completion в SQL
- Как посчитать time-to-convert в SQL
FAQ
Сколько % extensions «нормально»?
10-20% для B2C SaaS. B2B иногда выше: 25-40%.
Extension лучше free trial?
Часто да: юзер уже знает продукт, просто нужно больше времени.
Auto-grant vs paid extension?
Auto-grant — мягче, конверсия ниже. Paid extension (опция «продли за полцены») — серьёзный сигнал намерения.
Можно ли неограниченные extensions?
Технически да, но это «новый freemium». Лучше fix 1-2 extensions max.
Extension влияет на churn?
Часто увеличивает overall conversion на 5-15%, но decreases urgency. Trade-off.