Инструмент для точного анализа заявок

Источник заявки и 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 секунд нужен, чтобы посетитель не ждал отправки формы дольше обычного, если сервис недоступен.

Как подключить

  1. Войдите в кабинет

    Укажите email и введите код из письма. Пароль не нужен, аккаунт создаётся при первом входе.

  2. Создайте проект

    Нажмите «Добавить проект», укажите название и домен сайта, затем нажмите «Ключ» и скопируйте ключ.

  3. Узнайте SID вопросов

    В админке Битрикса откройте «Сервисы → Веб-формы», нужную форму и вкладку «Вопросы»: символьный код каждого вопроса указан в списке.

  4. Добавьте код в init.php

    Вставьте пример выше, подставьте ключ и коды вопросов. Если форм несколько, а SID у них разные, разберите их по $WEB_FORM_ID.

  5. Проверьте на тестовой заявке

    Откройте сайт по ссылке с меткой, например ?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.

Начать бесплатно