Воронка продукта: построение, анализ drop-off и SQL-запросы — new-lvl.pro
new-lvl.pro · Статьи · Метрики
Статья // 14 мин чтения

Воронка продукта:
построение, анализ
и оптимизация

Как строить продуктовую воронку, считать конверсию между этапами, находить узкие места через SQL и объяснять drop-off на собеседовании в BigTech.

Что такое продуктовая воронка

Воронка — это последовательность шагов, которые пользователь проходит на пути к целевому действию. Регистрация → активация → первая покупка. Или: каталог → карточка товара → корзина → оплата → подтверждение заказа.

Почему «воронка»? Потому что на каждом шаге часть пользователей отваливается. Из 10 000 посетителей 3 000 кликнут на товар, 800 добавят в корзину, 400 дойдут до оплаты, 300 оплатят. Визуально это выглядит как сужающаяся воронка — отсюда и название.

Задача аналитика — найти, где отваливается больше всего пользователей, понять почему, и предложить изменения, которые увеличат конверсию.

Пример: воронка интернет-магазина

Посещение каталога
10 000
100%
−7 000 ушли с каталога
−70%
Карточка товара
3 000
30%
−2 200 не добавили в корзину
−73%
Корзина
800
8%
−400 бросили корзину
−50%
Начало оплаты
400
4%
−100 не завершили оплату
−25%
Заказ оформлен
300
3%
// Как читать
Общая конверсия: 3% (300 из 10 000). Но самый большой drop-off — между каталогом и карточкой товара (70% уходят). Именно сюда стоит направить усилия по оптимизации — это даст наибольший эффект.

Два типа конверсии: total и step-to-step

Total conversion
Общая конверсия
Доля пользователей, которые прошли от самого начала до конкретного шага. «300 из 10 000 завершили заказ» = 3%.
total_CR = users_at_step_N / users_at_step_1
Step-to-step conversion
Пошаговая конверсия
Доля пользователей, которые перешли с одного шага на следующий. «800 из 3 000 добавили в корзину» = 26.7%.
step_CR = users_at_step_N / users_at_step_N-1

На собеседовании важно различать эти два типа. Когда вас спрашивают «какая конверсия из корзины в оплату?» — это step-to-step (400/800 = 50%). А «какая конверсия checkout?» — чаще имеют в виду total (400/10000 = 4%).

Как правильно строить воронку

Не любая последовательность шагов — это воронка. Чтобы анализ имел смысл, нужно соблюсти несколько принципов.

Принцип 1: Определите целевое действие

Стройте воронку от конца к началу. Сначала определите, что является конверсией (оплата? регистрация? первое сообщение?), а потом разбейте путь к ней на этапы. Не наоборот.

Принцип 2: Шаги должны быть последовательными

Каждый пользователь, попавший на шаг N, должен был пройти шаг N-1. Если пользователь может перескочить этап (например, сразу попасть на страницу оплаты по прямой ссылке) — воронка будет некорректной. Либо учтите это в логике, либо исключите таких пользователей.

Принцип 3: Определите временное окно

Воронка всегда строится в пределах одного временного окна. Обычно это одна сессия или N дней с момента первого шага. Если пользователь зашёл в каталог в понедельник, а оплатил в пятницу — это одна воронка или две? Без чёткого окна ответ размывается.

// Типичная ошибка
Строить воронку без временного окна — «за всё время». Такая воронка покажет завышенную конверсию, потому что смешает пользователей на разных стадиях жизненного цикла. Всегда ограничивайте период.

Принцип 4: Один пользователь — один проход

Если пользователь прошёл воронку 3 раза (3 заказа за месяц), как считать? Два основных подхода: по уникальным пользователям (человек считается один раз на этапе) или по сессиям/событиям (каждый проход считается отдельно). Для продуктовых задач обычно считают по уникальным пользователям.

SQL-запросы для построения воронки

На собеседовании вас попросят построить воронку в SQL. Ниже — два основных подхода.

Запрос 1: Простая воронка по событиям

Предполагаем таблицу events с полями user_id, event_name, event_date. Строим воронку регистрация → активация → первая покупка за последние 30 дней.

Простая воронка по уникальным пользователям PostgreSQL
WITH funnel AS (
  SELECT COUNT(DISTINCT CASE WHEN event_name = 'registration' THEN user_id END) AS step_1_registration,

    COUNT(DISTINCT CASE WHEN event_name = 'activation' THEN user_id END) AS step_2_activation,

    COUNT(DISTINCT CASE WHEN event_name = 'first_purchase' THEN user_id END) AS step_3_purchase

  FROM events
  WHERE event_date >= CURRENT_DATE - 30
)
SELECT
  step_1_registration,
  step_2_activation,
  step_3_purchase,
  ROUND(100.0 * step_2_activation
    / step_1_registration, 1) AS cr_1_to_2,
  ROUND(100.0 * step_3_purchase
    / step_2_activation, 1) AS cr_2_to_3,
  ROUND(100.0 * step_3_purchase
    / step_1_registration, 1) AS cr_total
FROM funnel;
// Нюанс
Этот запрос не проверяет порядок шагов — он просто считает уникальных пользователей с каждым событием. Для простых воронок этого достаточно. Для строгой последовательности — нужен следующий подход.

Запрос 2: Воронка со строгим порядком шагов

Когда нужно, чтобы каждый пользователь проходил шаги именно в правильной последовательности — строим цепочку через LEFT JOIN.

Строгая последовательная воронка PostgreSQL
WITH
s1 AS (
  SELECT DISTINCT user_id,
    MIN(event_date) AS step1_date
  FROM events
  WHERE event_name = 'page_view_catalog' GROUP BY user_id
),
s2 AS (
  SELECT DISTINCT user_id,
    MIN(event_date) AS step2_date
  FROM events
  WHERE event_name = 'add_to_cart' GROUP BY user_id
),
s3 AS (
  SELECT DISTINCT user_id,
    MIN(event_date) AS step3_date
  FROM events
  WHERE event_name = 'purchase' GROUP BY user_id
)
SELECT COUNT(s1.user_id)          AS step_1_catalog,
  COUNT(s2.user_id)          AS step_2_cart,
  COUNT(s3.user_id)          AS step_3_purchase,
  ROUND(100.0 * COUNT(s2.user_id)
    / COUNT(s1.user_id), 1)  AS cr_1_to_2,
  ROUND(100.0 * COUNT(s3.user_id)
    / NULLIF(COUNT(s2.user_id), 0), 1) AS cr_2_to_3
FROM s1
LEFT JOIN s2
  ON s1.user_id = s2.user_id
  AND s2.step2_date >= s1.step1_date  -- строгий порядок LEFT JOIN s3
  ON s2.user_id = s3.user_id
  AND s3.step3_date >= s2.step2_date; -- строгий порядок

Ключ — условие step_date >= previous_step_date в JOIN. Это гарантирует, что пользователь прошёл шаги в правильном порядке. NULLIF защищает от деления на ноль, если на каком-то шаге ноль пользователей.

Запрос 3: Воронка с разбивкой по сегментам

На собеседовании часто просят не просто построить воронку, а разбить её по сегментам — например, по платформе (iOS / Android / Web). Это помогает локализовать проблему.

Воронка по платформам PostgreSQL
SELECT
  e.platform,
  COUNT(DISTINCT CASE WHEN e.event_name = 'page_view' THEN e.user_id END) AS views,
  COUNT(DISTINCT CASE WHEN e.event_name = 'add_to_cart' THEN e.user_id END) AS cart,
  COUNT(DISTINCT CASE WHEN e.event_name = 'purchase' THEN e.user_id END) AS purchases,
  ROUND(100.0
    * COUNT(DISTINCT CASE WHEN e.event_name = 'purchase' THEN e.user_id END)
    / NULLIF(COUNT(DISTINCT CASE WHEN e.event_name = 'page_view' THEN e.user_id END), 0)
  , 1) AS total_cr
FROM events e
WHERE e.event_date >= CURRENT_DATE - 30 GROUP BY e.platform
ORDER BY total_cr DESC;

Анализ drop-off: где теряются пользователи

Drop-off (или отвал) — это процент пользователей, которые не перешли с одного шага на следующий. Если из 800 пользователей в корзине только 400 начали оплату — drop-off на этом шаге 50%.

Задача аналитика — не просто зафиксировать drop-off, а объяснить, почему он такой и что с ним делать.

Фреймворк анализа drop-off

Алгоритм: что делать с большим drop-off
1
Локализуйте: на каком именно шаге самый большой drop-off? Это ваш приоритет — оптимизация здесь даст максимальный эффект
2
Сегментируйте: разбейте по платформе, гео, типу пользователя (новый/вернувшийся), источнику трафика. Одинаковый ли drop-off во всех сегментах?
3
Посмотрите динамику: drop-off всегда был таким или изменился недавно? Если изменился — ищите событие (релиз, баг, сезонность)
4
Выдвиньте гипотезы: технические (страница грузится долго, баг) → UX (непонятная кнопка, слишком много полей) → бизнесовые (цена, доставка, доверие)
5
Предложите проверку: что можно быстро протестировать? A/B тест? Изменение UI? Упрощение формы?

Типичные причины drop-off по шагам

Переход Типичные причины drop-off Что проверить
Каталог → Карточка товара Нерелевантная выдача, плохие превью, медленная загрузка, слишком много товаров без фильтрации Качество поиска, CTR карточек, скорость страницы
Карточка → Корзина Цена, нет нужного размера/цвета, мало информации, нет отзывов, неудобная кнопка «В корзину» Разбивку по категориям: может, drop-off только в одной
Корзина → Оплата Неожиданная стоимость доставки, нужна регистрация, нет удобного способа оплаты, сложная форма Долю брошенных корзин по сегментам, heatmap экрана
Оплата → Подтверждение Ошибка платёжной системы, таймаут, страх (безопасность), редирект на сторонний сайт банка Логи ошибок, долю по методам оплаты, конверсию по банкам
// Правило 80/20
Не пытайтесь оптимизировать все шаги сразу. Найдите один шаг с самым большим абсолютным drop-off и сфокусируйтесь на нём. Улучшение конверсии на 5% на первом шаге воронки даст больше, чем улучшение на 20% на последнем — потому что через первый шаг проходит больше пользователей.

5 типичных ошибок при построении воронки

Ошибка 1 Частая на собесе
Не учитывать порядок событий. Пользователь мог сначала увидеть «purchase», потом «page_view» — если в логах они пришли в таком порядке. Без проверки timestamp воронка будет врать. Всегда сортируйте по времени.
Ошибка 2 Искажает данные
Забыть про DISTINCT. Если пользователь открыл каталог 10 раз — он должен засчитаться один раз, а не десять. Без DISTINCT конверсия первого шага будет завышена, а последующих — занижена.
Ошибка 3 Методологическая
Смешивать когорты. Если вы строите воронку «за последние 30 дней», то пользователь, зарегистрировавшийся 29 дней назад, и зарегистрировавшийся вчера — в одной воронке. У второго просто не было времени дойти до покупки. Либо фильтруйте по дате входа в воронку, либо ограничивайте время прохождения.
Ошибка 4 Аналитическая
Оптимизировать последний шаг. Вы потратили ресурс на улучшение экрана оплаты (400 → 350 пользователей), но до него доходит только 4% от входа. Улучшение конверсии каталога с 30% до 35% дало бы +500 пользователей на карточке → +130 в корзину → +65 к оплате. Всегда считайте абсолютные числа.
Ошибка 5 Коммуникационная
Показывать только конверсию, без абсолютных чисел. «Конверсия 50%» звучит хорошо. Но если это 2 из 4 пользователей — это шум, а не метрика. Всегда показывайте и процент, и абсолютные значения. Бизнес принимает решения на основе абсолютных чисел.

Как оптимизировать воронку

Оптимизация воронки — это не одно большое действие, а система мелких экспериментов. Вот подход, который работает в BigTech-компаниях:

Шаг 1: Найдите главное узкое место

Постройте воронку, посчитайте абсолютный drop-off на каждом шаге (не процентный, а в людях). Шаг, где отваливается больше всего пользователей в абсолютных числах — ваш приоритет.

Шаг 2: Поймите причину через данные

Не угадывайте — разбивайте. Сравните конверсию по платформам, по гео, по новым и вернувшимся, по источнику трафика. Посмотрите, на каких устройствах или в каких регионах проблема острее. Часто drop-off локализован: не «все плохо», а «на Android в Firefox конверсия в 3 раза ниже».

Шаг 3: Сформулируйте гипотезу и протестируйте

Гипотеза должна быть конкретной: «Если мы уберём обязательную регистрацию на шаге корзина → оплата, drop-off на этом шаге снизится с 50% до 35%». Проверяем через A/B тест. Измеряем не только конверсию этого шага, но и общую конверсию воронки — иногда улучшение одного шага ухудшает следующий.

// Guardrail-метрики
При оптимизации воронки всегда отслеживайте guardrail-метрики. Пример: убрали обязательную регистрацию → конверсия выросла, но качество пользователей упало (меньше repeat purchases). Без guardrail-метрики вы бы приняли ошибочное решение.

Бенчмарки конверсий

Воронка Типичная конверсия Хороший результат
E-commerce (visit → purchase) 1–3% 4–6%
SaaS (visit → signup) 2–5% 7–12%
SaaS (signup → paid) 5–15% 20–30%
Mobile app (install → Day-1 open) 40–60% 70–80%
Маркетплейс (поиск → покупка) 2–5% 6–10%

Вопросы про воронки на собесе в BigTech

🎤 Типичные вопросы
  • Постройте воронку регистрации для мобильного приложения. Какие шаги включите и почему?
  • Конверсия из корзины в оплату упала с 60% до 45%. Как будете разбираться? С чего начнёте?
  • Напишите SQL-запрос, который строит воронку по событиям page_view → add_to_cart → purchase.
  • Маркетплейс: конверсия из поиска в покупку — 3%. Это много или мало? Как улучшить?
  • В чём разница между total conversion и step-to-step conversion? Когда какую метрику использовать?
  • Вы улучшили один шаг воронки, но общая конверсия не изменилась. Почему это возможно?
  • Как построить воронку, если пользователь может вернуться и пройти её несколько раз?
  • Мы упростили форму регистрации: убрали 3 поля. Как проверить, что это помогло?

Связанные материалы

Главное про воронки

Воронка — один из главных инструментов продуктового аналитика. Она показывает, где продукт теряет пользователей, и помогает приоритизировать работу команды. Хорошая воронка — не просто «сколько дошло до конца», а инструмент для принятия решений.

На собеседовании от вас ждут три вещи: умение построить воронку в SQL, способность объяснить drop-off (не «упало», а «упало потому что, и вот как проверить»), и понимание того, как связать воронку с A/B тестами и бизнес-метриками.

Следующий шаг: возьмите любой e-commerce датасет (Olist на Kaggle), постройте воронку в SQL, найдите шаг с максимальным drop-off и напишите 3 гипотезы, почему он такой. Это упражнение — ровно то, что спросят на собесе.

АТ
Андрей Тарасенко
// Продуктовый аналитик · Авито · Ментор

В Авито воронки — один из основных инструментов анализа. Каждую неделю смотрю, где отваливаются продавцы и покупатели. Пишу о том, что реально используется в работе.

Написать в Telegram
Made on
Tilda