Как посчитать CPM в SQL
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;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 — не всегда хорошо. Дешёвые показы часто оказываются низкого качества: не та аудитория или мусорные площадки.
Связанные темы
- Как посчитать CPC в SQL
- Как посчитать CTR в SQL
- Как посчитать CAC в SQL
- Как посчитать marketing ROI в SQL
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 объявления. Ещё влияет сезонность — в высокий сезон слоты дорожают.