Google Analytics видит заказ в момент оформления, а RetailCRM — на всех последующих статусах. Связав их, вы получаете в GA4 не «заявки», а подтверждённую выручку с учётом отказов, возвратов и офлайн-продаж.
Зачем связывать RetailCRM и GA4
Стандартный электронный отчёт GA4 фиксирует событие purchase прямо на сайте — в момент, когда покупатель нажал «Оформить заказ». Но в рознице и e-commerce до 20–40% таких заказов позже отменяются, дублируются или частично возвращаются. RetailCRM хранит финальный статус каждого заказа, поэтому именно она — источник правды о деньгах.
- Очищенная выручка — в GA4 попадают только оплаченные и выполненные заказы.
- Офлайн- и телефонные заказы — созданные оператором вручную, они тоже уходят в аналитику с привязкой к источнику.
- Корректная атрибуция — UTM-метки и
client_id, собранные на сайте, сохраняются в заказе и связывают продажу с рекламным каналом.
Как устроена передача данных
Работают две независимые точки сбора, которые затем сшиваются по идентификатору пользователя:
- Сайт → GA4. На витрине стоит тег GA4 (gtag.js или через GTM), он пишет
dataLayerс событиями просмотра товара, добавления в корзину и оформления. - RetailCRM → GA4. Когда заказ достигает нужного статуса, из CRM уходит серверное событие
purchaseчерез Measurement Protocol.
Ключ к сшивке — параметр client_id (идентификатор устройства в GA4). Его нужно перехватить на сайте из cookie _ga и записать в кастомное поле заказа RetailCRM. Тогда серверное событие «приклеится» к той же сессии, что и клики по рекламе.
| Слой | Что передаёт | Механизм |
|---|---|---|
| Витрина | view_item, add_to_cart, begin_checkout | gtag / GTM |
| RetailCRM | purchase (финальный статус) | Measurement Protocol |
| Связка | client_id, session_id | кастомное поле заказа |
Перехват client_id на сайте
Cookie _ga имеет вид GA1.2.1234567890.1680000000 — реальный client_id это последние две группы через точку. Небольшой скрипт достаёт значение и кладёт его в скрытое поле формы заказа:
var m = document.cookie.match(/_ga=GA\d\.\d\.(\d+\.\d+)/); if (m) document.querySelector('[name=ga_client_id]').value = m[1];
Далее это значение через API RetailCRM пишется в кастомное поле заказа (например, customFields[ga_client_id]). Для заказов, созданных оператором по телефону, поле останется пустым — такие продажи уйдут в GA4 без клиентской атрибуции, но с корректным источником из карточки.
Отправка purchase через Measurement Protocol
GA4 принимает серверные события по протоколу Measurement Protocol. Понадобятся два параметра из интерфейса GA4: measurement_id (раздел «Потоки данных») и api_secret (создаётся там же, в «Measurement Protocol API secrets»).
Событие отправляется POST-запросом при переходе заказа в целевой статус. Тело запроса содержит client_id и блок ecommerce:
POST https://www.google-analytics.com/mp/collect?measurement_id=G-XXXX&api_secret=SECRET
{ "client_id": "1234567890.1680000000", "events": [{ "name": "purchase", "params": { "transaction_id": "10245", "value": 5400, "currency": "RUB", "items": [{"item_id":"SKU-1","item_name":"Товар","price":2700,"quantity":2}] } }] }
Триггером служит смена статуса заказа. Отправку удобно вешать на веб-хук RetailCRM или на внешний сервис-посредник, который слушает изменения и формирует запрос.
Выбор статуса и защита от дублей
Главный вопрос — на каком статусе считать заказ «покупкой». Слишком рано — вернутся отказы; слишком поздно — GA4 отбросит событие по давности.
- Рекомендуемый статус — «Оплачен» или «Комплектация/отгружен», а не «Новый».
- Окно давности — Measurement Protocol принимает события не старше 72 часов относительно времени сессии. Для длинного цикла сделки это ограничение критично.
- Защита от повторов — фиксируйте флаг «отправлено в GA4» в кастомном поле, чтобы повторная смена статуса не задвоила транзакцию.
| Сценарий | Статус-триггер | transaction_id |
|---|---|---|
| Предоплата | Оплачен | номер заказа |
| Постоплата | Выполнен | номер заказа |
| Возврат | Отменён | refund-событие |
refund с тем же transaction_id — тогда выручка в отчётах корректируется автоматически.UTM-метки и источники заказа
RetailCRM автоматически сохраняет источник заказа в поле order.source — там оседают utm_source, utm_medium, utm_campaign, utm_term и utm_content, если на сайте установлен трекер RetailCRM (daemon).
Это даёт два уровня аналитики. В самой CRM вы строите отчёты по каналам и кампаниям без выгрузки. А в GA4 источник восстанавливается через client_id — событие purchase приклеивается к исходной сессии с её utm-атрибуцией. Данные не дублируют, а дополняют друг друга: CRM отвечает за деньги и маржу, GA4 — за путь пользователя и поведенческие метрики.
- Проверьте, что трекер RetailCRM установлен на всех страницах, включая корзину.
- Не переопределяйте UTM внутренними переходами по сайту — используйте
referral exclusionsв GA4.
Итог
Связка RetailCRM и GA4 превращает веб-аналитику из «счётчика заявок» в инструмент оценки реальной прибыли: очищенная выручка, офлайн-заказы, корректная атрибуция по client_id и UTM. Технически это перехват идентификатора на сайте, запись его в заказ и серверная отправка события purchase через Measurement Protocol на нужном статусе с защитой от дублей.
Мы настраиваем такую передачу под вашу статусную модель, подключаем трекер, разбираемся с окном давности и возвратами, а затем собираем на этих данных понятные дашборды. Если нужно связать CRM с рекламной аналитикой и BI без потерь — поможем сделать это аккуратно и проверяемо.
Частые вопросы
Не задвоится ли выручка, если событие есть и на сайте, и из CRM?
Задвоится, если на сайте тоже стоит purchase. Правильная схема — убрать серверное дублирование: на витрине оставить только поведенческие события, а транзакцию purchase отправлять исключительно из RetailCRM по финальному статусу.
Что делать с заказами, у которых нет client_id?
Телефонные и офлайн-заказы уходят в GA4 без клиентской сшивки, но с источником из карточки. Их можно помечать отдельным каналом, чтобы отличать от онлайн-продаж в отчётах.
Почему GA4 не принимает часть событий?
Чаще всего срабатывает ограничение Measurement Protocol в 72 часа: событие с временем сессии старше этого окна отбрасывается. Для длинного цикла сделки выбирайте более ранний статус-триггер.
Нужен ли для интеграции Google Tag Manager?
На сайте GTM удобен для поведенческих событий и перехвата client_id, но не обязателен — подойдёт и gtag.js. Серверная отправка purchase из RetailCRM от GTM не зависит вовсе.
Как учитывать возвраты и отмены?
Отправляйте событие refund с тем же transaction_id при переходе заказа в статус отмены или возврата. GA4 скорректирует выручку канала автоматически.
Где взять api_secret для Measurement Protocol?
В GA4 в разделе «Администратор → Потоки данных → ваш веб-поток → Measurement Protocol API secrets». Там же указан measurement_id вида G-XXXXXXX.
Сохраняются ли UTM-метки в RetailCRM автоматически?
Да, если на сайте установлен трекер RetailCRM. Он пишет источник в поле order.source, и метки доступны и во внутренних отчётах, и для восстановления атрибуции в GA4.
Поможем с настройкой и поддержкой RetailCRM
Поможем с настройкой, доработкой и поддержкой RetailCRM.