Если ваш сайт публикует деловые события в 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 записывает заказ, его сумму и его валюту, а не его содержимое. Измерения «товар» в 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 не собирается ничего, потому что это не тот домен, который вы зарегистрировали.