Настройка статического коллтрекинга на 1С-Битрикс
Статический коллтрекинг — это когда каждому рекламному каналу постоянно назначен отдельный номер телефона: один для Яндекс.Директ, другой для Google Ads, третий — для офлайн-рекламы. Подмены в реальном времени нет — номер жёстко привязан к каналу и не меняется между посетителями.
Это дешевле динамического (меньше номеров), но точность ниже: атрибуция идёт до уровня канала, не до ключевого слова или объявления. Для бизнеса с небольшим числом каналов и высокой стоимостью звонка (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',
],
];
}
}
Определение канала и хранение в 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 посетителя), поэтому страница с телефоном кешироваться не должна.
Варианты решения:
Вариант 1: Подмена через JS — в HTML ставим дефолтный номер, подмену по cookie делаем клиентским скриптом после загрузки страницы. Кеш не ломается.
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;
}
});
Вариант 2: Вынести телефон из кеша через $component->arResult с отключённым кешем для конкретного блока. В шаблоне компонента шапки:
// В component.php шапки
$this->SetResultCacheKeys([]); // Отключаем кеш для компонента
Вариант 3: ESI (Edge Side Includes) — если используете Varnish или nginx с модулем ESI. Телефон выносится в отдельный некешируемый ESI-фрагмент.
Для большинства проектов оптимален Вариант 1: кеш страниц сохраняется, замена телефона происходит за миллисекунды, пользователь практически не замечает мигания.
Интеграция с провайдером коллтрекинга
Даже при статическом коллтрекинге провайдер нужен для записи звонков, статистики и переадресации. Настройка на стороне провайдера (Callibri, CoMagic, Mango):
- Арендуем нужное количество номеров
- Для каждого номера — настраиваем правило: "если звонок на номер X, считать источником Y"
- Переадресация с подменного номера на основной рабочий
- (Опционально) Запись разговоров
Из Битрикс никакого API-взаимодействия с провайдером при статике не требуется — вся логика определения канала на стороне провайдера.
Состав работ
- Аренда подменных номеров у провайдера, настройка переадресации
- Разработка PHP-модуля определения канала и хранения в cookie
- Реализация JS-подмены телефона (кешо-совместимый вариант)
- Адаптация шаблонов компонентов (шапка, подвал, всплывающие формы)
- Настройка маппинга каналов через административный интерфейс
Сроки: полная настройка под 4–6 каналов — 3–7 рабочих дней.







