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

Проверь себя · 1/3разбор после ответа
Нужно получить 5 самых дешёвых товаров категории '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 в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать cpa в Telegram

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 у целевого значения. Меньше ручной работы для маркетолога.