Перейти к содержимому

ГайдыGoogle Analytics 49 мин чтения

GA4 на Shopify: приложение Google & YouTube или кастомный web pixel

Как GA4 получает данные Shopify через приложение Google & YouTube и через кастомный web pixel: названия событий, transaction_id, согласие и что остаётся у вас.

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

Daniil MaximkinРазработка продуктов и интеграций

Короткий ответ

GA4 на Shopify получает данные из одного из двух источников. Первый: приложение Google & YouTube, которое поддерживают Shopify и Google; оно само сопоставляет события Shopify со схемой ecommerce в GA4. Второй: кастомный web pixel, который вы пишете и поддерживаете в Customer Events. Приложение быстрее запустить, но возможностей настройки у него меньше. Код и настройки пикселя полностью под вашим контролем. Если запустить оба, покупки считаются дважды, пока transaction ID не совпадут точно.

Даниил

Главное

  • Приложение Google & YouTube разработано совместно с Google как приложение канала продаж Shopify. Оно сопоставляет стандартные события Shopify с названиями и параметрами событий GA4, включая transaction_id, value, currency и items.
  • В кастомном web pixel в Customer Events вы сами задаёте названия событий, параметры, массив items, transaction_id и правила согласия. За их корректность тоже отвечаете вы.
  • Чекаут Shopify работает в песочнице: web pixels не могут читать DOM и пользоваться dataLayer витрины, а Google указывает, что запуск тегов Google внутри кастомного пикселя не поддерживается.
  • GA4 дедуплицирует покупки с одинаковым transaction_id и предупреждает, что пустой transaction_id схлопывает несвязанные покупки вместе; поэтому два работающих пути покупки обычно раздувают подсчёты.
  • Additional Scripts и checkout.liquid закрыты в пользу Checkout Extensibility; тег покупки, который остался там, перестаёт срабатывать, поэтому миграция сводится к переходу на один из этих двух вариантов.
В этом гайде

У GA4 на Shopify два распространённых способа подключения: приложение Google & YouTube или кастомный web pixel в Customer Events, через который события отправляете вы сами. Оба отправляют данные ecommerce в ваш ресурс GA4. Различаются они тем, кто пишет сопоставление, кто его поддерживает и что вы можете изменить.

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

Если свой пиксель уже выбран и нужно найти сбой, начните с диагностики пикселя Shopify и GTM. Она прослеживает одно событие от Customer Events до получателя. Ниже продолжается сравнение архитектур.

Что на самом деле делает приложение Google & YouTube?

Приложение Google & YouTube разработано совместно с Google как приложение канала продаж Shopify. Оно загружает теги Google в магазин и сопоставляет стандартные события Shopify с рекомендованными названиями ecommerce в GA4, так что покупка попадает в GA4 без написания кода пикселя. Вы его настраиваете; сопоставление поддерживают Shopify и Google.

Оно подписывается на стандартные события Shopify и сопоставляет их с рекомендованными названиями GA4: product_viewed с view_item, product_added_to_cart с add_to_cart, checkout_started с begin_checkout и checkout_completed с purchase; смежные события корзины, списков, доставки и поиска тоже покрыты.

Покупка передаётся как полноценное событие ecommerce в GA4: transaction_id, value, currency, tax, shipping, coupon, market_id и массив items с id, названием, брендом, вариантом, ценой, количеством и SKU. Value равен подытогу за вычетом скидок, без доставки и налогов; если в событии нет валюты, по умолчанию подставляется USD. Каждое событие также содержит shopify_event_name и event_id. Данные покупателя, такие как email и телефон, прикрепляются, только если это разрешают согласие и настройки Analytics.

Вам доступна конфигурация, а не код: вы подключаете свой ресурс GA4 или добавляете тег Google вручную, а внутри GA4 можете фильтровать события по shopify_event_name. Сопоставление, формула value и набор параметров зафиксированы. Google указывает, что поддерживаются не все функции тегов на основе кода из-за ограничений песочницы Shopify.

Покупка показывает и сильную сторону приложения, и его ограничения. Оно срабатывает от checkout_completed, поэтому не зависит от того, работает ли скрипт на странице «Спасибо», но отправляет только то, что определяет схема Google: событие возврата, собственный параметр или ваше определение value лежат за пределами его документированных возможностей.

Что на самом деле делает кастомный web pixel?

Кастомный web pixel вы пишете на JavaScript и добавляете в Customer Events в админке Shopify. Он подписывается на стандартные события Shopify и отправляет в GA4 всё, что вы ему укажете, через gtag или контейнер GTM, загруженный внутри пикселя. Названия событий, параметры, массив items, transaction_id и контроль согласия выбираете вы.

Пиксель работает в песочнице Shopify. Кастомные пиксели загружаются в lax-песочнице (iframe, ограниченный скриптами и формами) и не могут обращаться к верхнему фрейму, читать DOM или пользоваться dataLayer витрины. Взамен вы получаете структурированные данные событий и Standard API Shopify. Код, который ожидает страницу или window.dataLayer, не находит ни того ни другого, поэтому сниппеты, перенесённые из файла темы, ничего не делают.

В песочнице вы решаете всё, что за вас решает приложение: на какие события подписаться, как их назвать, как собрать items и что использовать как transaction_id и value. Подписка на покупку может выглядеть примерно так:

analytics.subscribe('checkout_completed', (event) => {
  const checkout = event.data.checkout;
  gtag('event', 'purchase', {
    transaction_id: checkout.order.id,
    value: checkout.subtotalPrice.amount,
    currency: checkout.currencyCode,
    items: checkout.lineItems.map((item) => ({
      item_id: item.variant?.sku ?? String(item.variant?.id),
      item_name: item.title,
      price: item.variant?.price?.amount,
      quantity: item.quantity,
    })),
  });
});

Согласие подключаете вы. Пиксель может читать init.customerPrivacy и подписываться на visitorConsentCollected, а затем ограничивать то, что отправляет. Shopify и так запускает пиксели в регионах с обязательным согласием только после того, как посетитель дал согласие на нужные цели, и воспроизводит более ранние события; ваши правила дополнительно ограничивают отправку.

Вместе с контролем вы берёте на себя сопровождение. Ничто не обновит ваш пиксель, когда Shopify изменит схему, поэтому сопоставление, тестирование и исправления остаются на вас. К тому же Google указывает, что теги Google внутри кастомного пикселя не поддерживаются, что их поведение он не гарантирует и что его поддержка не может исправлять там проблемы. Это не повод отказываться от пикселя, если он вам нужен. Просто за надёжность тогда отвечаете вы.

Что будет, если запустить оба сразу?

Если запустить приложение и кастомный пиксель, на один заказ придут два события покупки. GA4 дедуплицирует покупки с одинаковым transaction_id, но если два пути отправляют разные или пустые ID, GA4 считает заказ дважды. Пустой transaction_id сливает несвязанные покупки вместе.

Правило у GA4 точное: он схлопывает события покупки с одинаковым transaction_id в веб-потоках, а пустой transaction_id заставляет GA4 дедуплицировать несвязанные покупки вместе. Это помогает, только когда оба пути отправляют один и тот же непустой идентификатор. Но выбирают его они независимо: приложение выводит свой из заказа, а ваш пиксель берёт то, что выбрали вы, поэтому несовпадение случается часто, и GA4 видит два заказа. Решение: оставьте один путь покупки, сначала выключите один путь, потом включите другой и убедитесь в DebugView, что один тестовый заказ даёт одну покупку.

Сравнение вариантов

Таблица сравнивает их по критериям, от которых зависит работа большинства настроек. Это описание компромиссов, а не рейтинг.

КритерийПриложение Google & YouTubeКастомный web pixel (gtag или GTM)
Источник событийСтандартные события Shopify, сопоставленные приложениемВаши подписки на стандартные события Shopify
Покрытие покупок и возвратовДокументированное сопоставление доходит до purchase; корректировка возвратов вне его настраиваемых возможностейВы отправляете purchase и любые события возврата; покрытие определяете вы
ДедупликацияПриложение само генерирует transaction_id и event_idВы выбираете transaction_id и event_id
Обработка согласияРаботает как пиксель под управлением Customer Privacy API Shopify и учитывает заявленные им целиВы сами читаете объект приватности и ограничиваете события
Владение даннымиСопоставление принадлежит Shopify и Google; данные попадают в ваш ресурс GA4Логика принадлежит вам; данные попадают в ваш ресурс GA4
Зависимость и привязка к вендоруЗависит от приложения и канала Shopify, через который оно работаетЗависит от песочницы Shopify и схемы событий
Нагрузка на сопровождениеВендор поддерживает сопоставление по мере изменений платформыВы сопровождаете каждое изменение схемы и параметров
Кому подходитМагазинам, которым нужен ecommerce в GA4 с минимумом кодаМагазинам, которым нужны параметры, события или ограничения, которых в приложении нет

Таблица решений

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

Если ваша ситуация …Выбирайте …
Вам нужны стандартные события ecommerce в GA4, и никто не пишет код пикселяПриложение Google & YouTube
Вам нужно событие, параметр или поле items, которых приложение не отправляетКастомный web pixel
Нужно точно контролировать, что и когда срабатывает под вашим баннером согласияКастомный web pixel с собственным ограничением
Вы уходите с Additional Scripts или checkout.liquid и хотите поддерживаемый путьПриложение Google & YouTube
У вас уже работает кастомный пиксель, и нужно только убрать старый скриптОставьте пиксель и убедитесь, что второй путь покупки не активен
Вы хотите, чтобы сопоставление событий поддерживали за вас по мере изменений чекаута в ShopifyПриложение Google & YouTube
Потери из-за заблокированных или обрезанных запросов, а не из-за сопоставленияНи один сам по себе: см. серверный трекинг

Когда какой вариант не подходит

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

Не берите приложение Google & YouTube, когда:

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

Не берите кастомный web pixel, когда:

  • Им никто не будет заниматься: каждое изменение схемы Shopify превращается в сбой, который ждёт, когда его заметят.
  • Вам нужна конфигурация, которую поддерживает Google. Google указывает, что теги Google в кастомном пикселе не поддерживаются и что его поддержка их не чинит.
  • Вы полагаетесь на Tag Assistant или GTM Preview: они отлаживают теги на странице, а не внутри песочницы пикселя.
  • Вам хватает стандартного сопоставления ecommerce: вы возьмёте на себя сопровождение без выгоды.

Не ждите, что любой из них исправит:

  • Сигнал, потерянный из-за блокировщиков рекламы, закрытых вкладок или отказа от согласия. Это потери при передаче данных. Для них нужна серверная доставка, а не другой тег в браузере.
  • Постоянный разрыв между GA4 и Shopify. Эти две системы считают по-разному; здесь поможет метод сверки, а не пиксель получше.

Как я проверяю это на реальных внедрениях

Я считаю события по каждому заказу. Один путь покупки должен давать одну покупку на заказ, видимую в DebugView с совпадающим transaction_id и сверяемую с выгрузкой заказов Shopify. Всё остальное (согласие, items, валюту) я проверяю на том же заказе.

  1. Определите, какой путь отвечает за покупку. В Settings → Customer events перечислены зарегистрированные пиксели. Найдите каждый, который может отправить покупку; такой должен быть ровно один.
  2. Проследите тестовый заказ в DebugView. Переведите устройство в режим отладки, пройдите чекаут целиком и убедитесь, что purchase приходит с transaction_id, value, currency и items. Проверьте больше одного пути чекаута, прежде чем считать тег неработающим.
  3. Сверьте ключ с заказом. transaction_id, который получил GA4, должен быть непустым, уникальным для этого заказа и одинаковым на каждом пути, который его отправляет.
  4. Сверьте данные рекламных платформ. Там, где участвует Meta, Test Events в Events Manager должен показать одну конверсию на заказ, а не по одной на каждый путь в браузере.
  5. Сверьте на следующий день. Сравните покупки GA4 по transaction_id с выгрузкой заказов Shopify за закрытый период тем же методом сверки заказов, который используется в аудите трекинга.
  6. Проверьте и отказ, и принятие согласия. При отказе убедитесь, что теги остаются заблокированными; затем дайте согласие и убедитесь, что события идут; см. Consent Mode v2.

Типичные сбои

Большинство сбоев типичны: это второй путь покупки, который оставили работать, пустой transaction_id, value, определённый по-разному с каждой стороны, или код в песочнице, который рассчитывал читать страницу.

  • Два пути покупки, два ID. Приложение и пиксель оба срабатывают и отправляют разные значения transaction_id, поэтому GA4 считает заказ дважды.
  • Пустой transaction_id. GA4 дедуплицирует вместе все покупки с ним, поэтому несвязанные заказы объединяются в одну покупку.
  • Value, рассчитанный по другим правилам. Приложение отправляет подытог за вычетом скидок, без доставки и налогов; написанный вручную пиксель, который отправляет итог брутто, не совпадёт ни с отчётностью GA4, ни с нетто-суммой Shopify.
  • Код в песочнице, который рассчитывал читать страницу. Сниппеты, перенесённые из файла темы, молча ничего не делают, потому что в песочнице нет DOM и общего dataLayer.
  • Отладка не тем инструментом. Контейнер GTM в пикселе может выглядеть сломанным в GTM Preview или Tag Assistant: они отлаживают теги на странице, а не внутри песочницы пикселя.
  • Нет контроля согласия в кастомном пикселе. События продолжают уходить для посетителей, которые отказались: это проблема соответствия требованиям, а не предпочтение.
  • Тег всё ещё в Additional Scripts. После перехода на Checkout Extensibility старое поле перестаёт выполняться, и покупка не отправляется, хотя ошибка не показывается.

Ограничения

Ни один вариант не устраняет потери при передаче. Оба зависят от того, что пиксель Shopify работает в браузере, поэтому заказы, потерянные из-за блокировщиков, закрытых вкладок или отказа от согласия, остаются потерянными, пока отправка не будет перенесена на сервер. Кроме того, в обоих случаях GA4 считает иначе, чем Shopify: GA4 атрибутирует сессии, а Shopify записывает заказы, и выбор пикселя эту арифметику не меняет.

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

Альтернативы

Если ваша проблема не в вопросе «какой пиксель», может потребоваться другой способ доставки. Серверная доставка отправляет покупку из вебхука заказа Shopify, а не из браузера, и это надёжный ответ на сигнал, потерянный из-за блокировщиков; см. гайд по серверному трекингу. Импорт офлайн-конверсий покрывает заказы, которых браузер вообще не видел.

Если вы чините сломанную покупку, а не выбираете архитектуру, порядок действий описан в гайде Как исправить событие purchase в GA4 на Shopify. Если симптом в пропавших покупках, растущем разрыве или сломанном чекауте, начните с материалов GA4 не видит покупки, выручка в GA4 не совпадает с Shopify и сломался трекинг чекаута Shopify. Основные понятия: event_id, Consent Mode v2 и first-party трекинг.

Если гайд не решил вопрос25 000 ₽

Я провожу эту сверку на вашем магазине в режиме только чтения, за 25 000 ₽: письменный вывод через два рабочих дня после старта.

Вопросы

Вопросы, на которые отвечает этот гайд

Можно ли просто использовать приложение Google & YouTube вместо кастомного пикселя?

Часто да. Приложение покрывает стандартный путь покупателя в ecommerce, это настройка, которую рекомендует Google, а его сопоставление поддерживают за вас по мере изменений в Shopify. Кастомный пиксель оправдан, когда нужны возможности, которых в приложении нет: параметр, который оно не отправляет, собственное событие, особое определение value или контроль согласия, который вы настраиваете сами. Если приложение уже отправляет всё, что нужно для вашей отчётности, второй путь лишь создаёт риск двойного учёта.

Почему покупки в GA4 удвоились после добавления кастомного пикселя?

Потому что теперь работают два пути покупки. GA4 дедуплицирует покупки, только если у них одинаковый transaction_id, а приложение и ваш пиксель выбирают этот ID независимо друг от друга. Если строки различаются, GA4 видит два заказа; если любой из путей отправляет пустой transaction_id, GA4 вместо этого сливает несвязанные покупки. Отключите один путь и тестовым заказом в DebugView убедитесь, что один заказ даёт одну покупку.

Позволяет ли кастомный web pixel отправлять данные без согласия?

Нет. Кастомные пиксели работают в песочнице Shopify. Они должны читать объект приватности покупателя и ограничивать отправку по применимым целям. В регионах, где настроено обязательное согласие, Shopify запускает пиксели только после того, как посетитель согласился на нужные цели, а затем воспроизводит более ранние события. Если использовать пиксель, чтобы обойти согласие, это нарушение условий платформы и юридическая проблема, а не технический приём. Речь о технической реализации, это не юридическая консультация.

Можно ли загрузить Google Tag Manager внутри кастомного пикселя?

В песочнице он работает, но сначала оцените ограничения. Google указывает, что теги Google, реализованные через кастомный пиксель Shopify, не поддерживаются, что поведение таких тегов он не гарантирует и что его поддержка не может исправлять там проблемы. Tag Assistant и GTM Preview рассчитаны на отладку тегов на странице, а не кода внутри песочницы пикселя, поэтому доказательства придётся брать из DebugView и сверки. Если вам нужен контроль уровня GTM, учитывайте, что тестирование останется за вами.

Daniil Maximkin

Здравствуйте, я Даниил.

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

Попробовали и всё равно не выходит?

Опишите задачу

Отвечу в течение одного рабочего дня. Первый ответ бесплатный. Или напишите напрямую: next@taskfordaniel.com

Обсудить задачу

Расскажите, что нужно разработать, исправить или подключить.

Описать задачу next@taskfordaniel.com