Настройка подмены номеров по источникам трафика 1С-Битрикс
Маркетолог хочет знать, сколько звонков приходит с Яндекс.Директа, а сколько с органики. Если на сайте один номер телефона, это невозможно без коллтрекинга. Подмена номеров (dynamic number insertion) — замена отображаемого номера в зависимости от источника перехода.
Модуль bitrix.seo и UTM-параметры
Битрикс не имеет встроенного коллтрекинга. Интеграция реализуется двумя путями: через внешние сервисы (CoMagic, Calltouch, Roistat) с их JavaScript-кодом, или через собственную реализацию на базе сессий и UTM-параметров.
Для собственной реализации источник трафика читается из $_GET при первом визите и сохраняется в сессию. Набор параметров: utm_source, utm_medium, utm_campaign для платного трафика; gclid для Google Ads; yclid для Яндекс.Директа; fbclid для Facebook.
Обработчик сохранения источника в сессию:
AddEventHandler('main', 'OnPageStart', function() {
if (isset($_GET['utm_source']) || isset($_GET['yclid']) || isset($_GET['gclid'])) {
$_SESSION['traffic_source'] = [
'utm_source' => $_GET['utm_source'] ?? '',
'utm_medium' => $_GET['utm_medium'] ?? '',
'utm_campaign' => $_GET['utm_campaign'] ?? '',
'yclid' => $_GET['yclid'] ?? '',
'gclid' => $_GET['gclid'] ?? '',
'referrer' => $_SERVER['HTTP_REFERER'] ?? '',
'timestamp' => time(),
];
}
if (!isset($_SESSION['traffic_source'])) {
$_SESSION['traffic_source'] = [
'referrer' => $_SERVER['HTTP_REFERER'] ?? '',
'direct' => true,
];
}
});
Таблица соответствия источников и номеров
Для каждого источника трафика назначается отдельный телефонный номер. Маппинг хранится в кастомной таблице или в настройках компонента. Структура таблицы:
CREATE TABLE custom_calltracking_numbers (
id SERIAL PRIMARY KEY,
source_key VARCHAR(100) NOT NULL, -- 'yclid', 'gclid', 'utm_source:yandex', ...
phone VARCHAR(30) NOT NULL,
description VARCHAR(255),
active BOOLEAN DEFAULT true
);
Логика выбора номера:
function getPhoneByTrafficSource(array $source): string {
$default = '+375 (17) 000-00-00';
if (!empty($source['yclid'])) {
return getPhoneFromDb('yclid');
}
if (!empty($source['gclid'])) {
return getPhoneFromDb('gclid');
}
if (!empty($source['utm_source'])) {
return getPhoneFromDb('utm_source:' . $source['utm_source']) ?: $default;
}
if (!empty($source['referrer'])) {
$host = parse_url($source['referrer'], PHP_URL_HOST);
return getPhoneFromDb('referrer:' . $host) ?: $default;
}
return $default;
}
Подмена в шаблоне сайта
Номер телефона в шаблоне (/bitrix/templates/[template]/header.php) заменяется на вызов функции вместо хардкода:
$phone = getPhoneByTrafficSource($_SESSION['traffic_source'] ?? []);
echo '<a href="tel:' . preg_replace('/\D/', '', $phone) . '">' . $phone . '</a>';
Для подмены номеров в уже сформированном HTML (если шаблон не под вашим контролем) — обработчик события OnEndBufferContent:
AddEventHandler('main', 'OnEndBufferContent', function(&$content) {
$phone = getPhoneByTrafficSource($_SESSION['traffic_source'] ?? []);
$content = str_replace('+375 (17) 000-00-00', $phone, $content);
});
Передача источника в заказ
При оформлении заказа источник трафика передаётся в свойства заказа или в поле COMMENTS. Это позволяет в CRM видеть, откуда пришёл каждый покупатель.
AddEventHandler('sale', 'OnSaleOrderBeforeSaved', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$source = $_SESSION['traffic_source'] ?? [];
$comment = $order->getField('USER_DESCRIPTION');
$sourceStr = json_encode($source, JSON_UNESCAPED_UNICODE);
$order->setField('MANAGER_NOTES', 'Источник: ' . $sourceStr);
});
Статистика звонков
Для полноценного анализа нужно фиксировать не только показы номера, но и факты звонков. Внешние сервисы коллтрекинга предоставляют webhook при входящем звонке — его можно обработать и записать в кастомную таблицу с привязкой к USER_ID если пользователь авторизован, или к сессионному идентификатору.







