Техподдержка сайтов
+7 (904) 589-06-04
+7 (904) 589-06-04
telegram @sng24
MAX
info@sng-it.ru
ПРОГРАММИСТ 1С-БИТРИКС
ПРОГРАММИСТ 1С-БИТРИКС
разработка · доработка · техподдержка
  • О себе
  • Услуги
    Обновление сайтов на 1С-БитриксPHP 8.2+, MySQL 8, ядро и модули›Поиск и удаление вирусовПроверка, очистка и защита сайта›Создание сайтовРазработка сайтов под задачи бизнеса›Интеграция сайта с 1СОбмен товарами, остатками и заказами›Композитный сайт›Внутренняя оптимизация сайтаТехническое SEO и оптимизация›Доработка сайтовНовые функции, интеграции, нестандартные решения›Импорт каталога из файла поставщикаИмпорт и обновление товарных данных›Перенос сайта на 1С БитриксМиграция сайта на 1С-Битрикс›Парсинг контентаСбор и импорт данных›Установка готового сайтаУстановка и настройка готового решения›Купить лицензию 1С Битрикс›Битрикс 24CRM и автоматизация бизнеса›Выгрузка товаров в Яндекс.Маркет›Настройка служб доставкиИнтеграция служб доставки›Интеграция с соцсетями›Заказ на Маркете›Перевод сайта на https›Сопровождение сайтов на 1С БитриксОбслуживание и развитие сайтов›Настройка платежных системПодключение и настройка оплаты›
    Все услуги →
  • Портфолио
  • Готовые сайты
    Недвижимость›Медицина›Ресторанный бизнес›Автомобили и автозапчасти›Бухгалтерские и юридические услуги›Государство›Детские товары›Красота и здоровье›Мебель, интерьер, декор›Образование›Одежда и обувь›Подарки и сувениры›Продукты питания›Спорт, туризм и отдых›Строительство, ремонт, инструменты›Товары для животных›ТСЖ, ЖСК›Украшения, аксессуары, подарки›Электроника и бытовая техника›Универсальные›
    Все готовые сайты →
  • 1С Битрикс
    Старт (7 100 ₽)›Стандарт (20 500 ₽)›Малый бизнес (47 000 ₽)›Бизнес (96 500 ₽)›Интернет-магазин + CRM (109 000 ₽)›Продление лицензии›Переход на другую редакцию›Сравнить редакции›
  • CRM
  • Контакты
ПРОГРАММИСТ 1С-БИТРИКС
ПРОГРАММИСТ 1С-БИТРИКС
О себе
Услуги
Портфолио
Готовые сайты
1С Битрикс
CRM
Контакты
ПРОГРАММИСТ 1С-БИТРИКС
ПРОГРАММИСТ
1С-БИТРИКС
SNG-IT.RU
  • Главная
  • О себе
  • Услуги
    • Назад
    • Услуги
    • Обновление сайтов на 1С-Битрикс
    • Поиск и удаление вирусов
    • Создание сайтов
    • Интеграция сайта с 1С
    • Композитный сайт
    • Внутренняя оптимизация сайта
    • Доработка сайтов
    • Импорт каталога из файла поставщика
    • Перенос сайта на 1С Битрикс
    • Парсинг контента
    • Установка готового сайта
    • Купить лицензию 1С Битрикс
    • Битрикс 24
    • Выгрузка товаров в Яндекс.Маркет
    • Настройка служб доставки
    • Интеграция с соцсетями
    • Заказ на Маркете
    • Перевод сайта на https
    • Сопровождение сайтов на 1С Битрикс
    • Настройка платежных систем
  • Портфолио
  • Готовые сайты
    • Назад
    • Готовые сайты
    • Недвижимость
    • Медицина
    • Ресторанный бизнес
    • Автомобили и автозапчасти
    • Бухгалтерские и юридические услуги
    • Государство
    • Детские товары
    • Красота и здоровье
    • Мебель, интерьер, декор
    • Образование
    • Одежда и обувь
    • Подарки и сувениры
    • Продукты питания
    • Спорт, туризм и отдых
    • Строительство, ремонт, инструменты
    • Товары для животных
    • ТСЖ, ЖСК
    • Украшения, аксессуары, подарки
    • Электроника и бытовая техника
    • Универсальные
    • Разное
  • 1С Битрикс
    • Назад
    • 1С Битрикс
    • Старт (7 100 ₽)
    • Стандарт (20 500 ₽)
    • Малый бизнес (47 000 ₽)
    • Бизнес (96 500 ₽)
    • Интернет-магазин + CRM (109 000 ₽)
    • Продление лицензии
    • Переход на другую редакцию
    • Сравнить редакции
  • CRM
  • Контакты
  • Личный кабинет
Связаться
M MAX Telegram
+7 (904) 589-06-04 info@sng-it.ru
VK

Почему Метрика теряет покупки: серверная отправка ecommerce в 1С-Битрикс

  • Главная
  • ❶ Блог
  • ❷ Почему Метрика теряет покупки: серверная отправка ecommerce в 1С-Битрикс
Содержание статьи:
  • Почему оформление заказа ещё не означает покупку
  • Почему покупка терялась на странице после оплаты
  • Что изменили: отправляем purchase с сервера
  • Шаг 1. Добавляем два свойства заказа
  • Шаг 2. Сохраняем ClientID при оформлении
  • Шаг 3. Включаем Measurement Protocol
  • Шаг 4. Собираем покупку из заказа
  • Шаг 5. Вызываем отправку при оплате
  • Зачем отмечать успешную отправку
  • Как проверили результат
  • Какие ограничения остаются
  • Что получили после доработки
  • Нужна настройка ecommerce для вашего магазина?
Почему Метрика теряет покупки: серверная отправка ecommerce в 1С-Битрикс

В интернет-магазине заказ оплачен, деньги поступили, а в Яндекс.Метрике покупки нет. Знакомая ситуация? С ней я столкнулся при настройке электронной коммерции на одном из сайтов на 1С-Битрикс.

Нужно было учитывать именно оплаченные заказы. Не нажатия на кнопку «Купить», не переходы в корзину и не просто оформление заказа. В этой статье расскажу, почему отправка покупки из браузера оказалась ненадёжной и как я перенёс её на сервер.

В статье
  1. Почему оформление заказа ещё не означает покупку
  2. Почему покупка терялась на странице после оплаты
  3. Что изменили: отправляем purchase с сервера
  4. Шаг 1. Добавляем два свойства заказа
  5. Шаг 2. Сохраняем ClientID при оформлении
  6. Шаг 3. Включаем Measurement Protocol
  7. Шаг 4. Собираем покупку из заказа
  8. Шаг 5. Вызываем отправку при оплате
  9. Зачем отмечать успешную отправку
  10. Как проверили результат
  11. Какие ограничения остаются
  12. Что получили после доработки
  13. Нужна настройка ecommerce для вашего магазина?

Почему оформление заказа ещё не означает покупку

Сначала попробовали использовать официальный модуль Яндекс.Метрики для 1С-Битрикс. Для обычных целей — клика, отправки формы или посещения страницы — можно подобрать стандартную настройку. Но для нашей задачи этого оказалось недостаточно.

Здесь есть важный момент. В изученной версии модуля обработчик ecommerce-покупки был. Он регистрировал purchase при создании нового заказа, без проверки оплаты. Поэтому говорить, что модуль вообще не поддерживает покупки, было бы неправильно. Нам не подходил момент отправки события.

Та же проблема возникала, если отправлять покупку собственным кодом на checkout сразу после оформления заказа. Покупатель может выбрать оплату картой, перейти в банк и ничего не оплатить. Заказ в Битриксе уже есть, но деньги ещё не поступили.

В этой настройке ecommerce-покупкой мы решили считать полную оплату заказа. Для магазина с оплатой при получении или частичными платежами правило нужно выбирать отдельно.

Оплата прошла, событие потеряно

Почему покупка терялась на странице после оплаты

Следующий вариант выглядел логично: дождаться оплаты и отправить purchase, когда покупатель вернётся с эквайринга на сайт.

На итоговой странице проверялся результат платежа и выводилось сообщение, что заказ успешно оплачен. Если Битрикс подтверждал оплату, браузер добавлял данные покупки в dataLayer.

Но в этой схеме было несколько зависимостей. Покупателю нужно вернуться на сайт, дождаться загрузки страницы, получить подтверждённый статус и дать JavaScript-коду выполниться. После этого данные ещё должны дойти до Метрики.

Покупатель может закрыть вкладку сразу после оплаты. Редирект из банка может не завершиться. Страница может открыться раньше, чем обновится статус заказа. Наконец, запросу аналитики могут помешать расширение браузера, настройки приватности или проблемы соединения.

Это возможные причины потерь, а не установленный диагноз для каждого заказа. Но общий недостаток понятен: деньги уже поступили, а учёт покупки всё ещё зависит от браузера покупателя.

Ожидание статуса и повторная загрузка страницы помогали только частично. Если человек вообще не вернулся, выполнять код было негде.

Почему Метрика теряет покупки: серверная отправка ecommerce в 1С-Битрикс

Что изменили: отправляем purchase с сервера

Я перенёс отправку покупки в обработчик изменения оплаченности заказа в 1С-Битрикс. Теперь данные передаются через Measurement Protocol — механизм серверных запросов Яндекс.Метрики.

Последовательность получилась такой:

  1. При оформлении заказа сохраняем ClientID Метрики в свойство заказа.
  2. Платёжный модуль получает подтверждение банка и устанавливает оплату в Битриксе.
  3. Срабатывает событие OnSaleOrderPaid.
  4. Обработчик берёт ClientID, сумму, валюту и товары из заказа.
  5. Сервер отправляет ecommerce-событие purchase в Метрику.
  6. После подтверждённого приёма запроса отмечаем результат отправки в заказе.

Счётчик на сайте продолжает работать: собирать визиты, источники переходов и другие действия. На сервер перенесли именно событие покупки.

Отдельно нужно проверить уведомления банка. Если оплата устанавливается только при открытии итоговой страницы, одной замены аналитики недостаточно. Битрикс должен узнавать об оплате независимо от возвращения покупателя. В нашем случае этот сценарий проверили.

Шаг 1. Добавляем два свойства заказа

В административной части Битрикса создали служебные свойства:

Код свойстваТипДля чего нужно
YM_CLIENT_IDСтрокаСохранить идентификатор посетителя Метрики
YM_PURCHASE_SENTДа/НетОтметить, что запрос покупки принят Метрикой

Оба свойства необязательные. Если в магазине несколько типов плательщиков, свойства нужно добавить для каждого используемого типа.

ClientID сохраняем строкой: переводить длинный идентификатор в число не требуется. Второе свойство хранит Y или N. Это техническая отметка в Битриксе, отдельную цель для неё в Метрике создавать не нужно.

Шаг 2. Сохраняем ClientID при оформлении

В нашем варианте ClientID берётся из cookie _ym_uid и записывается перед первым сохранением заказа:

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeSaved',
    static function (\Bitrix\Main\Event $event) {
        $order = $event->getParameter('ENTITY');
        $clientId = $_COOKIE['_ym_uid'] ?? '';

        if ($order->getId() || !is_string($clientId) || $clientId === '') {
            return;
        }

        foreach ($order->getPropertyCollection() as $property) {
            if ($property->getField('CODE') === 'YM_CLIENT_ID') {
                $property->setValue($clientId);
                break;
            }
        }
    }
);

Битрикс сохранит свойство вместе с заказом. Вызывать $order->save() внутри этого обработчика не нужно.

К моменту оформления cookie уже должна существовать. Если Метрика заблокирована с первого посещения или её запуск зависит от ещё не полученного согласия, ClientID может отсутствовать. Серверная отправка не создаёт задним числом потерянную историю посетителя.

Хранить ClientID только в сессии недостаточно. Уведомление банка приходит отдельным запросом, без браузерной сессии покупателя. Поэтому идентификатор должен оставаться в самом заказе.

Шаг 3. Включаем Measurement Protocol

В настройках нужного счётчика включаем Measurement Protocol и получаем его секретный токен. Токен хранится на сервере, в настройках интеграции. Передавать его в JavaScript страницы не нужно.

Для ecommerce-покупки не нужен отдельный ID JavaScript-цели. Мы передаём pa=purchase, а не вызываем reachGoal. Не стоит также путать этот способ с отдельным импортом офлайн-конверсий или заказов из CRM: это разные механизмы Метрики.

Ниже — основные фрагменты логики. Это не готовый модуль для установки: подключение класса, обработка ошибок и сохранение служебного флага зависят от реализации сайта.

Шаг 4. Собираем покупку из заказа

В отдельном PHP-классе сделали метод sendPurchase($orderId). Он загружает заказ, проверяет оплату и читает YM_CLIENT_ID. Основные параметры запроса выглядят так:

$data = [
    'tid' => $counterId,
    'ms'  => $token,
    'cid' => $clientId,
    't'   => 'event',
    'pa'  => 'purchase',
    'ti'  => 'Заказ№' . $order->getField('ACCOUNT_NUMBER'),
    'tr'  => $order->getPrice(),
    'cu'  => $order->getCurrency(),
    'dl'  => $siteUrl,
];

$siteUrl — настроенный адрес магазина. Реальные адреса, идентификаторы счётчика и данные клиента в примерах не публикую. Формат ti нужно выбрать один раз и использовать одинаково во всех источниках покупки.

Товары берём из сохранённой корзины заказа:

$i = 1;

foreach ($order->getBasket() as $item) {
    $data['pr' . $i . 'id'] = $item->getProductId();
    $data['pr' . $i . 'nm'] = $item->getField('NAME');
    $data['pr' . $i . 'pr'] = $item->getPrice();
    $data['pr' . $i . 'qt'] = $item->getQuantity();
    $i++;
}

Так в отчёт попадает состав оформленного заказа с его ценами. Текущая цена в каталоге могла уже измениться. При необходимости дополнительно передаются категории, бренды и купоны.

Затем PHP-клиент делает POST-запрос на адрес приёма Measurement Protocol. Массив параметров преобразуется в тело запроса:

http_build_query($data, '', '&', PHP_QUERY_RFC3986)

Шаг 5. Вызываем отправку при оплате

Начало обработчика выглядит так:

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderPaid',
    static function (\Bitrix\Main\Event $event) {
        $order = $event->getParameter('ENTITY');

        if (!$order->isPaid()) {
            return;
        }

        // Здесь проверяем YM_PURCHASE_SENT.
        // Если значение Y, повторно покупку не отправляем.

        $result = FrhtMetrica::sendPurchase($order->getId());

        // Сохраняем результат в YM_PURCHASE_SENT.
        // Обрабатываем исключения, чтобы не прерывать оплату.
    }
);

Это сокращённый фрагмент обработчика. Метод класса подключается заранее, а проверка и запись флага находятся в полном коде интеграции.

OnSaleOrderPaid связан с изменением оплаченности. Обычное редактирование комментария или адреса доставки само по себе отправку не запускает. Проверка isPaid() нужна потому, что изменение может происходить и в обратную сторону — при снятии оплаты.

Способ установки оплаты при этом может быть разным: уведомление банка, оплата из личного кабинета или ручная отметка администратора. В последнем случае важно, чтобы сотрудник действительно подтверждал полученные деньги. Отдельного знания о банковской операции у Метрики нет.

Зачем отмечать успешную отправку

Если снять оплату и поставить её повторно, событие сработает ещё раз. Поэтому перед запросом проверяем свойство YM_PURCHASE_SENT.

После ответа HTTP 200 и успешного завершения HTTP-запроса записываем Y. Если подтверждения приёма нет — N и сведения об ошибке в журнал. Служебное значение обновляем без повторного сохранения всего заказа внутри события оплаты.

Флаг помогает пропускать повторные последовательные отправки, но не является полной защитой от дублей. Два параллельных запроса требуют блокировки. А тайм-аут не доказывает, что Яндекс не получил данные: иногда теряется только ответ. В такой ситуации перед повтором нужна проверка.

На этом этапе оставили прямую отправку из обработчика, без cron. У решения есть цена: пока Метрика отвечает, обработка текущего запроса ждёт. Поэтому задали сетевые тайм-ауты. Если магазину потребуются автоматические повторы и независимость от скорости внешнего сервиса, следующим шагом будет очередь отправок.

Как проверили результат

Сначала отправили покупку по ID с закрытой тестовой страницы. Сервер вернул HTTP 200 и ответ <!-- OK -->.

Но останавливаться на этом нельзя. Ответ API подтверждает приём запроса; результат нужно проверить в отчёте. В нашем случае тестовый заказ на 10 рублей появился в отчёте «Содержимое заказов» с товаром и суммой покупки.

Для проверки собственной интеграции я бы прошёл такую последовательность:

  1. Оформить заказ и проверить заполнение YM_CLIENT_ID.
  2. Убедиться, что покупка не отправляется до оплаты.
  3. Оплатить заказ, не возвращаясь на итоговую страницу сайта.
  4. Проверить оплату в Битриксе и результат серверного запроса.
  5. Найти покупку в Метрике по её ID, сумме и составу товаров.
  6. Проверить сохранение YM_PURCHASE_SENT и пропуск уже отправленного заказа.

Перед тестом нужно отключить прежние источники purchase: собственный код на checkout, код на странице результата и регистрацию покупки при создании заказа в модуле. Иначе один заказ может попасть в аналитику несколько раз.

Для серии тестов лучше использовать отдельный счётчик. Небольшая сумма в рабочем счётчике тоже меняет число покупок и конверсию. В отчётах также стоит сравнивать одинаковые периоды, сегменты и режим учёта роботов.

Какие ограничения остаются

Серверная отправка убирает зависимость от возврата на итоговую страницу, но сама по себе не гарантирует учёт каждой оплаты.

Поздняя оплата. Для дополнения существующего визита через Measurement Protocol действует окно 12 часов после его завершения. При отсутствии подходящего визита может потребоваться сначала создать новый запросом pageview. Это отдельная логика: она не восстанавливает автоматически прежний рекламный источник. Для других сценариев рассматривают импорт офлайн-данных.

Поэтому оплата из личного кабинета через несколько дней действительно вызовет обработчик Битрикса, но попадание покупки в нужный визит нужно обеспечить отдельно. Обещать, что любая поздняя оплата автоматически учтётся правильно, нельзя.

Нет ClientID. Если идентификатор не сохранился, нашему методу нечем связать заказ с посетителем. Такие случаи нужно отслеживать, а не подставлять случайное значение.

Возвраты и отмены. Переданный purchase отражает факт покупки по выбранному правилу. Последующее удаление заказа в Битриксе не отменяет событие в Метрике. Учёт возвратов и итоговой выручки требует отдельного решения.

Что получили после доработки

Отправка ecommerce-покупки теперь запускается по факту оплаты в Битриксе. Покупателю не нужно ждать выполнения аналитики на странице «Спасибо за заказ». В заказе остаются ClientID и отметка о принятом запросе, а саму отправку можно проверить по журналу и отчёту Метрики.

Тест подтвердил, что серверный запрос передаёт покупку с товарами и суммой. Процент восстановленных конверсий я здесь не привожу: для него нужна отдельная сверка оплаченных заказов и данных аналитики за период.

Нужна настройка ecommerce для вашего магазина?

Если оплаченные заказы расходятся со статистикой Яндекс.Метрики, можно начать с проверки текущей настройки. Посмотрю, где отправляется purchase, как сайт получает подтверждение банка, сохраняется ли ClientID и нет ли нескольких источников одной покупки.

Помогу настроить серверную отправку конверсий для интернет-магазина на 1С-Битрикс, проверить результат и разобрать нестандартные сценарии оплаты.

Можно обсудить задачу и получить консультацию или обратиться по техническому сопровождению сайта.


Материал подготовлен по практической доработке интернет-магазина. Технические ограничения сверены с документацией на 28 октября 2026 года.

Полезные материалы: Measurement Protocol, параметры серверных запросов, событие оплаты заказа в Битриксе.


27.10.2026

Семен Голиков.

Время на чтение:  7 мин

Получите консультацию специалиста
Семен Голиков
Семен Голиков
telegram @sng24
Cертифицированный программист 1С Битрикс

У меня Вы можете заказать программные работы или проконсультироваться по сайту.

C 2010 года разрабатываю и поддерживаю сайты на 1С Битрикс. Являюсь Золотым партнером компании 1С Битрикс и имею компетенции: Интеграция с 1С, Композитный сайт, Битрикс24, а также все сертификаты специалиста.

Золотой партнер компании 1С БитриксКомпетенция партнера - Интеграция с 1СКомпетенция партнера - Композитный сайтКомпетенция партнера - Битрикс 24Участник программы качества внедрений


info@sng-it.ru
+7 (904) 589-06-04

Поделиться:
Назад к списку
Материалы
  • Услуги
  • Блог
  • Видеоуроки
  • Скидки на 1C Битрикс
  • Новости интернета
  • Снипеты
Обновление 1С-Битрикс PHP и MySQL · Совместимость Поиск и удаление вирусов Проверка · Очистка · Защита Онлайн-чат Jivo Подключение и настройка на сайте
Аудит сайта Записаться на техподдержку
Читайте также
Как продлить домен на Timeweb и сэкономить Как продлить домен на Timeweb и сэкономить Переход 1С-Битрикс на PHP 8.2 и MySQL 8 в 2026 году Переход 1С-Битрикс на PHP 8.2 и MySQL 8 в 2026 году Как перенести видео с Youtube на Rutube или Vkontakte Как перенести видео с Youtube на Rutube или Vkontakte Проблема регистрации ботов на сайте Проблема регистрации ботов на сайте Подключаем Jivo Chat на сайт Подключаем Jivo Chat на сайт

Программист 1С-Битрикс — Семён Голиков
Программист 1С-Битрикс
разработка · доработка · техподдержка
Работаю с 1С-Битрикс с 2010 года
Есть задача по 1С-Битрикс?
Выберите удобное время в календаре техподдержки.
Выбрать времяНаписать в Telegram
Услуги
Доработка сайтовСопровождение сайтовОбновление 1С-БитриксПоиск и удаление вирусовИнтеграция с 1СХостинг для битрикса
Проекты и продукты
ПортфолиоГотовые сайтыЛицензии 1С-БитриксБитрикс24Отзывы
Материалы
БлогСниппетыВидеоурокиОптимизация сайтаАкции
Связаться со мной
+7 (904) 589-06-04Позвонитьinfo@sng-it.ruНаписать на e-mail
Telegram M MAX
Обычно отвечаю в течение дня
© 2010-2026 Семён Голиков · программист 1С-Битрикс
Политика конфиденциальностиОбработка персональных данныхКарта сайта
VK
Спасибо за заявку!
Мы свяжемся с Вами в ближайшее
время и ответим на все вопросы.
Заполните форму и отправьте
заявку на консультацию!