Как посчитать email deliverability в SQL

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

Зачем deliverability

Можно отправить 100k писем, accepted 95k, но в inbox попало только 60k — остальное в spam. Deliverability = «дошло до inbox». Влияет на open/click rates, reputation, бизнес-результаты. Низкая deliverability часто не видна в дашбордах ESP — нужны seed-tests или Google Postmaster.

Delivered vs accepted

  • Accepted: mailbox-провайдер принял письмо (после SPF/DKIM/DMARC checks).
  • Delivered: попало в inbox (не spam, не promo).

В SQL обычно есть только accepted. Inbox placement — через сторонние сервисы (Inbox Monster, Litmus).

Deliverability в SQL

WITH email_stats AS (
    SELECT
        DATE_TRUNC('day', sent_at)::DATE AS day,
        COUNT(*) AS sent,
        COUNT(*) FILTER (WHERE status = 'accepted') AS accepted,
        COUNT(*) FILTER (WHERE status IN ('bounced', 'rejected')) AS bounced_rejected
    FROM email_events
    WHERE sent_at >= CURRENT_DATE - INTERVAL '30 days'
    GROUP BY DATE_TRUNC('day', sent_at)
)
SELECT
    day,
    sent,
    accepted,
    bounced_rejected,
    accepted::NUMERIC * 100 / NULLIF(sent, 0) AS accepted_rate_pct
FROM email_stats
ORDER BY day;

Acceptance rate > 98% — здоровая reputation. < 95% — investigate.

По mailbox provider

Gmail, Yahoo, Outlook имеют разные правила:

SELECT
    LOWER(SPLIT_PART(recipient_email, '@', 2)) AS mailbox_domain,
    COUNT(*) AS sent,
    COUNT(*) FILTER (WHERE status = 'accepted') AS accepted,
    COUNT(*) FILTER (WHERE status = 'accepted')::NUMERIC * 100
    / NULLIF(COUNT(*), 0) AS accept_pct
FROM email_events
WHERE sent_at >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY LOWER(SPLIT_PART(recipient_email, '@', 2))
HAVING COUNT(*) > 100
ORDER BY accept_pct ASC
LIMIT 20;

Gmail acceptance < 90% = sender reputation issue.

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

Inbox placement

SELECT
    DATE_TRUNC('week', test_date)::DATE AS week,
    AVG(inbox_rate) AS avg_inbox_pct,
    AVG(spam_rate) AS avg_spam_pct
FROM seed_test_results
WHERE test_date >= CURRENT_DATE - INTERVAL '12 weeks'
GROUP BY DATE_TRUNC('week', test_date)
ORDER BY week;

Seed tests — рассылка на test addresses, проверка где упало. Без них inbox placement в чистом SQL не достать.

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

Ошибка 1. Считать delivered = accepted. Accepted ≠ inbox. Может быть spam folder.

Ошибка 2. Считать на all sends. Marketing рассылки и transactional имеют разную deliverability. Сегментируйте.

Ошибка 3. Игнорировать SPF/DKIM/DMARC. Без правильной настройки 30-50% писем не дойдут.

Ошибка 4. Не сегментировать по domain. Gmail acceptance может быть 99%, Yahoo 70%. Investigate по domain.

Ошибка 5. Sending volume bursts. Резко выше usual sending = ESP начинает throttle. Гладкий ramping важен.

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

FAQ

Acceptance vs inbox?

Acceptance — ESP принял. Inbox — попало в inbox-folder, не spam.

Какой rate нормальный?

Acceptance: 98%+. Inbox placement: 90%+ для marketing, 99% для transactional.

Как улучшить?

SPF/DKIM/DMARC, gradual warmup, list hygiene, content quality.

Что такое seed test?

Рассылка на test-mailboxes в разных провайдерах — где упало (inbox/spam/promo).

Стоит ли переходить на dedicated IP?

При > 200k sends/mo — yes. Меньше — shared IP.