Если ваш сайт публикует деловые события в window.dataLayer (потому что вы настроили Google Tag Manager под Google Analytics), эти события уже доходят до Skomi. Переписывать нечего, никакого переходника ставить не надо, и вторую отправку рядом с первой добавлять тоже.

Эта страница о том, что происходит, что не происходит и какие пределы стоит знать, прежде чем на это полагаться.

Делать ничего не надо

Поставьте сниппет. Skomi подцепляется к dataLayer и читает то, что туда отправляют.

Работают обе формы:

// форма с объектом
dataLayer.push({ event: 'purchase', value: 49.00, currency: 'EUR' });

// gtag, который отправляет свои аргументы, а не объект
gtag('event', 'purchase', { value: 49.00, currency: 'EUR' });

GTM можно оставить. Google Analytics можно оставить работать рядом со Skomi, пока вы их сравниваете, — это разумный способ переезжать, и здесь ничто ему не мешает.

Почему это работает, какой бы скрипт ни загрузился первым

GTM заменяет dataLayer.push своей обёрткой, когда gtm.js догружается, и оба скрипта загружаются асинхронно. Тот, что приземлился вторым, попросту переписал бы обёртку другого и тихо проглотил бы его события.

Skomi ставит push как свойство с доступом, поэтому присваивание от GTM приходит в сеттер и становится той функцией, которой Skomi делегирует. Наша остаётся впереди, как бы гонка ни разрешилась. Порядок ваших тегов значения не имеет.

Что захватывается

Имя событияevent в объекте или второй аргумент gtag.

Каждое свойство, разложенное в пути через точку, потому что свойства события хранятся как текст:

dataLayer.push({
  event: 'purchase',
  transaction_id: 'ORD-1234',
  value: 49.00,
  currency: 'EUR',
  ecommerce: { items: [{ item_name: 'Pro plan', price: 49.00 }] }
});

приходит как transaction_id, value, currency, ecommerce.items.0.item_name, ecommerce.items.0.price.

Денежная величина, читаемая из value или из ecommerce.value. Строки принимаются, потому что значения в dataLayer часто приходят из шаблона текстом.

Валюта, из currency или ecommerce.currency, тем же способом. Событие магазина в GA4 и так несёт { value, currency } вместе, поэтому сайт, настроенный под Google, шлёт Skomi полностью оценённую покупку, сам того не зная.

Номер заказа. Сервер читает transaction_id из свойств, и повтор того же номера отбрасывается, а не считается, а это важнее, чем звучит. Страница подтверждения срабатывает при каждой загрузке: обновление, кнопка «назад», повторное открытие письма через неделю. Без номера заказа это три продажи.

Что не захватывается

Собственные события жизненного цикла GTM. Всё в пространстве имён gtm. и ключи, которыми GTM управляет собственной отправкой: event, eventCallback, eventTimeout, eventModel, _clear. О вашем деле они не говорят ничего и превосходили бы настоящие события в несколько раз.

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

Ограничение Значение
Свойств на событие 25
Глубина вложенности 3 уровня
Имя свойства 64 символа
Значение свойства 255 символов
Номер заказа 128 символов

Большой массив ecommerce.items не поместится. Каждая позиция даёт несколько свойств, поэтому заказ из десяти позиций заметно превосходит двадцать пять, и остаток отбрасывается, а не обрезается по позициям. Если подробности по позициям для вас важны, им место в отчётности вашего магазина: Skomi записывает заказ, его сумму и его валюту, а не его содержимое. Измерения товара нет нигде в продукте.

Собственные интеграции Google. Сигналы Consent Mode, выгрузка аудиторий, связка с Google Ads. Это дела между GTM и Google, и Skomi в них не участвует.

Где события появляются

Под своими именами, рядом с теми, что Skomi захватывает сам. У каждого события записано, откуда оно пришло: datalayer для этих, api для написанного руками вызова skomi.track(), auto для внешних ссылок и скачиваний, которые Skomi захватывает без просьбы, так что вы отличите событие, которое запросили, от того, которое просто разрешили.

Превратите любое из них в цель, чтобы получить по нему конверсию.

Если вы предпочитаете вызывать напрямую

skomi.track('purchase', { plan: 'pro' }, 49.00, 'EUR', 'ORD-1234');

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

Как проверить, что сработало

Отправьте тестовое событие из консоли на настоящем домене:

dataLayer.push({ event: 'test_event', value: 1, currency: 'EUR' });

Потом поищите test_event в своих событиях. Если его там нет, пройдите что проверить, когда сниппет не работает, и учтите, что с localhost не собирается ничего, потому что это не тот домен, который вы зарегистрировали.