Как посчитать Exit Rate в SQL

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

Зачем Exit Rate

Exit Rate = % сессий с page X как last visited page. Используется для funnel optimization. Pages с high exit rate в важных flows — leak points.

Формула

Exit Rate (page) = sessions_ended_on_page / total_sessions_visited_page × 100%

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

WITH page_visits AS (
    SELECT
        session_id,
        page_url,
        event_time,
        ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY event_time DESC) AS rn_from_end
    FROM events
    WHERE event_name = 'page_view'
      AND event_time >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT
    page_url,
    COUNT(*) AS total_visits,
    COUNT(*) FILTER (WHERE rn_from_end = 1) AS exits,
    COUNT(*) FILTER (WHERE rn_from_end = 1)::NUMERIC * 100 / COUNT(*) AS exit_rate_pct
FROM page_visits
GROUP BY page_url
HAVING COUNT(*) >= 50
ORDER BY exits DESC
LIMIT 50;

Exit Rate vs Bounce Rate

Метрика Definition
Bounce Rate % сессий с ровно одним PV (1-page sessions)
Exit Rate % сессий, закончившихся на page X (any session)

Bounce — entry page only. Exit — any page в sequence.

-- Bounce: session has 1 PV total
WITH session_pv_count AS (
    SELECT session_id, COUNT(*) AS pvs
    FROM events
    WHERE event_name = 'page_view'
    GROUP BY session_id
)
SELECT
    COUNT(*) FILTER (WHERE pvs = 1)::NUMERIC * 100 / COUNT(*) AS bounce_rate_pct
FROM session_pv_count;

-- Exit: last page in any session
-- (already shown above)
Закрепи формулу exit rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать exit rate в Telegram

Top exit pages

Pages с unusually high exit rate:

WITH stats AS (
    SELECT
        page_url,
        COUNT(*) AS total_visits,
        COUNT(*) FILTER (WHERE rn_from_end = 1)::NUMERIC * 100 / COUNT(*) AS exit_rate
    FROM (
        SELECT
            page_url,
            ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY event_time DESC) AS rn_from_end
        FROM events
        WHERE event_name = 'page_view'
          AND event_time >= CURRENT_DATE - INTERVAL '30 days'
    ) e
    GROUP BY page_url
    HAVING COUNT(*) >= 100
),
avg_stats AS (
    SELECT AVG(exit_rate) AS avg_exit
    FROM stats
)
SELECT
    s.page_url,
    s.total_visits,
    s.exit_rate,
    a.avg_exit,
    s.exit_rate - a.avg_exit AS diff_from_avg
FROM stats s, avg_stats a
WHERE s.exit_rate > a.avg_exit * 1.5
ORDER BY s.exit_rate DESC;

По step в funnel

WITH funnel_pages AS (
    SELECT
        session_id,
        page_url,
        ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY event_time) AS step,
        ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY event_time DESC) AS rn_from_end
    FROM events
    WHERE event_name = 'page_view'
      AND page_url IN ('/landing', '/signup', '/checkout', '/confirmation')
)
SELECT
    page_url,
    COUNT(*) AS visits,
    COUNT(*) FILTER (WHERE rn_from_end = 1)::NUMERIC * 100 / COUNT(*) AS exit_rate
FROM funnel_pages
GROUP BY page_url
ORDER BY visits DESC;

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

Ошибка 1. Confusing с bounce. Bounce — single-page sessions. Exit — last page (multi-page session).

Ошибка 2. Filter low-volume. Pages с 5 visits, 80% exit — noise. Min sample.

Ошибка 3. Goal pages. «Thank you» / confirmation pages — high exit OK. Achievement = exit.

Ошибка 4. Session timeout как exit. User idled out = exit. But maybe тwitched away, returns. Define.

Ошибка 5. Multiple devices. Started checkout on mobile, completed on desktop — looks like exit, but not.

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

FAQ

Exit vs Bounce?

Bounce — 1-page session. Exit — last page in any session.

High exit OK?

На goal pages (confirmation) — yes. На funnel mid-step — no.

Cross-device exit?

If user_id tracked across devices, look at user journey. Otherwise per-device.

Exit rate всегда 100% где-то?

Каждая session кончается на каком-то page. Sum exits = sum sessions. But % per page varies.

Time-out как exit?

GA defines 30 min inactivity = session end. Standard.