Как посчитать Cart Abandonment в SQL

Проверь себя · 1/3разбор после ответа
Поле price_text хранит цены как текст: 2, 10, 100. Аналитик написал WHERE price_text > '10' и получил неожиданный набор строк. Как сделать сравнение числовым?

Зачем Cart Abandonment

В e-com 70% корзин не доходят до оплаты — это норма по индустрии. Аналитик показывает: у вашего магазина 85%. Минус 15 п.п. от среднего = миллионы потерянной выручки. Cart abandonment отвечает: где именно теряется конверсия.

Формула

Cart Abandonment Rate = (Carts Started - Carts Completed) / Carts Started × 100%

Базовый расчёт

Данные: events(user_id, event_type, event_date).

SELECT
    COUNT(DISTINCT CASE WHEN event_type = 'add_to_cart' THEN user_id END) AS carts_started,
    COUNT(DISTINCT CASE WHEN event_type = 'purchase' THEN user_id END) AS completed,
    (COUNT(DISTINCT CASE WHEN event_type = 'add_to_cart' THEN user_id END)
     - COUNT(DISTINCT CASE WHEN event_type = 'purchase' THEN user_id END))::NUMERIC * 100
        / NULLIF(COUNT(DISTINCT CASE WHEN event_type = 'add_to_cart' THEN user_id END), 0)
        AS abandonment_rate_pct
FROM events
WHERE event_date >= CURRENT_DATE - INTERVAL '30 days';

По этапам оформления

SELECT
    event_type AS stage,
    COUNT(DISTINCT user_id) AS users
FROM events
WHERE event_type IN ('add_to_cart', 'checkout_start', 'shipping_info', 'payment_info', 'purchase')
  AND event_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY event_type
ORDER BY CASE event_type
    WHEN 'add_to_cart' THEN 1
    WHEN 'checkout_start' THEN 2
    WHEN 'shipping_info' THEN 3
    WHEN 'payment_info' THEN 4
    WHEN 'purchase' THEN 5
END;

Покажет, где именно происходит утечка.

Закрепи формулу cart abandonment в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать cart abandonment в Telegram

По устройству и каналу

WITH cart_users AS (
    SELECT DISTINCT user_id, 'add_to_cart' AS stage
    FROM events
    WHERE event_type = 'add_to_cart'
      AND event_date >= CURRENT_DATE - INTERVAL '30 days'
),
purchase_users AS (
    SELECT DISTINCT user_id, 'purchase' AS stage
    FROM events
    WHERE event_type = 'purchase'
      AND event_date >= CURRENT_DATE - INTERVAL '30 days'
)
SELECT
    u.device_type,
    COUNT(DISTINCT c.user_id) AS carts,
    COUNT(DISTINCT p.user_id) AS purchases,
    (COUNT(DISTINCT c.user_id) - COUNT(DISTINCT p.user_id))::NUMERIC * 100
        / NULLIF(COUNT(DISTINCT c.user_id), 0) AS abandonment_pct
FROM cart_users c
JOIN users u ON u.user_id = c.user_id
LEFT JOIN purchase_users p ON p.user_id = c.user_id
GROUP BY u.device_type
ORDER BY abandonment_pct DESC;

На мобильных abandonment обычно на 10-15 п.п. выше, чем на десктопе.

Частые ошибки

Ошибка 1. Не учитывать время до покупки. Пользователь положил в корзину, а купил через неделю — это abandonment или нет? Зафиксируйте окно (24 часа, 7 дней).

Ошибка 2. Переходы между устройствами. Пользователь положил товар с телефона, а купил с ПК. Без объединения профилей это засчитается как abandonment.

Ошибка 3. Сравнивать метрики с разными определениями этапа. «Начатую корзину» в разных продуктах считают по-разному: добавили один товар / открыли оформление / ввели email.

Ошибка 4. Сессии или пользователи. Считаете уникальных пользователей или сессии? Числа получатся разными.

Ошибка 5. Не учитывать оформление без регистрации. Гости без входа в аккаунт не имеют user_id — отслеживайте их по session_id или device_id.

Связанные темы

FAQ

Какой Cart Abandonment считается нормой?

В среднем по e-com — 65-75%, на мобильных — 75-85%, в тревеле — 80-90%. Всё, что ниже 60%, — отличный результат.

Cart Abandonment упал на 5 п.п.

Это заметный прирост выручки. Но сначала проверьте, не изменилось ли само определение воронки, и убедитесь, что сработало именно снижение трения в оформлении, а не смена методики подсчёта.

Какое окно брать?

В стандартном GA окно от 24 до 72 часов, в Mixpanel оно привязано к сессии. Главное — заранее договориться о единой методике с командой.

Как уменьшить Cart Abandonment?

Сократите число шагов в оформлении, дайте возможность купить без регистрации, сохраняйте корзину между сессиями, шлите email-напоминания («вы забыли товар в корзине…») и добавьте сигналы доверия — значки безопасной оплаты.

Мобильные и десктоп — почему разница?

На мобильных мешают маленький экран, промахи по кнопкам, плохое автозаполнение форм и постоянные отвлечения. Лечится это оформлением, спроектированным в первую очередь под мобильные устройства.