Настройка ROI-аналитики по рекламным каналам Битрикс24
Встроенная аналитика Битрикс24 CRM показывает воронку сделок и источники лидов, но не показывает, сколько денег потрачено на каждый канал относительно выручки. ROI-аналитика — это вычисляемый показатель, который требует данных из двух источников: расходы из рекламных систем и доходы из CRM. Настройка полной картины включает сбор данных, маппинг атрибуции и визуализацию.
Модели атрибуции
Прежде чем настраивать отчёты — нужно определиться с моделью атрибуции: какому касанию приписывается конверсия.
First-click — первый канал, через который пользователь пришёл на сайт. Хорошо показывает, что привлекает новую аудиторию.
Last-click — последний канал перед конверсией. Стандарт GA4, Метрики. Переоценивает ретаргетинг и брендовые запросы.
Linear — равномерное распределение между всеми касаниями. Требует хранения цепочки касаний.
Для большинства B2B-компаний с длинным циклом сделки (месяц и более) оптимальна first-click + last-click — два отчёта одновременно. Для e-commerce — last-click достаточно.
Хранение цепочки касаний
Для мультитач-атрибуции нужна таблица событий посещений, связанных с лидом/сделкой:
class TouchpointTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'local_crm_touchpoints'; }
public static function getMap(): array
{
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\StringField('SESSION_ID'),
new \Bitrix\Main\ORM\Fields\IntegerField('LEAD_ID'),
new \Bitrix\Main\ORM\Fields\IntegerField('DEAL_ID'),
new \Bitrix\Main\ORM\Fields\StringField('UTM_SOURCE'),
new \Bitrix\Main\ORM\Fields\StringField('UTM_CAMPAIGN'),
new \Bitrix\Main\ORM\Fields\StringField('UTM_MEDIUM'),
new \Bitrix\Main\ORM\Fields\StringField('UTM_TERM'),
new \Bitrix\Main\ORM\Fields\IntegerField('TOUCH_ORDER'), // 1=first, N=last
new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'),
];
}
}
Данные о касаниях собираются через JavaScript-код на сайте: при каждом визите с UTM-параметрами — запись в cookie/localStorage, при отправке формы — передача всей цепочки на сервер.
Вычисление ROI
class RoiReportBuilder
{
public function buildReport(string $dateFrom, string $dateTo, string $attributionModel = 'last'): array
{
$deals = $this->getWonDeals($dateFrom, $dateTo);
$costs = $this->getAdCosts($dateFrom, $dateTo);
$revenueByChannel = [];
foreach ($deals as $deal) {
$channel = $this->getChannel($deal, $attributionModel);
$revenueByChannel[$channel] = ($revenueByChannel[$channel] ?? 0) + $deal['OPPORTUNITY'];
}
$result = [];
foreach ($costs as $channel => $cost) {
$revenue = $revenueByChannel[$channel] ?? 0;
$result[] = [
'channel' => $channel,
'spend' => $cost,
'revenue' => $revenue,
'profit' => $revenue - $cost,
'roi' => $cost > 0 ? round(($revenue - $cost) / $cost * 100, 1) : null,
'roas' => $cost > 0 ? round($revenue / $cost, 2) : null,
'cpl' => $cost > 0 ? round($cost / max(1, $this->getLeadsCount($channel, $dateFrom, $dateTo)), 0) : null,
];
}
usort($result, fn($a, $b) => ($b['roi'] ?? -PHP_INT_MAX) <=> ($a['roi'] ?? -PHP_INT_MAX));
return $result;
}
}
Метрики ROAS (Return on Ad Spend) и CPL (Cost Per Lead) дополняют ROI — ROAS показывает, сколько рублей выручки принёс каждый рубль расходов; CPL — стоимость лида.
Дашборд в Битрикс24
Для отображения ROI-аналитики в Битрикс24 — два варианта.
Вариант 1: Кастомный отчёт в /local/php_interface/admin/ — таблица с фильтром по периоду, возможностью переключения модели атрибуции, экспортом в Excel.
Вариант 2: Встраиваемое приложение Битрикс24 (React) — дашборд отображается на отдельной странице портала. Данные берутся из кастомного бэкенда (не из Битрикс24 напрямую). Графики через Recharts или ApexCharts.
// React-компонент ROI-дашборда
function RoiDashboard() {
const [period, setPeriod] = useState({ from: startOfMonth, to: today });
const [model, setModel] = useState<'first' | 'last' | 'linear'>('last');
const { data, isLoading } = useQuery({
queryKey: ['roi', period, model],
queryFn: () => fetchRoiReport(period, model),
});
return (
<div>
<PeriodSelector value={period} onChange={setPeriod} />
<ModelSelector value={model} onChange={setModel} />
{isLoading ? <Spinner /> : (
<>
<RoiTable data={data?.channels} />
<SpendVsRevenueChart data={data?.channels} />
</>
)}
</div>
);
}
Ключевые отчёты в системе
Сводная таблица по каналам (основной отчёт):
| Канал | Расходы | Лиды | CPL | Выручка | ROAS | ROI |
|---|---|---|---|---|---|---|
| Яндекс/brand | 45 000 | 38 | 1 184 | 380 000 | 8.4 | 744% |
| VK/ретаргетинг | 28 000 | 22 | 1 273 | 115 000 | 4.1 | 311% |
| Директ/конкуренты | 67 000 | 19 | 3 526 | 95 000 | 1.4 | 42% |
Динамика по месяцам — тренд ROI каждого канала. Позволяет видеть сезонность и деградацию каналов.
Воронка по источникам — конверсия лид → квалифицированный → сделка в разрезе каналов. Канал с дешёвыми лидами, но низкой конверсией в сделку, может уступать более дорогому каналу с качественными лидами.
Состав работ
- Определение модели атрибуции под бизнес-логику
- Пользовательские поля в лидах и сделках для UTM-данных
- Сбор цепочки касаний (JavaScript + сервер)
- Импорт расходов из рекламных систем (cron)
- Отчёт с вычислением ROI, ROAS, CPL
- Дашборд: административный раздел или React-приложение Б24
Сроки: базовый ROI-отчёт (last-click, один канал) — 1 неделя. Мультиканальный дашборд с несколькими моделями атрибуции — 3–5 недель.







