У события несколько владельцев
O-17 отправлен из GTM, кода сайта и при перезагрузке. Оставить один согласованный путь отправки и защитить его от повторной обработки оплаты.
Четыре оплаченных заказа. Семь отправок purchase. И только один заказ проходит строгую сверку с первого раза.
Открыть журнал событий ↓Если измерение сломано, оптимизация рекламы может усиливать ошибку.
В этом сценарии сначала сверяем события с реестром заказов. Затем определяем дефекты и критерии приёмки исправлений. Результат — понятный план восстановления измерения.
Не менять бюджет на основании дефектного потока purchase. Для оценки оплаченных заказов использовать сверенный реестр с согласованными правилами учёта.
«После» — ожидаемый журнал в исправленной модели. Это локальная демонстрация, а не результат внедрения или отчёт из GA4.
| Событие | transaction_id | value | currency | Источник | Проверка |
|---|
| Заказ | Статус | Стоимость товаров, ₽ |
|---|
4 оплаченных заказа на 18 400 ₽. O-21 ожидает оплаты и не входит в выручку. В тесте доставка, налоги и скидки равны нулю.
Сверенный заказ: ровно одно событие с совпадающими ID, суммой и валютой. Это строгий критерий качества отправки, а не правило подсчёта покупок в GA4. Числа в value с разными валютами не суммируем.
В веб-потоках GA4 использует transaction_id для дедупликации покупок. Поэтому журнал отправок сам по себе не показывает, какой окажется выручка в отчёте. Пустой ID также недопустим: документация отдельно предупреждает о дедупликации событий с пустой строкой.
Здесь проверен локальный журнал. Фактические покупки и выручку в GA4 нужно проверять отдельно после обработки данных.
Правила transaction_id в документации Google ↗O-17 отправлен из GTM, кода сайта и при перезагрузке. Оставить один согласованный путь отправки и защитить его от повторной обработки оплаты.
E3 не проходит контракт. Отправку с пустым ID блокировать, причину фиксировать в техническом журнале.
У E3 value=490 000 вместо 4 900. Связь с O-17 известна из тестового контекста, не из transaction_id. Привести единицы до формирования события.
O-19 оплачен, события нет. Проверить цепочку подтверждения оплаты и доставки события. Причина пропуска этим набором не установлена.
O-20: значение суммы совпадает, валюта — нет. Брать её из того же источника, что и стоимость заказа.
O-21 ещё не оплачен. По контракту этого магазина purchase отправляется только после подтверждения оплаты.
P1 — блокирует использование этого потока для решений о выручке в рамках кейса. Приоритеты для реальной системы согласуются с командой. Семь замечаний — не семь независимых ошибок выручки.
После подтверждённого перехода заказа в статус paid. Не по клику на кнопку и не просто при открытии страницы «Спасибо».
ID, валюту, товары и суммы — из подтверждённого заказа. value согласовать с суммой price × quantity товаров; доставку и налог передавать отдельно, если они есть.
Один владелец отправки. Устойчивая идемпотентность по заказу в выбранной архитектуре. Для повторных попыток сохранять тот же ID; не генерировать новый.
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'O-17',
value: 4900,
currency: 'RUB',
items: [{
item_id: 'SKU-17',
item_name: 'Товар A',
price: 4900,
quantity: 1
}]
}
});Пример payload для GTM. Он не реализует подтверждение оплаты, доставку события и защиту от повторов.
Он ограничен браузером, может быть очищен и не решает повторные уведомления платёжной системы. Сама отправка в сеть и её подтверждение также могут расходиться. Поэтому проектируют идемпотентную обработку, журнал попыток, повторы и последующую сверку; обещание «ровно одна доставка» здесь не даётся.
| Проверка перед релизом | Ожидаемое поведение |
|---|---|
| Успешная оплата | Один корректный purchase; ID, сумма, валюта и товары совпадают с заказом |
| Перезагрузка и повторный вход на «Спасибо» | Не создают новую покупку и новый transaction_id |
| Повторное уведомление об оплате | Идемпотентная обработка; при повторе доставки используется прежний ID |
| Отказ или ожидание оплаты | purchase не отправляется по контракту сценария |
| Пустой ID или неверные единицы | Валидация отклоняет payload; есть диагностическая запись |
| Два разных оплаченных заказа | Два разных ID; второй заказ не подавляется |
| Тест браузера, согласия и сетевого сбоя | Поведение соответствует настройкам согласия; потери и повторы наблюдаемы |
| Сверка после обработки в GA4 | Проверены покупки и выручка в согласованном окне; расхождения объяснены |
Локальные проверки модельного журнала: повторы, ID, сумма, валюта, статус оплаты и пропущенные заказы. Исправленный набор проходит их без замечаний.
Следующий шаг в реальном проектеGTM Preview → сетевые запросы → DebugView → обработанные отчёты и сверка с backend. Эти проверки на реальном ресурсе в кейсе не выполнялись.
Сохраните четыре файла в одну папку и выполните node verify.mjs (Node.js 18+). Валидатор используется и в интерактивном журнале на этой странице.
Синтетическая закрытая выборка, один завершённый интервал теста, без задержек и часовых сдвигов. В реальной сверке нужно согласовать окно, статусы, налоги, доставку, скидки, возвраты, валюты, доступность измерения и задержки обработки. Не все заказы обязаны наблюдаться в браузерной аналитике: блокировки и настройки согласия требуют отдельного учёта.
Строки after заданы как эталон. Это не восстановление потерянных событий и не автоматическое исправление истории GA4. Валидатор проверяет ограниченный контракт сверки; это не универсальный валидатор всех параметров GA4.