Интеграция 1С-Битрикс с CoMagic
Звонки уходят в никуда, а менеджеры переспрашивают данные? CoMagic — одна из немногих платформ коллтрекинга, которая хранит не просто источник звонка, а полную цепочку касаний посетителя. Но без связки с 1С-Битрикс эти данные оседают в интерфейсе CoMagic и не влияют на бизнес-процессы. Мы настраиваем интеграцию так, чтобы каждый целевой звонок автоматически создавал лид в CRM, а в карточке всплывала история всех взаимодействий с сайта.
Наш опыт в интеграциях CoMagic с Битрикс составляет более 30 проектов. Типичный результат — сокращение времени обработки лида на 40% и снижение стоимости лида до 30% за счёт точной атрибуции. Гарантируем прозрачность и стабильность работы решения.
Какие проблемы решает интеграция?
- Потеря атрибуции звонков. Без visitor_id менеджер не видит, с какого канала пришёл клиент. CoMagic Data API привязывает к лиду данные всех сессий.
- Ручной ввод данных. Звонки не попадают в CRM автоматически — приходится заносить вручную, что занимает до 5 минут на лид. Webhook сокращает этот процесс до секунд.
- Дублирование лидов. Один и тот же номер может звонить несколько раз. Мы реализуем дедупликацию: если лид с таким номером уже есть, обновляем его, а не создаём копию.
Как CoMagic передаёт звонки в CRM?
CoMagic использует два механизма: webhook и Data API. Webhook при завершении звонка отправляет POST-запрос на ваш сервер, а Data API позволяет в любой момент запросить полную информацию о сессии по visitor_id. Мы реализуем оба — для мгновенного создания лида и для последующего обогащения.
Webhook: верификация и обработка
CoMagic подписывает каждый webhook HMAC-SHA256. Мы проверяем подпись и отбрасываем звонки короче 10 секунд — они почти всегда спам или ошибочный набор.
// /local/api/comagic-webhook.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
$data = json_decode(file_get_contents('php://input'), true);
$signature = $_SERVER['HTTP_X_COMAGIC_SIGNATURE'] ?? '';
$secret = \Bitrix\Main\Config\Option::get('local.comagic', 'webhook_secret');
$expected = hash_hmac('sha256', file_get_contents('php://input'), $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}
$event = $data['event_type'] ?? '';
if ($event === 'call_session_completed') {
$processor = new \Local\CoMagic\CallProcessor();
$processor->handle($data['call_session']);
}
http_response_code(200);
Обработчик звонка: создание лида
Если звонок признан целевым, мы создаём лид с привязкой к UTM-меткам и CoMagic ID. Если лид по этому номеру уже существует — обновляем, чтобы не плодить дубли.
namespace Local\CoMagic;
class CallProcessor
{
public function handle(array $session): void
{
if (($session['is_lost_call'] ?? false) && ($session['duration_total'] ?? 0) < 10) {
return;
}
$phone = $this->normalizePhone($session['visitor_phone_number'] ?? '');
if (!$phone) {
return;
}
$existingLeadId = $this->findRecentLead($phone);
$fields = [
'TITLE' => 'Звонок CoMagic: ' . $phone,
'PHONE' => [['VALUE' => $phone, 'VALUE_TYPE' => 'WORK']],
'SOURCE_ID' => 'CALL',
'STATUS_ID' => 'NEW',
'UF_COMAGIC_ID' => (string)($session['id'] ?? ''),
'UF_UTM_SOURCE' => $session['utm_source'] ?? '',
'UF_UTM_MEDIUM' => $session['utm_medium'] ?? '',
'UF_UTM_CAMPAIGN' => $session['utm_campaign'] ?? '',
'UF_UTM_CONTENT' => $session['utm_content'] ?? '',
'UF_UTM_TERM' => $session['utm_term'] ?? '',
'COMMENTS' => $this->buildComment($session),
];
$lead = new \CCrmLead(false);
if ($existingLeadId) {
$lead->Update($existingLeadId, $fields, true);
} else {
$lead->Add($fields, true);
}
}
private function buildComment(array $session): string
{
return implode("\n", [
'CoMagic Session ID: ' . ($session['id'] ?? ''),
'Оператор: ' . ($session['employee_full_name'] ?? '—'),
'Длительность: ' . ($session['duration_total'] ?? 0) . ' сек.',
'Источник трафика: ' . ($session['traffic_type'] ?? '—'),
'Страница входа: ' . ($session['site_domain_url'] ?? '—'),
'Теги: ' . implode(', ', $session['tags'] ?? []),
]);
}
}
Что даёт visitor_id?
CoMagic записывает cookie comagic_visitor на сайте. Когда лид проходит по цепочке, мы на сервере запрашиваем полную сессию через Data API и проставляем в кастомные поля: количество сессий, первый и последний источник. Это позволяет менеджеру видеть, с какого канала пришёл клиент, даже если звонок был не первым касанием.
class VisitorEnricher
{
private ApiClient $api;
public function enrichLead(int $leadId, string $visitorId): void
{
try {
$result = $this->api->call('visitors.get_visitor_info', [
'visitor_id' => $visitorId,
'date_from' => date('Y-m-d', strtotime('-1 day')),
'date_till' => date('Y-m-d'),
]);
$visitor = $result['data'][0] ?? null;
if (!$visitor) {
return;
}
$updateFields = [
'UF_CM_VISITOR_ID' => $visitorId,
'UF_CM_SESSION_COUNT' => (int)($visitor['sessions_count'] ?? 0),
'UF_CM_FIRST_SOURCE' => $visitor['first_session']['utm_source'] ?? '',
'UF_CM_LAST_SOURCE' => $visitor['last_session']['utm_source'] ?? '',
];
$lead = new \CCrmLead(false);
$lead->Update($leadId, $updateFields, true);
} catch (\RuntimeException $e) {
\CEventLog::Add([
'SEVERITY' => 'WARNING',
'AUDIT_TYPE_ID' => 'COMAGIC_ENRICH_FAIL',
'MODULE_ID' => 'local.comagic',
'DESCRIPTION' => $e->getMessage(),
]);
}
}
}
Click-to-call: звонок прямо из CRM
CoMagic SIP позволяет совершать исходящие вызовы через API. Мы добавляем кнопку «Позвонить» в карточку лида и сделки. После нажатия оператор получает звонок на свою SIP-линию, и CoMagic соединяет его с клиентом.
public function initiateCall(int $leadId, string $operatorLogin): array
{
$lead = \CCrmLead::GetByID($leadId);
$phones = \CCrmFieldMulti::GetList(
[],
['ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => $leadId, 'TYPE_ID' => 'PHONE']
);
$phoneRow = $phones->Fetch();
if (!$phoneRow) {
return ['success' => false, 'error' => 'No phone'];
}
$result = $this->api->call('calls.make_call', [
'virtual_phone_number' => \Bitrix\Main\Config\Option::get('local.comagic', 'virtual_number'),
'operator_login' => $operatorLogin,
'destination_number' => $phoneRow['VALUE'],
]);
return ['success' => true, 'call_id' => $result['data']['call_session_id'] ?? null];
}
CoMagic vs другие системы коллтрекинга
CoMagic выгодно отличается от аналогов глубиной данных. Например, в Callibri визит считается одним касанием, а CoMagic разбивает его на точки (страницы, каналы) — это даёт multi-touch атрибуцию «из коробки». Кроме того, CoMagic API позволяет гибко управлять звонками: инициировать вызов, менять сценарии, получать записи разговоров. По данным CoMagic, внедрение сквозной аналитики с их платформой увеличивает конверсию в продажу до 30%.
| Характеристика | CoMagic | Callibri | Alibra |
|---|---|---|---|
| Multi-touch атрибуция | Да (из коробки) | Только первое касание | Только последнее касание |
| Webhook | Есть | Есть | Есть, но без HMAC |
| Data API | Полное (сессии, звонки, чаты) | Ограниченное | Ограниченное |
| Click-to-call | Да | Да (через сторонние API) | Нет |
| Запись звонков | Да | Да | Да |
Кастомные поля, которые мы создаём
| Код | Привязка | Тип | Источник |
|---|---|---|---|
| UF_COMAGIC_ID | Лид | string | Webhook |
| UF_CM_VISITOR_ID | Лид | string | Cookie |
| UF_CM_SESSION_COUNT | Лид | integer | Data API |
| UF_CM_FIRST_SOURCE | Лид | string | Data API |
| UF_CM_LAST_SOURCE | Лид | string | Data API |
| UF_UTM_SOURCE..TERM | Лид, Сделка | string | Webhook / API |
Что входит в интеграцию?
- Модуль
local.comagic: клиент API, процессоры событий, логгер. - Webhook-эндпоинт с верификацией HMAC-подписи.
- Создание/обновление лидов в CRM по звонкам и чатам.
- JS-перехват форм для передачи visitor_id.
- Серверное обогащение данными сессии через Data API.
- Опционально: click-to-call из карточки CRM и дашборд «CoMagic».
- Документация, обучение администраторов, 2 недели поддержки после запуска.
Технические детали реализации
Аутентификация CoMagic использует JSON-RPC 2.0. Базовый класс ApiClient уже заточен под работу с Битрикс — он вынесен в отдельный namespace и использует \Bitrix\Main\Config\Option для хранения credentials. Все внешние вызовы залогированы в CEventLog.
namespace Local\CoMagic;
class ApiClient
{
private string $baseUrl = 'https://dataapi.comagic.ru/v2.0';
private ?string $accessToken = null;
private string $login;
private string $password;
public function __construct(string $login, string $password)
{
$this->login = $login;
$this->password = $password;
}
public function call(string $method, array $params = []): array
{
if (!$this->accessToken) {
$this->authenticate();
}
$payload = [
'jsonrpc' => '2.0',
'id' => uniqid('cm_', true),
'method' => $method,
'params' => array_merge(['access_token' => $this->accessToken], $params),
];
$ch = curl_init($this->baseUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_TIMEOUT => 10,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
if (isset($response['error'])) {
throw new \RuntimeException('CoMagic API error: ' . $response['error']['message']);
}
return $response['result'] ?? [];
}
private function authenticate(): void
{
$payload = [
'jsonrpc' => '2.0',
'id' => 'auth',
'method' => 'login.user',
'params' => ['login' => $this->login, 'password' => $this->password],
];
$ch = curl_init($this->baseUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
$this->accessToken = $result['result']['data']['access_token']
?? throw new \RuntimeException('CoMagic auth failed');
}
}
Сроки и стоимость
Базовая интеграция (webhook → лид + UTM) — 1–2 недели. Полная сшивка с multi-touch атрибуцией, click-to-call и витриной данных — 4–6 недель. Стоимость рассчитывается индивидуально после аудита вашей CRM и объёмов трафика. Свяжитесь с нами для аудита и оценки проекта за один рабочий день.







