Настройка связки рекламных расходов с CRM Битрикс24
Рекламные расходы живут в Яндекс.Директе, Google Ads, ВКонтакте, myTarget — в отдельных кабинетах с отдельными метриками. Выручка — в CRM Битрикс24. Без связки невозможно посчитать реальный ROI по каналам: сколько потратили на Директ и сколько из этого закрылось в деньги. Настройка этой связки — задача на стыке рекламных API и CRM.
Принцип атрибуции
Связь «реклама → лид → сделка → деньги» строится на UTM-метках. Каждое объявление помечается UTM-параметрами, которые попадают в Битрикс24 при создании лида. После закрытия сделки — выручка по этой сделке атрибутируется к кампании.
utm_source=yandex&utm_medium=cpc&utm_campaign=brand&utm_term=купить
→ Лид (UF_CRM_UTM_*) → Сделка → Сумма
+ Расходы по кампании из Яндекс Директ API
= ROI
Структура пользовательских полей
В сделках Битрикс24 нужны поля для хранения UTM-данных:
| Поле | Код | Тип |
|---|---|---|
| Источник | UF_CRM_UTM_SOURCE | string |
| Кампания | UF_CRM_UTM_CAMPAIGN | string |
| ID кампании | UF_CRM_CAMPAIGN_ID | string |
| Канал | UF_CRM_UTM_MEDIUM | string |
| Ключевое слово | UF_CRM_UTM_TERM | string |
| Объявление (ID) | UF_CRM_AD_ID | string |
Поля создаются через crm.userfield.add или в интерфейсе Битрикс24.
При создании лида из любого рекламного канала (Директ, VK, FB) — UTM-метки сохраняются в эти поля. При конвертации лида в сделку — поля копируются (настройка через «Источники» в Б24 или через REST).
Импорт расходов из рекламных систем
Ежедневный cron импортирует расходы за предыдущий день из каждой рекламной системы в агрегационную таблицу:
// Яндекс.Директ: расходы по кампаниям за день
public function importDirectCosts(string $date): void
{
$report = $this->directApi->getReport([
'ReportType' => 'CAMPAIGN_PERFORMANCE_REPORT',
'DateRangeType' => 'CUSTOM_DATE',
'DateFrom' => $date,
'DateTo' => $date,
'FieldNames' => ['CampaignId', 'CampaignName', 'Cost', 'Clicks', 'Impressions'],
]);
foreach ($report as $row) {
AdCostTable::add([
'DATE' => $date,
'SOURCE' => 'yandex',
'CAMPAIGN_ID' => $row['CampaignId'],
'CAMPAIGN' => $row['CampaignName'],
'COST' => $row['Cost'] / 1000000, // Директ отдаёт в микрорублях
'CLICKS' => $row['Clicks'],
]);
}
}
Аналогично для VK Ads (ads.getStatistics) и Google Ads (Google Ads API, CampaignService).
Отчёт ROI в Битрикс24
Итоговый отчёт строится запросом, объединяющим расходы и выручку:
SELECT
d.UF_CRM_UTM_SOURCE as source,
d.UF_CRM_CAMPAIGN_ID as campaign_id,
SUM(ac.COST) as ad_spend,
COUNT(DISTINCT d.ID) as deals_count,
SUM(d.OPPORTUNITY) as revenue,
ROUND((SUM(d.OPPORTUNITY) - SUM(ac.COST)) / NULLIF(SUM(ac.COST), 0) * 100, 1) as roi_pct
FROM b_crm_deal d
LEFT JOIN local_ad_costs ac
ON ac.CAMPAIGN_ID = d.UF_CRM_CAMPAIGN_ID
AND ac.SOURCE = d.UF_CRM_UTM_SOURCE
AND DATE(ac.DATE) = DATE(d.DATE_CREATE)
WHERE d.STAGE_ID = 'WON'
AND d.DATE_CLOSE BETWEEN :date_from AND :date_to
GROUP BY d.UF_CRM_UTM_SOURCE, d.UF_CRM_CAMPAIGN_ID
ORDER BY roi_pct DESC
Отчёт отображается в административном разделе Битрикс24 или в интегрированном BI-инструменте (Yandex DataLens, Google Looker Studio).
Передача расходов обратно в Яндекс.Метрику
Для отображения ROI прямо в Метрике — загрузка расходов через counter.uploadOfflineConversions (устаревший) или через Data2 API. При наличии сквозной аналитики через Метрику — подключение через «Импорт данных о расходах» из файла CSV, который генерирует Битрикс.
Состав работ
- Создание пользовательских полей в сделках Б24
- Настройка передачи UTM при создании лида (все каналы)
- Разработка импортёров расходов: Директ, VK Ads, FB/Instagram
- Агрегационная таблица
local_ad_costs - Отчёт ROI по кампаниям с фильтрами по периоду и каналу
- Настройка cron-расписания импорта
Сроки: 1–2 недели для базовой связки (Директ + один канал). 3–4 недели для мультиканального ROI-отчёта с BI-дашбордом.







