Что такое воронка

Последовательность шагов в продукте, от первого касания до целевого действия:

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 (купить через прямую ссылку)

Альтернативы:

  1. Cohort-based retention вместо воронки — для не-линейных продуктов (соцсети, мессенджеры).

  2. Path analysis — все траектории юзеров, не только «правильная». Видно как реально ходят.

  3. Time-to-event — сколько прошло от шага A до B. Если медиана 5 минут это нормально, 5 дней — что-то не так.

TL;DR

  • Считай unique users, не events
  • Шаги должны быть в правильной последовательности по времени
  • Зафиксируй окно воронки (24h, сессия, 30 дней)
  • Общая конверсия = произведение шагов, не среднее
  • Сегментируй по источнику трафика
  • Линейная воронка — упрощение; для многих продуктов нужна path analysis