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

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

Зачем Email Click Rate

Email CTR — % recipients, кто кликнул на ссылку в email. Глубже engagement metric чем open rate. Драйвер конверсии в downstream actions.

Формула

CTR = unique_clickers / total_recipients × 100%
CTOR (Click-to-Open Rate) = unique_clickers / unique_openers × 100%

CTR — overall efficiency. CTOR — quality content (учитывая что user открыл).

CTR vs CTOR

Метрика Knows
CTR Спам filters / inbox quality + content
CTOR Only content quality (post-open)

CTOR cleaner для A/B-тестов content.

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

WITH campaign_stats AS (
    SELECT
        campaign_id,
        COUNT(DISTINCT recipient_id) AS recipients,
        COUNT(DISTINCT recipient_id) FILTER (WHERE opened) AS unique_opens,
        COUNT(DISTINCT recipient_id) FILTER (WHERE clicked) AS unique_clicks,
        SUM(CASE WHEN clicked THEN total_clicks ELSE 0 END) AS total_clicks
    FROM email_events
    WHERE sent_at >= CURRENT_DATE - INTERVAL '30 days'
    GROUP BY campaign_id
)
SELECT
    campaign_id,
    recipients,
    unique_opens,
    unique_clicks,
    unique_opens::NUMERIC * 100 / NULLIF(recipients, 0) AS open_rate_pct,
    unique_clicks::NUMERIC * 100 / NULLIF(recipients, 0) AS ctr_pct,
    unique_clicks::NUMERIC * 100 / NULLIF(unique_opens, 0) AS ctor_pct
FROM campaign_stats
ORDER BY ctr_pct DESC;

По сегментам

SELECT
    u.segment,
    COUNT(DISTINCT e.recipient_id) AS sent_to,
    COUNT(DISTINCT e.recipient_id) FILTER (WHERE e.clicked) AS clicked,
    COUNT(DISTINCT e.recipient_id) FILTER (WHERE e.clicked)::NUMERIC * 100
    / NULLIF(COUNT(DISTINCT e.recipient_id), 0) AS ctr_pct
FROM email_events e
JOIN users u ON u.user_id = e.recipient_id
WHERE e.campaign_id = 'newsletter_2026_04'
GROUP BY u.segment
ORDER BY ctr_pct DESC;
Закрепи формулу email click rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать email click rate в Telegram

«Что в письме clicked»:

SELECT
    link_position,
    link_url,
    COUNT(*) AS clicks,
    COUNT(DISTINCT recipient_id) AS unique_clickers
FROM email_clicks
WHERE campaign_id = 'newsletter_2026_04'
GROUP BY link_position, link_url
ORDER BY clicks DESC;

Top-of-email links обычно have higher CTR.

A/B test subject lines

SELECT
    ab_variant,
    COUNT(DISTINCT recipient_id) AS recipients,
    COUNT(DISTINCT recipient_id) FILTER (WHERE opened)::NUMERIC * 100 / COUNT(DISTINCT recipient_id) AS open_rate,
    COUNT(DISTINCT recipient_id) FILTER (WHERE clicked)::NUMERIC * 100 / COUNT(DISTINCT recipient_id) AS ctr,
    COUNT(DISTINCT recipient_id) FILTER (WHERE clicked)::NUMERIC * 100 / NULLIF(COUNT(DISTINCT recipient_id) FILTER (WHERE opened), 0) AS ctor
FROM email_events
WHERE campaign_id = 'newsletter_2026_04'
  AND ab_variant IS NOT NULL
GROUP BY ab_variant;

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

Ошибка 1. Bot clicks. Email scanners (Gmail link prefetch) клики. False positive. Filter user-agent.

Ошибка 2. Unique vs total clicks. Same user clicks 3 times — total 3, unique 1. Pick metric per use.

Ошибка 3. CTR without context. 3% CTR — good или bad? Compare to benchmark.

Ошибка 4. Image-disable. Some clients не download images. Open tracking broken. CTOR искажен.

Ошибка 5. Apple Mail Privacy. iOS 15+ pre-opens. False opens inflate denominator for CTOR.

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

FAQ

Какой CTR / CTOR ok?

CTR: 2-5% — average, 5-10% — strong. CTOR: 10-20% — average, 25%+ — excellent.

CTR vs CTOR — что использовать?

CTOR — controlling для open rate (cleaner). CTR — bottom-line metric.

Bot clicks как filter?

User-agent, time of click (<1 sec after open = bot). Email validation tools.

Apple Mail Privacy fix?

Use CTR over CTOR. Or use clicks directly без opens denominator.

CTR падает — причины?

  1. List fatigue. 2) Poor segmentation. 3) Subject ≠ content. 4) Mobile UX issues.