Что такое воронка
Последовательность шагов в продукте, от первого касания до целевого действия:
visit → product_view → add_to_cart → checkout → paid
Конверсия на каждом шаге = (число дошедших до шага N+1) / (число на шаге N).
Звучит просто, но 90% воронок в дашбордах посчитаны неправильно.
4 правила корректного подсчёта
Правило 1: Считай на уникальных юзеров, не на события
Юзер может 5 раз добавить товар в корзину (передумал, вернулся, добавил снова). В воронке это 1 «add_to_cart юзер», не 5.
❌ Неправильно:
select event_name, count(*) from events group by 1;
-- add_to_cart: 50000
-- checkout: 20000 ← 40% конверсия!
✅ Правильно:
select event_name, count(distinct user_id) from events group by 1;
-- add_to_cart: 10000 unique users
-- checkout: 8000 unique users ← 80% реальная конверсия!
Огромная разница. Особенно когда юзеры повторяют действия (e-com, тревел).
Правило 2: Воронка — это последовательность, а не множество
❌ «Add_to_cart юзеров: 10к, paid юзеров: 8к. Конверсия 80%.»
А если 5к юзеров сначала заплатили, потом что-то добавили в корзину (но не купили)? Это идёт в paid, но не должно идти в "from cart". Эти 5к разрушают логику воронки.
✅ Правильно: считать последовательно, шаг за шагом, с проверкой что юзер прошёл предыдущий шаг до следующего.
with steps as (
select user_id,
min(case when event_name = 'visit' then event_at end) as t_visit,
min(case when event_name = 'product_view' then event_at end) as t_view,
min(case when event_name = 'add_to_cart' then event_at end) as t_cart,
min(case when event_name = 'checkout' then event_at end) as t_checkout,
min(case when event_name = 'paid' then event_at end) as t_paid
from events
group by user_id
)
select
count(*) filter (where t_visit is not null) as step_1_visit,
count(*) filter (where t_view is not null and t_view >= t_visit) as step_2_view,
count(*) filter (where t_cart is not null and t_cart >= t_view) as step_3_cart,
count(*) filter (where t_checkout is not null and t_checkout >= t_cart) as step_4_checkout,
count(*) filter (where t_paid is not null and t_paid >= t_checkout) as step_5_paid
from steps;
Правило 3: Определи окно
Какой период? «Юзер зашёл и в течение 24 часов купил» — это 24-часовая воронка. «В течение сессии» — сессионная.
Длинные окна (например, 30 дней) накручивают конверсию: больше шансов дойти. Короткие — занижают.
Стандарты:
- E-commerce, доставка еды: 24 часа или в течение сессии
- B2B SaaS sign-up → paid: 30 дней
- Тревел (отпуск, авиа): 90 дней (планирование)
Правило 4: «Среднее» по шагам ≠ общая конверсия
❌ «Каждый шаг ~80%, общая воронка тоже 80%».
✅ Если 4 шага по 80%: общая = 0.8 × 0.8 × 0.8 × 0.8 = 41%.
Это геометрическая средняя, не арифметическая. Многие забывают.
Поэтому 5-шаговые воронки даже с приличной конверсией на шаг (70%) дают финальную < 20%. Удалять лишние шаги — самый дешёвый рост конверсии.
Top errors в funnel-аналитике
Ошибка 1: Считать «top of funnel» неправильно
Что такое «visit»? Любой посетитель главной? Только новые? Только из рекламы?
Если в top положить всех включая случайный трафик из поиска — конверсия будет занижена и сравнения с конкурентами будут несправедливыми.
Лучше: разделить воронку по сегментам трафика (organic vs paid vs direct) и считать каждую отдельно.
Ошибка 2: Не учитывать сезонность
«В августе конверсия упала на 5%, что-то сломалось!»
А может это просто отпуска и у всех e-com продавцов то же самое? Сравнивай YoY (год к году), не MoM.
Ошибка 3: Игнорировать промежуточные шаги
«Главное paid» — а зачем тогда воронка? Промежуточные шаги — это диагностика. Если cart → checkout упало с 70% до 50%, а финальный paid не изменился — значит юзеры стали реже бросать корзину но и реже доходить до завершения. Это интересно.
Ошибка 4: Сравнивать абсолютные числа в разных периодах
В январе 10к paid, в феврале 8к. Февраль хуже? Зависит от количества дней (28 vs 31), количества рабочих дней, трафика на входе. Сравнивай процент конверсии, не количество.
Альтернативные модели
Линейная воронка (visit → view → cart → paid) — упрощение реальности. На самом деле:
- Юзер может зайти 3 раза перед покупкой (multi-session funnel)
- Юзер может перейти из cart обратно в view (исследует ещё)
- Юзер может пропустить add_to_cart (купить через прямую ссылку)
Альтернативы:
-
Cohort-based retention вместо воронки — для не-линейных продуктов (соцсети, мессенджеры).
-
Path analysis — все траектории юзеров, не только «правильная». Видно как реально ходят.
-
Time-to-event — сколько прошло от шага A до B. Если медиана 5 минут это нормально, 5 дней — что-то не так.
TL;DR
- Считай unique users, не events
- Шаги должны быть в правильной последовательности по времени
- Зафиксируй окно воронки (24h, сессия, 30 дней)
- Общая конверсия = произведение шагов, не среднее
- Сегментируй по источнику трафика
- Линейная воронка — упрощение; для многих продуктов нужна path analysis