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

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

Зачем 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';

По checkout-stages

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;

Покажет, где juice утечка.

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

По device / channel

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;

Mobile обычно abandonment +10-15 п.п. к desktop.

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

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

Ошибка 2. Cross-device. Юзер положил на телефоне, купил с ПК. Без unification считается abandonment.

Ошибка 3. Сравнивать с разными определениями stage. «Cart started» в разных продуктах считают по-разному (added 1 item / opened checkout / entered email).

Ошибка 4. Sessions vs users. Считаете уникальных user или sessions? Разные числа.

Ошибка 5. Не учитывать guest checkout. Гости без login не имеют user_id. Trackite по session/device_id.

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

FAQ

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

E-com среднее: 65-75%. Mobile: 75-85%. Travel: 80-90%. <60% — отлично.

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

Это +значительная revenue. Проверьте, что: 1) Изменился ли funnel definition, 2) Reduce friction в checkout сработал.

Window — какой?

В стандартном GA — 24-72 часа. В Mixpanel — sessione. Договоритесь.

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

  1. Reduce checkout steps. 2) Guest checkout. 3) Save cart between sessions. 4) Email reminders ("вы забыли в корзине..."). 5) Trust signals (security badges).

Mobile vs desktop — почему разница?

Маленький экран, fat-finger errors, плохая autofill, otvlechenia. Mobile-first checkout — fix.