Источник заявки и UTM-метки из веб-форм 1С-Битрикс
Веб-форма 1С-Битрикс сохраняет ответы посетителя, но не то, откуда он пришёл. Небольшой обработчик в init.php передаёт каждую заявку в Linkodium Analytics вместе со страницей входа, реферером и UTM-метками.
Почему в результатах веб-формы нет источника
Модуль «Веб-формы» записывает в результат то, что посетитель ввёл в поля: имя, телефон, вопрос. Рекламная кампания, ключевая фраза или сайт, с которого пришёл человек, в результат не попадают. Их знает только первая страница визита: в её адресе стоят UTM-метки, а в заголовке запроса реферер. Форму же посетитель заполняет позже, часто на другой странице, где ни меток, ни реферера уже нет.
Обычно задачу решают скрытыми полями: скрипт на странице запоминает метки в cookie и подставляет их в форму. Способ рабочий, но каждую новую форму приходится дорабатывать, а если скрипт заблокирован или упал, метки теряются. Оба подхода разобраны в статье «Как передать UTM-метки в форму».
Для Битрикса удобнее серверный путь. Сайт сам запоминает источник в сессии на первом хите визита, а когда результат формы сохранён, его сервер отправляет заявку в Linkodium Analytics. Формы и их шаблоны менять не нужно, письма и результаты в админке остаются как были.
Что сохраняется по каждой заявке
Контакты из формы
Имя, телефон, email и текст сообщения: какие вопросы формы куда передавать, задаётся их символьными кодами (SID).
UTM-метки
utm_source, utm_medium, utm_campaign, utm_term и utm_content сервис разбирает из адреса страницы входа сам, каждую в своё поле.
Страница входа и страница заявки
Первая страница визита, куда человек попал с рекламы или из поиска, и страница, где он отправил форму.
Реферер
Адрес, с которого посетитель перешёл на сайт: поисковик, соцсеть, другой сайт.
Номер результата
ID результата веб-формы уходит в поле external_id: по нему заявку легко найти в админке Битрикса.
IP и браузер
IP-адрес и user-agent посетителя помогают при анализе распознать повторные и тестовые заявки.
Код для init.php
Обработчик ставится в /local/php_interface/init.php (или /bitrix/php_interface/init.php, если папки local на сайте нет). Первая функция на первом хите визита запоминает источник, вторая после сохранения результата веб-формы отправляет заявку по API приёма заявок:
<?php
// /local/php_interface/init.php (или /bitrix/php_interface/init.php)
const LKDM_KEY = 'aaeaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'; // ключ проекта из кабинета
// 1. Первый хит визита: запоминаем страницу входа, реферер и браузер.
AddEventHandler('main', 'OnProlog', 'lkdmRememberVisit');
function lkdmRememberVisit()
{
if (defined('ADMIN_SECTION') || isset($_SESSION['LKDM_START_URL'])) {
return;
}
$uri = $_SERVER['REQUEST_URI'] ?? '/';
if (strpos($uri, '/bitrix/') === 0) {
return;
}
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$_SESSION['LKDM_START_URL'] = $scheme . '://' . ($_SERVER['HTTP_HOST'] ?? '') . $uri;
$_SESSION['LKDM_REFERER'] = $_SERVER['HTTP_REFERER'] ?? '';
$_SESSION['LKDM_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
}
// 2. Результат веб-формы сохранён: отправляем заявку в Linkodium Analytics.
AddEventHandler('form', 'onAfterResultAdd', 'lkdmSendFormResult');
function lkdmSendFormResult($WEB_FORM_ID, $RESULT_ID)
{
$result = [];
$answers = [];
CFormResult::GetDataByID($RESULT_ID, [], $result, $answers);
// SID вопросов своей формы смотрите в её настройках, вкладка «Вопросы».
$data = [
'name' => lkdmAnswer($answers, 'NAME'),
'phone' => lkdmAnswer($answers, 'PHONE'),
'email' => lkdmAnswer($answers, 'EMAIL'),
'message' => lkdmAnswer($answers, 'MESSAGE'),
'external_id' => $RESULT_ID,
'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
'user_agent' => $_SESSION['LKDM_USER_AGENT'] ?? ($_SERVER['HTTP_USER_AGENT'] ?? ''),
'start_url' => $_SESSION['LKDM_START_URL'] ?? '',
'order_url' => $_SERVER['HTTP_REFERER'] ?? '',
'referer' => $_SESSION['LKDM_REFERER'] ?? '',
];
$ch = curl_init('https://a.linkodium.com/submit/' . LKDM_KEY . '/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_exec($ch);
curl_close($ch);
}
function lkdmAnswer(array $answers, $sid)
{
if (empty($answers[$sid]) || !is_array($answers[$sid])) {
return '';
}
$a = reset($answers[$sid]);
$value = trim((string)($a['USER_TEXT'] ?? ''));
return $value !== '' ? $value : trim((string)($a['ANSWER_TEXT'] ?? ''));
}
Это пример, а не готовый модуль: замените ключ на ключ своего проекта и коды NAME, PHONE, EMAIL, MESSAGE на SID вопросов своей формы. Если вопросов с такими кодами нет, поле уйдёт пустым. Таймаут в 5 секунд нужен, чтобы посетитель не ждал отправки формы дольше обычного, если сервис недоступен.
Как подключить
-
Войдите в кабинет
Укажите email и введите код из письма. Пароль не нужен, аккаунт создаётся при первом входе.
-
Создайте проект
Нажмите «Добавить проект», укажите название и домен сайта, затем нажмите «Ключ» и скопируйте ключ.
-
Узнайте SID вопросов
В админке Битрикса откройте «Сервисы → Веб-формы», нужную форму и вкладку «Вопросы»: символьный код каждого вопроса указан в списке.
-
Добавьте код в init.php
Вставьте пример выше, подставьте ключ и коды вопросов. Если форм несколько, а SID у них разные, разберите их по $WEB_FORM_ID.
-
Проверьте на тестовой заявке
Откройте сайт по ссылке с меткой, например ?utm_source=test, перейдите на страницу с формой и отправьте её. Заявка с меткой test появится в проекте.
Если формы на сайте не на модуле «Веб-формы»
Пример выше слушает событие модуля «Веб-формы». Если форма своя, например AJAX-обработчик, который пишет заявку в инфоблок или отправляет письмо, вызов отправки ставится прямо в этот обработчик: в момент, когда заявка принята, соберите поля в массив, как в функции lkdmSendFormResult, и отправьте их тем же запросом. Функция lkdmRememberVisit при этом остаётся без изменений: источник визита ей всё равно, какой формой его потом заберут.
CRM-формы Битрикс24, встроенные на сайт кодом, работают на стороне Битрикс24, и заявки из них сайт не получает. Такие формы этим способом не подключаются.
Что проверить, если что-то не так
Ответ сервиса на каждую отправку: {"status":"success"} или {"status":"error"}. Что значит каждый код ответа, написано в инструкции «Передача данных».
| Признак | Причина и что сделать |
|---|---|
| Заявок в проекте нет | Сверьте ключ с кнопкой «Ключ» в кабинете. Убедитесь, что хотя бы одно из полей имени, телефона или email не пустое: заявка без контакта не сохраняется. |
| Контакты пустые, а заявки есть | SID в коде не совпадают с кодами вопросов формы. Сверьте их на вкладке «Вопросы». |
| Нет страницы входа и UTM-меток | Первую страницу визита отдал композитный кеш или CDN, и PHP на ней не выполнялся. Отключите композит для страниц, куда ведёт реклама, или передавайте адрес входа из браузера полем start_url_js. |
| Отправка формы стала дольше | Сервер сайта долго соединяется с a.linkodium.com. Проверьте исходящие соединения с сервера и оставьте таймаут небольшим. |
Вопросы о подключении Битрикса
Есть ли готовый модуль для 1С-Битрикс?
Нет. Готовый плагин есть только для Contact Form 7 на WordPress. Сайт на Битриксе подключается через API приёма заявок обработчиком в init.php, пример выше.
Влияет ли блокировщик рекламы на сохранение заявки?
Нет. Источник запоминается в сессии на сервере сайта, и заявку отправляет тоже сервер, а не браузер посетителя.
Можно ли передать название формы или выбранную услугу?
Да, в поле custom: туда можно записать любые данные строкой. Учтите, что непустое custom считается контактом, и заявка с ним сохранится даже без имени и телефона.
Сколько стоит подключение?
Сервис бесплатный, число сайтов и заявок не ограничено. Доработку init.php делает ваш разработчик.
Как посчитать заявки по рекламным кампаниям?
Выгрузите заявки проекта в Excel за период до 92 дней и постройте сводную таблицу по utm_campaign. Расчёт стоимости заявки разобран в статье «Как посчитать стоимость заявки по каналам рекламы».
Сохраняйте заявки с Битрикса вместе с источником
Войдите по email, создайте проект и добавьте обработчик с его ключом в init.php.
Начать бесплатно