Как посчитать CPA в SQL
'electronics' из таблицы products. Какой запрос верный?Зачем CPA
CPA = Cost Per Acquisition, стоимость привлечения. «Acquisition» — это заранее заданное целевое действие (регистрация, покупка, лид). Система ставок рекламной платформы оптимизируется под target CPA. Классическая метрика эффективности рекламы.
Формула
CPA = total_spend / acquisitions«Acquisition» определяется заранее — регистрация, оплаченная покупка, запись на демо и т.д.
Базовый расчёт
SELECT
DATE_TRUNC('day', DATE) AS day,
SUM(spend) AS spend,
SUM(acquisitions) AS acquisitions,
SUM(spend)::NUMERIC / NULLIF(SUM(acquisitions), 0) AS cpa
FROM ad_performance
WHERE DATE >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;По каналам
SELECT
channel,
campaign_id,
SUM(spend) AS spend,
SUM(acquisitions) AS acquisitions,
SUM(spend)::NUMERIC / NULLIF(SUM(acquisitions), 0) AS cpa,
SUM(clicks)::NUMERIC * 100 / NULLIF(SUM(impressions), 0) AS ctr_pct,
SUM(acquisitions)::NUMERIC * 100 / NULLIF(SUM(clicks), 0) AS conv_rate_pct
FROM ad_performance
WHERE DATE >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY channel, campaign_id
HAVING SUM(acquisitions) >= 10
ORDER BY cpa;CPA vs CAC
| Метрика | Что |
|---|---|
| CPA | Расход / привлечённые в конкретной кампании |
| CAC | Весь маркетинговый бюджет / новые клиенты (шире) |
CPA считают на кампанию. CAC — по всей компании (включая зарплаты маркетинг-команды).
-- CPA per campaign
SELECT campaign_id, SUM(spend) / SUM(acquisitions) AS cpa
FROM ad_performance ...
-- CAC company-wide
WITH spend AS (
SELECT SUM(amount) AS total_marketing_spend
FROM marketing_expenses
WHERE month = '2026-04-01'
),
new_users AS (
SELECT COUNT(*) AS new_customers
FROM users
WHERE first_paid_at BETWEEN '2026-04-01' AND '2026-05-01'
)
SELECT total_marketing_spend / new_customers AS cac
FROM spend, new_users;Стратегия ставок по target CPA
Многие платформы (Google Ads) оптимизируют ставки под target CPA:
-- Target CPA = LTV × Margin / Payback Period
WITH ltv AS (
SELECT 300 AS avg_ltv -- placeholder
),
margin AS (
SELECT 0.4 AS gross_margin -- placeholder
)
SELECT
avg_ltv * gross_margin AS contribution_per_customer,
(avg_ltv * gross_margin) / 3 AS target_cpa_3month_payback
FROM ltv, margin;Частые ошибки
Ошибка 1. Определение acquisition «плывёт». Смысл «acquisition» со временем меняется (был регистрацией, стал оплатой). Отслеживайте это на длинной дистанции.
Ошибка 2. Атрибуция по последнему клику. CPA, посчитанный по последнему клику, искажает картину. Смотрите на multi-touch-атрибуцию.
Ошибка 3. Окно атрибуции (lookback window). Клик был в январе, оплата — в марте. К расходам какого месяца отнести привлечение — января или марта?
Ошибка 4. Путаница CPA и CAC. CPA — про канал, CAC — про компанию в целом. Не смешивайте их в отчётах.
Ошибка 5. View-through-конверсии. Пользователь увидел рекламу, не кликнул, но позже купил. Засчитывать это? Правило зависит от конкретного канала.
Связанные темы
FAQ
CPA vs CAC?
CPA считают на уровне кампании или канала. CAC — по всей компании целиком, включая зарплаты команды и стоимость инструментов.
Какой CPA считается нормальным?
Ориентир простой: CPA должен быть меньше, чем LTV × маржа / срок окупаемости. В SaaS стандарт — окупаемость меньше 12 месяцев.
Какую ставку задавать в target CPA?
Такую, при которой отношение LTV к CPA остаётся приемлемым. Соотношение от 3 — уже хорошо, от 5 — отлично.
Можно ли считать CPA по этапам воронки?
Да, и это полезно. CPL (за лид), CPSU (за регистрацию), CPP (за оплату) считают отдельно — так видно, где именно дорожает воронка.
Что значит «CPA optimized»?
Это значит, что платформа сама подстраивает ставки, чтобы удержать CPA у целевого значения. Меньше ручной работы для маркетолога.