Интеграция 1С-Битрикс с Callibri
Callibri — платформа коллтрекинга и мультиканальной аналитики. В отличие от базового Google Analytics, она умеет сшивать звонок с конкретным источником трафика и передавать UTM-метки в CRM. Проблема стандартных установок: скрипт Callibri собирает данные в своей системе, а заявки из Битрикс-форм живут в b_form_result, и никакой связи между ними нет. Менеджер видит звонок, но не знает, с какого объявления пришёл клиент. Задача интеграции — замкнуть цепочку: источник → действие → заявка/звонок → сделка в CRM.
Архитектура интеграции
Callibri предоставляет два механизма: JavaScript API для клиентской стороны и REST API для серверного взаимодействия. Для полноценной интеграции с Битрикс нужны оба.
Схема потока данных:
Посетитель → Callibri JS подменяет номер
→ Звонок фиксируется в Callibri
→ Webhook от Callibri (POST на ваш endpoint)
→ Битрикс-обработчик
→ Создание лида/сделки в CRM Битрикс
→ Привязка UTM-меток к сделке
Параллельно для онлайн-форм:
Отправка формы Битрикс
→ JS-обработчик: считывает callibri_visitor_uid из cookie
→ Передача uid вместе с данными формы
→ Серверный обработчик сохраняет uid в свойствах лида
→ Callibri REST API: запрос деталей визита по uid
Настройка Webhook от Callibri
В личном кабинете Callibri: Настройки → Интеграции → Webhook. Указываем URL вашего обработчика. Callibri отправляет POST с JSON-пейлоадом при каждом звонке, чате или заявке.
Структура пейлоада (основные поля):
{
"call_id": "98765432",
"call_type": "call",
"caller_number": "+79161234567",
"call_date": "2024-03-15 14:23:11",
"utm_source": "yandex",
"utm_medium": "cpc",
"utm_campaign": "brand_kw",
"duration": 145,
"is_target": true,
"visitor_id": "callibri_abc123"
}
Обработчик в Битрикс — отдельный компонент или /local/api/callibri-webhook.php:
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
$rawInput = file_get_contents('php://input');
$data = json_decode($rawInput, true);
if (empty($data) || empty($data['caller_number'])) {
http_response_code(400);
exit;
}
// Верификация через секретный токен в заголовке
$token = $_SERVER['HTTP_X_CALLIBRI_TOKEN'] ?? '';
if ($token !== \Bitrix\Main\Config\Option::get('local.callibri', 'webhook_secret')) {
http_response_code(403);
exit;
}
(new \Local\Callibri\LeadCreator())->createFromWebhook($data);
http_response_code(200);
echo json_encode(['status' => 'ok']);
Создание лида в CRM по звонку
namespace Local\Callibri;
use Bitrix\Crm\LeadTable;
use Bitrix\Main\Type\DateTime;
class LeadCreator
{
public function createFromWebhook(array $data): int
{
$fields = [
'TITLE' => 'Звонок Callibri: ' . $data['caller_number'],
'PHONE' => [['VALUE' => $data['caller_number'], 'VALUE_TYPE' => 'WORK']],
'SOURCE_ID' => 'CALL',
'STATUS_ID' => 'NEW',
'ASSIGNED_BY_ID' => $this->resolveAssignee($data),
'UF_CALLIBRI_ID' => $data['call_id'],
'UF_UTM_SOURCE' => $data['utm_source'] ?? '',
'UF_UTM_MEDIUM' => $data['utm_medium'] ?? '',
'UF_UTM_CAMPAIGN'=> $data['utm_campaign'] ?? '',
'UF_CALL_DURATION' => (int)($data['duration'] ?? 0),
'COMMENTS' => $this->buildComment($data),
];
$lead = new \CCrmLead(false);
$leadId = $lead->Add($fields, true, ['DISABLE_USER_FIELD_CHECK' => false]);
if (!$leadId) {
\CEventLog::Add([
'SEVERITY' => 'ERROR',
'AUDIT_TYPE_ID' => 'CALLIBRI_LEAD_FAIL',
'MODULE_ID' => 'local.callibri',
'DESCRIPTION' => $lead->LAST_ERROR,
]);
}
return (int)$leadId;
}
private function buildComment(array $data): string
{
$isTarget = $data['is_target'] ? 'Целевой' : 'Нецелевой';
return sprintf(
"Callibri ID: %s\nТип: %s\nДлительность: %d сек.\nИсточник: %s / %s / %s",
$data['call_id'],
$isTarget,
$data['duration'] ?? 0,
$data['utm_source'] ?? '—',
$data['utm_medium'] ?? '—',
$data['utm_campaign'] ?? '—'
);
}
}
Привязка визита к форме Битрикс
Callibri устанавливает cookie callibri_visitor_uid на стороне клиента. Нужно перехватить отправку формы и добавить uid как скрытое поле.
JavaScript на странице с формой:
document.addEventListener('DOMContentLoaded', function () {
const forms = document.querySelectorAll('form.bx-form, form[data-bitrix-form]');
forms.forEach(function (form) {
const uid = getCookie('callibri_visitor_uid');
if (uid) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'callibri_uid';
input.value = uid;
form.appendChild(input);
}
});
});
function getCookie(name) {
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? match[2] : null;
}
На сервере в обработчике формы (OnBeforeIBlockElementAdd или кастомный обработчик):
$callibriUid = htmlspecialchars($_POST['callibri_uid'] ?? '');
if ($callibriUid) {
// Сохраняем в пользовательское поле лида
$leadFields['UF_CALLIBRI_UID'] = $callibriUid;
// Запрашиваем детали визита из Callibri API
$visitData = (new \Local\Callibri\ApiClient())->getVisitByUid($callibriUid);
if ($visitData) {
$leadFields['UF_UTM_SOURCE'] = $visitData['utm_source'] ?? '';
$leadFields['UF_UTM_CAMPAIGN'] = $visitData['utm_campaign'] ?? '';
}
}
Дедупликация лидов
Типичная проблема: клиент позвонил и потом заполнил форму. Два отдельных лида для одного контакта.
public function findExistingLead(string $phone): ?int
{
$phone = preg_replace('/\D/', '', $phone);
$result = \CCrmLead::GetList(
['DATE_CREATE' => 'DESC'],
[
'PHONE' => $phone,
'STATUS_ID' => 'NEW',
'>DATE_CREATE' => (new DateTime())->add('-1D')->format('d.m.Y H:i:s'),
],
false, ['nTopCount' => 1],
['ID', 'UF_CALLIBRI_ID']
);
if ($row = $result->Fetch()) {
return (int)$row['ID'];
}
return null;
}
Если свежий лид найден — обновляем его данными, не создаём новый.
Пользовательские поля для UTM в CRM
Поля создаются через CUserTypeEntity или через административный интерфейс CRM. Рекомендуемый набор:
| Код поля | Тип | Назначение |
|---|---|---|
| UF_CALLIBRI_ID | string | ID звонка/чата в Callibri |
| UF_CALLIBRI_UID | string | Visitor UID для сшивки с формой |
| UF_UTM_SOURCE | string | utm_source |
| UF_UTM_MEDIUM | string | utm_medium |
| UF_UTM_CAMPAIGN | string | utm_campaign |
| UF_UTM_TERM | string | utm_term |
| UF_CALL_DURATION | integer | Длительность звонка, сек |
| UF_IS_TARGET_CALL | boolean | Целевой звонок |
Состав работ
- Регистрация компонента
local.callibri, установка опций модуля - Разработка webhook-обработчика с верификацией
- Создание пользовательских полей в CRM (лид, сделка)
- Клиент Callibri REST API (получение деталей визита)
- JS-скрипт перехвата форм для передачи visitor_uid
- Логика дедупликации лидов по номеру телефона
- Тестирование сквозного сценария: звонок → лид с UTM
Сроки: базовая интеграция (webhook → лид) — 1–2 недели. Полная сшивка с формами, дедупликация, витрина UTM в карточке сделки — 3–4 недели.







