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

Проверь себя · 1/3разбор после ответа
Нужно получить уникальный список идентификаторов пользователей из двух каналов: campaign_a(user_id) и campaign_b(user_id). Как корректнее объединить списки, чтобы убрать дубликаты?

Зачем CPM

CPM = Cost Per Mille = стоимость 1000 показов. Кампании на узнаваемость бренда оптимизируются именно под CPM — в отличие от модели ставок по CPC, где платят за клики.

Формула

CPM = total_spend / total_impressions × 1000

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

SELECT
    DATE_TRUNC('week', DATE) AS week,
    SUM(spend) AS spend,
    SUM(impressions) AS impressions,
    SUM(spend)::NUMERIC * 1000 / NULLIF(SUM(impressions), 0) AS cpm
FROM ad_performance
WHERE DATE >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1;

По каналам

SELECT
    channel,
    placement,
    SUM(spend) AS spend,
    SUM(impressions) AS impressions,
    SUM(spend)::NUMERIC * 1000 / NULLIF(SUM(impressions), 0) AS cpm,
    SUM(clicks) AS clicks,
    SUM(clicks)::NUMERIC * 100 / NULLIF(SUM(impressions), 0) AS ctr_pct
FROM ad_performance
WHERE DATE >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY channel, placement
ORDER BY cpm;
Закрепи формулу cpm в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать cpm в Telegram

eCPM

«Effective CPM» — используется, когда кампания оплачивается по CPC, но измеряется в CPM:

SELECT
    campaign_id,
    SUM(spend) AS spend,
    SUM(impressions) AS impressions,
    SUM(clicks) AS clicks,
    -- Actual CPC paid
    SUM(spend)::NUMERIC / NULLIF(SUM(clicks), 0) AS cpc,
    -- eCPM derived
    SUM(spend)::NUMERIC * 1000 / NULLIF(SUM(impressions), 0) AS ecpm
FROM ad_performance
WHERE DATE >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY campaign_id
ORDER BY ecpm DESC;

eCPM сравнивает CPM- и CPC-кампании на одной шкале.

Тренд

SELECT
    DATE_TRUNC('week', DATE) AS week,
    SUM(spend)::NUMERIC * 1000 / NULLIF(SUM(impressions), 0) AS cpm,
    AVG(SUM(spend)::NUMERIC * 1000 / NULLIF(SUM(impressions), 0)) OVER (
        ORDER BY DATE_TRUNC('week', DATE) ROWS BETWEEN 3 PRECEDING AND CURRENT ROW
    ) AS cpm_ma4w
FROM ad_performance
WHERE DATE >= CURRENT_DATE - INTERVAL '6 months'
GROUP BY 1
ORDER BY 1;

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

Ошибка 1. Определение показа. «Viewable impression» (реально просмотренный) и «served impression» (просто доставленный) — это разные счётчики. По стандарту MRC показ считается видимым, если хотя бы 50% креатива было на экране минимум 1 секунду.

Ошибка 2. Частота показов. Высокий CPM бесполезен, если один и тот же человек увидел объявление 50 раз — бюджет слит впустую. Отслеживайте охват (reach) и частоту (frequency) вместе.

Ошибка 3. Ботовый трафик. Часть показов — невалидный трафик от ботов (IVT, Invalid Traffic). Фильтры очистки у разных платформ работают по-разному, поэтому цифры показов расходятся.

Ошибка 4. Путаница с множителем ×1000. Множитель ×1000 стоит прямо в формуле, и его легко забыть. Забудете — получите не CPM, а стоимость одного показа: число выйдет в тысячу раз меньше реального.

Ошибка 5. Бренд против performance. Низкий CPM — не всегда хорошо. Дешёвые показы часто оказываются низкого качества: не та аудитория или мусорные площадки.

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

FAQ

Какой CPM считается нормальным?

Всё зависит от формата и площадки. Грубые ориентиры за тысячу показов: медийные баннеры (display) — $1–10, премиум-видео — $20–50, CTV/OTT — $15–40, LinkedIn — $20–60. Это широкие вилки: реальные цифры сильно зависят от гео и аудитории.

Чем отличаются CPM, CPC и CPA?

CPM — это оплата за тысячу показов, CPC — за клик, CPA — за целевое действие (покупку или регистрацию). Чем ближе модель к CPA, тем больше риска берёт на себя площадка. При CPM весь риск на рекламодателе: он платит за показы независимо от результата.

Зачем нужен eCPM?

eCPM приводит кампании с разными моделями оплаты к одной шкале. Если одна кампания покупается по CPC, а другая по CPM, напрямую их не сравнить — eCPM пересчитывает всё в стоимость тысячи показов, и цифры становятся сопоставимыми.

Чем отличается CPM в бренд- и performance-кампаниях?

В бренд-кампаниях CPM обычно выше — там платят за премиальные площадки и качественную аудиторию. В performance-кампаниях гонятся за минимальным CPM: важна не среда, а цена показа и итоговая конверсия.

CPM растёт — почему?

Чаще всего дело в конкуренции на аукционе: за те же показы борется больше рекламодателей, и ставки растут. Снизить CPM помогает более высокий quality score объявления. Ещё влияет сезонность — в высокий сезон слоты дорожают.