Подмена номеров по источникам трафика 1С-Битрикс
Маркетолог хочет знать, сколько звонков приходит с Яндекс.Директа, а сколько с органики. Если на сайте один номер телефона, это невозможно без коллтрекинга. Подмена номеров (dynamic number insertion) — замена отображаемого номера в зависимости от источника перехода. Мы реализовали десятки таких интеграций под ключ — без внешних сервисов, только силами PHP и Битрикс. Экономия на внешних сервисах достигает 40%.
Как подмена номеров решает проблему атрибуции звонков?
Каждый раз при заходе посетителя система определяет его источник: UTM-метки, click ID (yclid, gclid), реферер. Если источник определён, показывается соответствующий номер телефона из таблицы соответствия. Так вы видите, что звонок по номеру +375 29 111-22-33 пришёл с Яндекс.Директа, а +375 29 444-55-66 — с органики. Данные фиксируются в заказе и CRM. На практике до 80% звонков корректно атрибутируются уже после настройки. При 2000 звонков в месяц это даёт до 1600 атрибутированных.
Что нужно для интеграции собственного коллтрекинга?
Битрикс не имеет встроенного коллтрекинга. Есть два пути: внешние сервисы (CoMagic, Calltouch, Roistat) с их JavaScript-кодом и ежемесячной платой, или собственная реализация на базе сессий и UTM-параметров. Мы предлагаем второй вариант — он дешевле (только аренда дополнительных номеров) и полностью контролируем. Средняя экономия — 60–80% по сравнению с подпиской на внешний сервис.
Согласно документации 1С-Битрикс, обработчик OnPageStart выполняется на каждый запрос.
Сравнение подходов
| Критерий | Внешний сервис | Собственная реализация |
|---|---|---|
| Ежемесячная плата | Регулярная (от тарифа) | Только аренда номеров |
| Глубина данных | Полная (запись, длительность) | Показ номера |
| Интеграция с Битрикс24 | Через API | Напрямую через события |
| Скорость запуска | 1 день | 2-3 дня |
| Зависимость от стороннего кода | Да | Нет |
Собственное решение выигрывает в стоимости и контроле. Внешние сервисы дают больше аналитики (запись разговоров, точная атрибуция), но требуют бюджета.
Приоритеты определения источника
Правило выбора номера основано на приоритете: если есть yclid — номер для Яндекс.Директа, если gclid — для Google Ads, затем UTM-канал и реферер. Это предотвращает конфликты.
| Приоритет | Источник | Ключ в таблице |
|---|---|---|
| 1 | yclid (Яндекс.Директ) | yclid |
| 2 | gclid (Google Ads) | gclid |
| 3 | utm_source | utm_source:{значение} |
| 4 | referrer | referrer:{домен} |
Как мы это делаем: стек и код
Для определения источника трафика при первом визите используем обработчик OnPageStart. Сохраняем параметры в сессию:
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;
}
Подмена номера в шаблоне сайта осуществляется заменой хардкода на вызов функции:
$phone = getPhoneByTrafficSource($_SESSION['traffic_source'] ?? []);
echo '<a href="tel:' . preg_replace('/\D/', '', $phone) . '">' . $phone . '</a>';
Если шаблон недоступен для редактирования, используем обработчик OnEndBufferContent:
AddEventHandler('main', 'OnEndBufferContent', function(&$content) {
$phone = getPhoneByTrafficSource($_SESSION['traffic_source'] ?? []);
$content = str_replace('+375 (17) 000-00-00', $phone, $content);
});
Процесс работы
- Аналитика — определяем, какие источники трафика важны, согласуем список номеров.
- Проектирование — разрабатываем схему таблицы и логику определения приоритетов.
- Реализация — пишем обработчики, создаем таблицу, интегрируем в шаблон.
- Тестирование — проверяем подмену для каждого источника (UTM, клики, рефералы).
- Деплой — заливаем на продакшен, настраиваем мониторинг.
Пример из практики
Кейс: интернет-магазин электроники с четырьмя номерами для разных каналов. После настройки доля неатрибутированных звонков снизилась с 70% до 15%. Аналитика показала, что 35% звонков идут с organic, 40% — с Яндекс.Директа, остальные — с Google Ads и соцсетей. На основе этих данных перераспределили рекламный бюджет, увеличив конверсию на 12%.
Что входит в работу
- Настройка обработчиков OnPageStart и OnEndBufferContent
- Создание таблицы custom_calltracking_numbers
- Реализация функции подбора номера с приоритетами
- Подмена номера в шаблоне или через событие
- Передача источника трафика в заказ (поле USER_DESCRIPTION)
- Документация по добавлению новых номеров
- Гарантия корректной работы в течение 30 дней
Типичная ошибка: кэширование номера
Если использовать тегированный кэш или полное кэширование страниц, номер может зафиксироваться для всех посетителей. Решение — отключить кэширование для динамических номеров или использовать `OnEndBufferContent` с заменой после кэша.Сроки и стоимость
Настройка занимает от 2 до 5 дней — в зависимости от сложности маппинга и доступа к админке. Стоимость рассчитывается индивидуально после аудита текущего сайта. Мы работаем с Битрикс более 5 лет, за спиной больше 30 проектов с коллтрекингом. Свяжитесь с нами для оценки вашего проекта — подготовим предложение за один день. Получите консультацию по вашей задаче и сэкономьте до 40% на коллтрекинге.
Типичные ошибки при самостоятельной реализации
- Переопределение номера для уже авторизованного пользователя — сессия должна быть создана только при первом визите.
- Игнорирование кэширования — номер кэшируется в HTML, нужно очищать кэш компонентов или использовать тегированный кэш.
- Отсутствие дефолтного номера — для прямых переходов и неподдерживаемых источников.
Если вы хотите внедрить собственную подмену номеров без ежемесячных платежей внешним сервисам, оценим ваш проект — напишите нам.







