Конверсия: что это, формула и как считать без ошибок
Конверсия — доля тех, кто сделал целевое действие, среди тех, кто мог его сделать. Формула CR, выбор знаменателя, окно конверсии, шаги воронки, сегменты и почему нельзя усреднять конверсии — на примерах с учебной базы.
Содержание статьи
На планёрке маркетинг говорит, что конверсия в оплату — 3%. Продакт отвечает, что 20%. Спорят десять минут, потом выясняется: оба посчитали правильно. Один делил оплаты на визиты, другой — на зарегистрированных пользователей. Конверсия — самая простая формула в продуктовой аналитике и самая частая причина таких споров, потому что в ней три решения, которые никто не записывает: кого делить, на кого и за какой срок.
Коротко
Конверсия — это доля тех, кто совершил целевое действие, среди тех, кто мог его совершить за оговорённый срок. Её считают как отношение числа «сконвертировавшихся» к числу подходящих и записывают в процентах. По-английски — conversion rate, сокращённо CR. Пока не названы действие, знаменатель и окно, число конверсии ничего не значит.
- Формула: CR = число совершивших действие / число тех, кто мог его совершить × 100%.
- Знаменатель решает всё: на учебной базе одна и та же конверсия в оплату — 19,77% от пользователей и 3,18% от визитов.
- Окно конверсии обязательно: за 7 дней после регистрации платят 4,57% пользователей, за всё время — 19,77%.
- Сквозная конверсия воронки равна произведению конверсий шагов.
- Конверсии сегментов нельзя усреднять простым средним — только суммой числителей, делённой на сумму знаменателей.
- На маленьком знаменателе рядом с конверсией нужен доверительный интервал.
Как посчитать конверсию: формула
Формула одна для любого продукта: сколько объектов дошли до целевого действия, делённое на то, сколько объектов могли до него дойти. Объектом бывает пользователь, визит, сессия, заказ, показ рекламы. Важно, чтобы в числителе и знаменателе стоял один и тот же объект: пользователи к пользователям, визиты к визитам.
Возьмём учебную базу SQL-курса: сервис с регистрациями, событиями в продукте и оплатами подписки. Целевое действие — первая оплата. Подходят все, кто зарегистрировался. Из 4613 пользователей первую оплату сделали 912, конверсия в оплату — 19,77%.
Обратите внимание на left join: он оставляет в расчёте и тех, кто не заплатил. Если соединить таблицы обычным join, в знаменателе останутся только плательщики, и конверсия станет 100%.
CR = совершили целевое действие / могли его совершить × 100%Числитель — подмножество знаменателя. Если в числителе может оказаться кто-то, кого нет в знаменателе, формула считает не конверсию.
select
count(*) as users,
count(p.user_id) as payers,
round(100.0 * count(p.user_id) / count(*), 2) as cr_pct
from users as u
left join payments as p
on p.user_id = u.user_id
and p.payment_type = 'first';Конверсия из чего: почему знаменатель меняет ответ
Вернёмся к спору с планёрки. Маркетинг обычно делит на визиты: столько раз люди пришли, столько раз из визита случилась оплата. В учебной базе визит — это день, когда пользователь открыл приложение, событие app_open. Таких визитов 28 693, и 912 первых оплат дают на них 3,18%.
Продукт делит на людей: из каждых ста зарегистрированных двадцать начинают платить. Оба числа честные, но отвечают на разные вопросы. Конверсия визитов показывает, насколько каждое посещение приближает к деньгам. Конверсия пользователей — какая доля аудитории вообще становится платящей.
Третий вариант — ошибка, а не другой взгляд. Если взять в числитель все оплаты, включая продления, получится 1251 оплата и 27,12% от пользователей. Продление не делает человека платящим второй раз, так что число завышено: в числителе события, в знаменателе люди.
| Числитель | Знаменатель | Конверсия | На какой вопрос отвечает |
|---|---|---|---|
| 912 первых оплат | 4613 пользователей | 19,77% | какая доля зарегистрированных начинает платить |
| 912 первых оплат | 28 693 визита | 3,18% | как часто визит заканчивается первой оплатой |
| 1251 оплата всего | 4613 пользователей | 27,12% | ни на какой: смешаны события и люди |
select
(select count(*) from payments where payment_type = 'first') as payers,
(select count(*) from payments) as all_payments,
(select count(*) from users) as users,
(select count(*) from events where event_name = 'app_open') as app_opens;Что такое окно конверсии и почему без него числа не сравнить
Окно конверсии — срок, за который действие ещё засчитывается. «Оплатил в течение 7 дней после регистрации» и «оплатил когда-нибудь» — две разные метрики. В учебной базе первая оплата приходит через 3–20 дней после регистрации, медиана — 11 дней. За 7 дней платят 4,57% пользователей, за 14 — 12,64%, за всё время — 19,77%.
Без окна конверсия зависит от того, сколько времени прошло с регистрации. Данные в базе заканчиваются 30 августа. Пользователи, пришедшие в конце августа, ещё не успели дойти до оплаты, и конверсия «за всё время» у августа — 13,51% против 27,06% у июня. Это не обязательно падение продукта: семь из десяти августовских пользователей зарегистрировались после 10 августа и провели в данных меньше 20 дней.
С фиксированным окном сравнение честнее. 7-дневная конверсия почти не меняется: 5,09%, 4,47%, 4,38%. Но и у неё в августе есть незакрытый хвост — регистрации после 23 августа; без них август даёт 5,13%. Правило простое: окно не короче, чем обычно занимает путь до действия, и в сравнение попадают только те, у кого окно уже целиком прошло. Про такие группы по дате прихода — в материале о когортах.
Учебная база SQL-курса, DuckDB. Данные заканчиваются 30 августа, поэтому у августа окна 14 дней и «за всё время» ещё не закрыты.
select
date_trunc('month', u.signup_date) as signup_month,
count(*) as users,
round(100.0 * count(*) filter (where p.paid_at < u.signup_date + 7) / count(*), 2) as cr_7d,
round(100.0 * count(*) filter (where p.paid_at < u.signup_date + 14) / count(*), 2) as cr_14d,
round(100.0 * count(p.paid_at) / count(*), 2) as cr_ever
from users as u
left join payments as p
on p.user_id = u.user_id
and p.payment_type = 'first'
group by signup_month
order by signup_month;Конверсия шага и сквозная конверсия воронки
Когда путь к цели состоит из нескольких шагов, у каждого шага своя конверсия. В учебной базе после регистрации пользователь создаёт рабочее пространство, а затем первый отчёт. Рабочее пространство создали 2750 из 4613, это 59,61%. Отчёт — 1775 из 2750, это 64,55%.
Сквозная конверсия считается от начала воронки: 1775 из 4613, 38,48%. Она же получается перемножением шагов: 0,5961 × 0,6455 = 0,3848. Это удобно для оценки: если поднять второй шаг на пять пунктов, сквозная вырастет не на пять пунктов, а примерно на три.
Конверсия шага говорит, где теряются люди. Сквозная — сколько их доходит до конца. Спорить, что «конверсия выросла», не уточнив, о какой из них речь, — ещё один способ потратить планёрку.
Каждый шаг считается от предыдущего: 59,61% и 64,55%. Сквозная конверсия — 38,48%.
Конверсия по каналам и устройствам: процент и количество
Общая конверсия почти всегда собрана из сегментов, которые конвертируются по-разному. В учебной базе лучший канал — рекомендации: 26,81%. Хуже всех платный поиск: 8,47%. Разница больше чем в три раза, и общие 19,77% её полностью прячут.
Рядом с процентом держите количество. Органика конвертируется хуже рекомендаций, но приносит 410 платящих против 278, потому что пользователей там больше. Если решать, куда вкладываться, по одной только конверсии, легко выбрать маленький сегмент с красивой долей и потерять большой.
По устройствам разрыв скромнее: на десктопе 21,48%, на мобильных 17,95%. Такое различие уже стоит проверять интервалом, прежде чем объявлять мобильную версию проблемой.
| Канал | Пользователи | Платящие | Конверсия |
|---|---|---|---|
| referral | 1037 | 278 | 26,81% |
| organic | 1747 | 410 | 23,47% |
| partner | 814 | 138 | 16,95% |
| paid_search | 1015 | 86 | 8,47% |
| Все каналы | 4613 | 912 | 19,77% |
Можно ли усреднять конверсии сегментов
Нельзя, если нужна общая конверсия. Среднее четырёх чисел из таблицы выше — 18,93%, а настоящая конверсия — 19,77%. Простое среднее даёт каждому каналу одинаковый вес, хотя в органике 1747 человек, а у партнёров 814. Правильно сложить числители, сложить знаменатели и разделить одно на другое.
Хуже, когда состав сегментов меняется во времени. 14-дневная конверсия упала с 16,03% у июньских регистраций до 13,42% у июльских. Выглядит как ухудшение продукта. Но в июле появился платный поиск: 482 новых пользователя с конверсией 5,6%. Без него июль даёт 198 оплат на 1194 пользователя, 16,58% — выше июня.
Каналы при этом двигались по-разному: органика выросла с 14,85% до 16,58%, партнёры — с 11,03% до 12,65%, рекомендации упали с 22,6% до 19,32%. Это эффект смены состава, а не чистый парадокс Симпсона, при котором все сегменты растут, а общее число падает. Вывод тот же: прежде чем объяснять движение общей конверсии, разложите его на сегменты и их доли.
with by_channel as (
select
u.channel,
count(*) as users,
count(p.user_id) as payers
from users as u
left join payments as p
on p.user_id = u.user_id
and p.payment_type = 'first'
group by u.channel
)
select
round(100.0 * sum(payers) / sum(users), 2) as weighted_cr,
round(avg(100.0 * payers / users), 2) as simple_avg_cr
from by_channel;Что делать с конверсией на маленьком знаменателе
У 55 пользователей учебной базы не указана страна. Из них платят 7, конверсия 12,73%. На дашборде это выглядит как проблемный сегмент: в среднем по базе 19,77%.
Доверительный интервал показывает, насколько число шаткое. Для 7 из 55 95-процентный интервал Уилсона — от 6,3% до 24,0%. В него попадает и общая конверсия, и заметно более высокие значения. Для всей базы, 912 из 4613, интервал — от 18,6% до 20,9%. Одна и та же формула, но во втором случае за числом стоит в 84 раза больше людей.
Практическое правило: если в знаменателе десятки, а не тысячи, показывайте интервал рядом с процентом или хотя бы абсолютные числа. Одна лишняя оплата из 55 сдвигает конверсию почти на два пункта.
Как сравнивают конверсию в A/B-тесте
В A/B-тесте конверсия — самая частая основная метрика, и все предыдущие вопросы там решаются заранее: целевое действие, знаменатель и окно фиксируются до запуска. В учебной базе есть эксперимент onboarding_checklist: у пользователей с чеклистом онбординга конверсия 30,3% (467 из 1541), в контроле — 20,04% (306 из 1527).
Интервалы для вариантов — 28,1–32,6% и 18,1–22,1% — не пересекаются, разница велика для такого объёма. Но проверка значимости не единственная: до вывода смотрят, не разъехались ли группы по размеру, одинаково ли считается конверсия в обеих и не остановили ли тест, увидев красивое число.
select
variant,
count(*) as users,
count(*) filter (where converted) as converted,
round(100.0 * count(*) filter (where converted) / count(*), 2) as cr_pct
from experiment_exposures
where experiment_name = 'onboarding_checklist'
group by variant
order by variant;Почему конверсия в SQL получается нулём
Частая жалоба новичка: запрос конверсии возвращает 0. Причина — целочисленное деление. count(*) возвращает целое число, и в PostgreSQL деление целого на целое отбрасывает дробную часть: select 912 / 4613 возвращает 0. Лечится одним символом: 100.0 * 912 / 4613 даёт 19,77, потому что умножение на дробное число стоит до деления.
В DuckDB, на котором работает песочница курса, оператор / всегда делит дробно, и ловушка не срабатывает. Целочисленное деление там пишется отдельно: 912 // 4613 тоже даёт 0. Запрос, проверенный в песочнице, может вернуть нули на рабочей базе, поэтому привычка писать 100.0 * полезна везде.
Как записать определение конверсии, чтобы о нём не спорили
Все споры выше заканчиваются, если у метрики есть определение из пяти строк. Его пишут один раз, кладут рядом с дашбордом и сверяют с ним каждый новый отчёт.
- Целевое действие: какое событие и с какими условиями. «Первая оплата», а не «оплата».
- Объект: пользователь, визит, заказ. Один и тот же в числителе и знаменателе.
- Кто в знаменателе: все зарегистрированные, только увидевшие экран, только новые.
- Окно: за сколько дней от какой точки действие засчитывается, и кто исключается, пока окно не закрыто.
- Разрезы: по каким сегментам конверсию смотрят всегда, и что в отчёте стоит рядом с процентом — абсолютные числа или интервал.
Что почитать дальше
Все запросы из материала можно выполнить в песочнице SQL-курса: там та же учебная база. Попробуйте посчитать 14-дневную конверсию по каналам и устройствам одновременно и найти сегмент, где интервал шире всего.
Материалы по теме
A/B-тест в SQL: конверсия, проверка сплита и разбор по сегментам
Как посчитать A/B-тест запросом: конверсия по группам, проверка SRM, разница, z и доверительный интервал в SQL и срез по устройствам, после которого меняется решение.

Как посчитать воронку в SQL: шаги, конверсия и drop-off
Пошагово собираем продуктовую воронку в SQL: считаем пользователей на каждом этапе, выбираем знаменатель конверсии и находим место наибольшего отвала.

Conversion rate: как собрать честную воронку
Как считать conversion rate по воронке: выбрать вход, порядок событий и окно конверсии, найти настоящий drop-off и не перепутать пользователей с сессиями.