Інтеграція 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 тижні.







