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

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

Зачем Email Open Rate

Subject line — single biggest lever email marketing. Open Rate показывает, насколько subject привлёк. A/B-тестируйте subjects → growth Open Rate → больше потенциальных CTR.

Формула

Open Rate = unique_opens / unique_delivered × 100%

Considerations: bounced emails, spam folders, no-image clients.

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

Данные: email_events(campaign_id, user_id, event_type, event_time).

WITH stats AS (
    SELECT
        campaign_id,
        COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'delivered') AS delivered,
        COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'open') AS opens
    FROM email_events
    WHERE event_time >= CURRENT_DATE - INTERVAL '30 days'
    GROUP BY campaign_id
)
SELECT
    campaign_id,
    delivered,
    opens,
    opens::NUMERIC * 100 / NULLIF(delivered, 0) AS open_rate_pct
FROM stats
ORDER BY open_rate_pct DESC;

По кампаниям

SELECT
    c.campaign_name,
    c.subject_line,
    COUNT(DISTINCT e.user_id) FILTER (WHERE e.event_type = 'delivered') AS delivered,
    COUNT(DISTINCT e.user_id) FILTER (WHERE e.event_type = 'open') AS opens,
    COUNT(DISTINCT e.user_id) FILTER (WHERE e.event_type = 'open')::NUMERIC * 100
        / NULLIF(COUNT(DISTINCT e.user_id) FILTER (WHERE e.event_type = 'delivered'), 0) AS open_rate
FROM email_events e
JOIN campaigns c ON c.campaign_id = e.campaign_id
WHERE e.event_time >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY c.campaign_name, c.subject_line
ORDER BY open_rate DESC;
Закрепи формулу email open rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать email open rate в Telegram

Open Rate vs CTR

SELECT
    campaign_id,
    COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'delivered') AS delivered,
    COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'open') AS opens,
    COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'click') AS clicks,
    COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'open')::NUMERIC * 100
        / NULLIF(COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'delivered'), 0) AS open_rate,
    COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'click')::NUMERIC * 100
        / NULLIF(COUNT(DISTINCT user_id) FILTER (WHERE event_type = 'open'), 0) AS click_to_open_rate
FROM email_events
GROUP BY campaign_id;

CTOR (Click-to-Open Rate) — лучшая метрика контент-quality после subject line.

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

Ошибка 1. Apple Mail Privacy Protection. С 2021 Apple загружает images автоматически → инфляция Open Rate. Нужны workarounds (link clicks).

Ошибка 2. Bot opens. Spam-filters automatically open. Inflate Open Rate.

Ошибка 3. Sent vs Delivered. Sent — попытался отправить. Delivered — успешно дошло. Используйте delivered.

Ошибка 4. Multiple opens. Юзер открыл 5 раз → 5 events. Use COUNT DISTINCT user_id, not COUNT(*).

Ошибка 5. Inactive subscribers. Если 50% subscribers неактивны (не открывают вообще) — overall Open Rate низкий, но active OR может быть высокий.

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

FAQ

Какой Open Rate считается ok?

B2C: 15-25% — норма, 30%+ — отлично. B2B: 20-30%.

С 2021 Open Rate стал unreliable?

Да. Apple MPP инфлирует. Используйте Click-Through Rate как leading indicator.

Subject line — главное?

Да. A/B-тесты subjects дают +10-30% Open Rate.

Best time to send?

Зависит от audience. B2B: Tuesday-Thursday 9-11 am. B2C: weekend / evenings.

CTR vs CTOR?

CTR = clicks / delivered. CTOR = clicks / opens. CTOR — content quality. CTR — overall funnel.