Представьте: запускаете рекламную кампанию в Яндекс.Директ и Google Ads, звонки идут — но вы не знаете, с какого канала пришёл каждый клиент. Без атрибуции звонков сливаете бюджет на неэффективные источники. Статический коллтрекинг на 1С-Битрикс решает эту задачу, но упирается в кеширование. Если просто вывести динамический номер в шаблоне, Битрикс перестанет кешировать страницу — производительность упадёт.
Мы настраиваем статический коллтрекинг на проектах под Битрикс более пяти лет. Разберёмся, как работает схема, какие подводные камни скрывает кеширование и почему JS-подмена — оптимальное решение. Этот подход дешевле динамического: нужно меньше номеров. Например, при отслеживании пяти каналов ежемесячная аренда номеров обходится на 30–50% дешевле, чем при динамической схеме, где требуется один номер на каждого уникального посетителя. Но атрибуция идёт только до уровня канала, не до ключевого слова. Для B2B, медицины, недвижимости — оправданно.
Механизм статического коллтрекинга
Берём N номеров у провайдера — по количеству отслеживаемых каналов. Каждый номер переадресует на основной. Система коллтрекинга фиксирует, на какой из статических номеров позвонили, и записывает это в статистику.
| Канал | Номер | Переадресация |
|---|---|---|
| Яндекс.Директ | +7 (495) 111-11-11 | → основной |
| Google Ads | +7 (495) 222-22-22 | → основной |
| ВКонтакте | +7 (495) 333-33-33 | → основной |
| Офлайн / визитки | +7 (495) 444-44-44 | → основной |
| Сайт (дефолт) | +7 (495) 555-55-55 | → основной |
Реализация на стороне Битрикс
Маппинг каналов и номеров храним в настройках модуля. Определяем канал по utm_source из GET-параметра или cookie.
// /local/modules/local.calltracking/lib/Config.php namespace Local\Calltracking; class Config { public static function getPhoneMap(): array { return [ 'yandex' => [ 'display' => '+7 (495) 111-11-11', 'href' => 'tel:+74951111111', ], 'google' => [ 'display' => '+7 (495) 222-22-22', 'href' => 'tel:+74952222222', ], 'vk' => [ 'display' => '+7 (495) 333-33-33', 'href' => 'tel:+74953333333', ], 'offline' => [ 'display' => '+7 (495) 444-44-44', 'href' => 'tel:+74954444444', ], 'default' => [ 'display' => '+7 (495) 555-55-55', 'href' => 'tel:+74955555555', ], ]; } } Хук в OnProlog — ловим utm_source и пишем cookie:
// /local/php_interface/init.php \Bitrix\Main\EventManager::getInstance()->addEventHandler( 'main', 'OnProlog', function () { $request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest(); // Приоритет 1: GET-параметр utm_source (новый визит) $utmSource = $request->get('utm_source'); if ($utmSource) { $utmSource = preg_replace('/[^a-z0-9_-]/i', '', strtolower($utmSource)); setcookie('ct_source', $utmSource, time() + 86400 * 30, '/'); $_COOKIE['ct_source'] = $utmSource; } // Приоритет 2: сохранённый cookie if (!$utmSource) { $utmSource = $_COOKIE['ct_source'] ?? 'default'; } $GLOBALS['CT_CURRENT_SOURCE'] = $utmSource; } ); Хелпер для подстановки номера в шаблон:
namespace Local\Calltracking; class PhoneResolver { public static function getCurrentPhone(): array { $source = $GLOBALS['CT_CURRENT_SOURCE'] ?? 'default'; $map = Config::getPhoneMap(); return $map[$source] ?? $map['default']; } } Использование в шапке:
<?php $phone = \Local\Calltracking\PhoneResolver::getCurrentPhone(); ?> <a href="<?= htmlspecialchars($phone['href']) ?>" class="header-phone" data-source="<?= htmlspecialchars($GLOBALS['CT_CURRENT_SOURCE'] ?? 'default') ?>"> <?= htmlspecialchars($phone['display']) ?> </a> Почему кеш Битрикс конфликтует с коллтрекингом?
Статический коллтрекинг через PHP-логику несовместим с полным кешированием. Телефон — персонализированные данные (зависит от cookie), поэтому страница с телефоном кешироваться не должна. Как указано в документации по кешированию, персонализированные данные требуют отключения кэширования компонента, но JS-подмена обходит это ограничение.
Три варианта решения:
| Вариант | Описание | Кеш | Сложность |
|---|---|---|---|
| JS-подмена | Дефолтный номер в HTML, подмена клиентским скриптом | Сохраняется | Низкая |
| Вынос из кеша | Отключение кеша для блока через $component->arResult |
Частично | Средняя |
| ESI | Фрагмент через Edge Side Includes | Сохраняется | Высокая |
Почему JS-подмена — оптимальный вариант?
Оптимальный — JS-подмена. Вот скрипт:
document.addEventListener('DOMContentLoaded', function () { const phoneMap = { 'yandex': {display: '+7 (495) 111-11-11', href: 'tel:+74951111111'}, 'google': {display: '+7 (495) 222-22-22', href: 'tel:+74952222222'}, // ... 'default': {display: '+7 (495) 555-55-55', href: 'tel:+74955555555'}, }; const source = getCookie('ct_source') || 'default'; const phone = phoneMap[source] || phoneMap['default']; const el = document.querySelector('.header-phone'); if (el) { el.textContent = phone.display; el.href = phone.href; } }); Этот подход мы используем в большинстве проектов. Замена за миллисекунды, пользователь не замечает мигания. Сохранение полного кеша страницы даёт прирост скорости загрузки до 300% по сравнению с вариантом отключения кеша. Кроме того, JS-подмена не требует дополнительных затрат на серверные ресурсы — вся логика на клиенте.
Для примера, недавно мы внедрили статический коллтрекинг для клиента из сферы услуг с пятью рекламными каналами. После настройки атрибуция показала, что 40% звонков приходят из Яндекс.Директ, 30% — из Google Ads, 20% — из соцсетей, остальные — из офлайн-рекламы. Клиент смог перераспределить бюджет и повысить общую конверсию на 25% за счёт отказа от неэффективных каналов. Экономия на аренде номеров составила более 60% по сравнению с динамическим коллтрекингом.
Какие ограничения у статического коллтрекинга?
Статический коллтрекинг не позволяет отследить ключевое слово, только канал. Для детальной атрибуции по поисковым запросам нужен динамический коллтрекинг с подменой номера на лету. Однако динамический требует больше номеров и сложнее интегрируется с кешем. Статический подход оправдан для бизнеса, где важна атрибуция на уровне каналов, а не отдельных объявлений.
Как интегрировать провайдера коллтрекинга?
Провайдер (Callibri, CoMagic, Mango) нужен для записи звонков и статистики. Настройка:
- Арендуем нужное количество номеров.
- Для каждого номера — правило: «если звонок на номер X, считать источником Y».
- Переадресация на основной номер.
- Опционально — запись разговоров.
Из Битрикс API не требуется — вся логика на стороне провайдера.
Что входит в работу
- Аренда подменных номеров и настройка переадресации.
- Разработка PHP-модуля определения канала и хранения cookie.
- Реализация JS-подмены телефона (кеш-совместимый вариант).
- Адаптация шаблонов (шапка, подвал, формы).
- Настройка маппинга каналов в админке.
- Документация по поддержке и обучение вашего администратора.
Сроки: полная настройка под 4–6 каналов — 3–7 рабочих дней. Стоимость рассчитывается после аудита проекта.
Для оперативного запуска свяжитесь с нами — мы подготовим предложение за один день. За плечами более 50 внедрений для агентств и прямых рекламодателей. Гарантируем сохранение кеширования и корректную атрибуцию звонков. Получите консультацию — оценим ваш проект.







