Онлайн-школа продаёт курс по аналитике за 25 000 ₸ со страницы с формой записи, той же, что в уроке про GA4 (цифры в уроке условные). Прошлый подрядчик повесил событие заявки на клик по кнопке «Отправить». За неделю GA4 насчитал 40 заявок с рекламы, а в CRM их 34, и владелец школы спрашивает, каким цифрам верить.
Часть разницы - нажатия, после которых заявка не сохранилась: пустой email, телефон без одной цифры, пропавшая связь в лифте. Остальное могут дать двойные клики и тестовые заявки коллег, а по двум итоговым числам не скажешь, сколько чего. Нажатия без заявки и двойные клики тег на кнопке считает наравне с заявками, и чинится это одним способом: сайт сам сообщает о заявке, когда сервер её принял, а Google Tag Manager передаёт это сообщение в GA4. Разберём, как это собрать и как проверить, прежде чем показывать цифры клиенту.

Как устроен GTM
GTM не хранит заявки и не строит отчётов. Он решает, какой код и в какой момент запустить на сайте. Всё, что вы в нём настраиваете, лежит в контейнере. Как правило, это один контейнер на сайт: разработчик один раз вставляет его код на все страницы, и дальше теги добавляются без правок сайта.
В контейнере три вида объектов (как они связаны):
| Объект | Что делает | В примере со школой |
|---|---|---|
| Тег | Отправляет данные в другую систему | «Google Аналитика: событие GA4» с именем generate_lead |
| Триггер | Решает, когда запустить тег | «Пользовательское событие» lead_submit_success |
| Переменная | Подставляет значение в тег или в условие триггера | «Переменная уровня данных» form_name |
Всё это вы правите в рабочей области (workspace), и на сайт правки не попадают, пока вы их не опубликуете. У контейнера есть рабочая область по умолчанию, а в обычном аккаунте можно завести ещё две, например чтобы вы чинили заявки, а коллега в это время собирал теги для новой акции. Каждая публикация сохраняет версию контейнера, и к любой из них можно вернуться.
Сайт сообщает о заявке сам
GTM видит клики, просмотры страниц и отправку форм, но не знает, что ответил сервер. Поэтому о заявке сообщает код сайта, через dataLayer - очередь сообщений, которую читает GTM (как работает dataLayer). Задача разработчику звучит так: «Когда сервер ответил, что заявка сохранена, выполни этот код. При ошибке ничего не отправляй».
Что здесь что:
event- имя события, которого будет ждать триггер. Его придумываете вы с разработчиком, и оно может отличаться от имени в GA4: сайт говоритlead_submit_success, а в GA4 уходитgenerate_lead.form_name- какая это форма. На сайте школы их две, запись на курс и бесплатная консультация, и в отчётах их различают по этому полю.value- оценка заявки из урока про GA4: курс за 25 000 ₸, оплачивает каждая пятая заявка, значит заявка стоит 5 000 ₸. Число пишется без кавычек. Для JavaScript5000и"5000"- разные значения, а в справочнике событий GA4valueуказан как число.- Первая строка берёт существующий dataLayer, а если его нет, создаёт пустой. Google прямо пишет, что
window.dataLayerнельзя перезаписывать: записьdataLayer = [...]стирает всё, что туда уже положили другие скрипты.
Имени, телефона и email в push быть не должно. Правила Google Analytics запрещают передавать в Google данные, по которым можно узнать человека, а GTM отправит всё, что вы подставите в тег. Телефон остаётся в CRM, а связь заявки с рекламой строят отдельно, об этом урок про server-side трекинг.
И последнее правило: всё, что описывает заявку, кладут в тот же push, что и event. Значение в dataLayer живёт, пока человек на странице, и следующий push с тем же ключом его затирает. Если form_name придёт отдельным сообщением после события, тег уйдёт без него или с названием прошлой формы.
Соберите переменные, триггер и тег
Если прошлый подрядчик оставил в контейнере тег generate_lead на клик по кнопке, начните с него: удалите или приостановите. Иначе на каждую заявку уйдут два события, старое и новое.
- Переменные. Откройте «Переменные», в разделе «Пользовательские переменные» нажмите «Создать» и выберите тип «Переменная уровня данных» (типы переменных). Назовите её
DLV - form_name, а в поле имени переменной уровня данных впишитеform_name. Так же соберитеDLV - valueдляvalue. Валюта у школы всегда тенге, поэтому с сайта её передавать незачем: создайте переменную типа «Константа» со значениемKZT. - Триггер. «Триггеры» → «Создать» → «Пользовательское событие» (как настроить). В «Название события» вставьте
lead_submit_success, скопировав из кода, а не набирая заново: триггер сработает, только если имя совпадёт с тем, что прислал сайт. Если тег нужен только для формы курса, вместо «Все специальные события» выберите вариант с условием и задайте:DLV - form_nameравноcourse_signup. - Тег. «Теги» → «Создать» → «Google Аналитика: событие GA4» (события GA4 через GTM). Укажите идентификатор потока данных
G-..., в «Название события» впишитеgenerate_leadи добавьте три параметра:form_nameизDLV - form_name,valueизDLV - value,currencyиз константы. В триггерах выберите тот, что собрали на шаге 2.
Тег Google с тем же идентификатором G- при этом должен стоять на всех страницах, как в уроке про GA4.
Тренажёр: упражнения 1 и 2
Прежде чем трогать живой контейнер, пройдите упражнения 1 и 2 в тренажёре: в первом вы отправляете событие формы в dataLayer, во втором собираете тег заявки. Шаг трека «Старт» засчитан, когда оба упражнения проходят проверку тренажёра. Имена там другие, чем у школы: сайт сразу называет событие generate_lead, форму передаёт в form_id, валюта USD. Связка та же.
- Упражнение 1, «Создайте событие формы». Функция
trackLead(form)должна отправлятьgenerate_leadтолько для валидной формы, брать ID из той формы, которую отправили, и передаватьvalueчислом. Имя и email из формы в событие не копируйте, проверка следит и за этим. - Упражнение 2, «Настройте тег заявки». Переменные, триггер и тег уже собраны, но тег не срабатывает. Сравните имя события в триггере с тем, что приходит в dataLayer, сохраните условие по
form_idи посмотрите, чтоvalueв теге меняется вместе с исходным событием, а валюта берётся из константы.
Скриншот зелёной проверки сохраните, это результат шага.
Предварительный просмотр: «тег сработал» - только первая проверка
- На вкладке «Рабочая область» нажмите «Предварительный просмотр» (как работает режим). В новой вкладке откроется Tag Assistant. Введите адрес сайта и нажмите «Подключить», сайт откроется в новом окне. Вернитесь в Tag Assistant и нажмите «Продолжить».
- Отправьте форму с правильными данными. Слева в Tag Assistant появится
lead_submit_success. Нажмите на него: тег GA4 должен сработать именно на этом событии, а переменные показыватьcourse_signupи5000.
Здесь легко решить, что всё готово. Но «тег сработал» значит только, что GTM запустил код. Запрос мог уйти с пустым параметром, в чужой ресурс или дважды, поэтому дальше ещё три проверки.
- Запрос. Откройте инструменты разработчика в браузере, вкладку «Сеть» (Network), и отфильтруйте по
collect. Найдите запрос кgoogle-analytics.com/g/collectилиanalytics.google.com/g/collect(где его искать). Код ответа 200 или 204 значит, что данные ушли. Откройте запрос: в адресе должны бытьgenerate_lead,course_signupи вашG-. - Получатель. В GA4 откройте DebugView, как в уроке про GA4.
generate_leadдолжен прийти один раз, сform_name,valueиcurrency. - Ошибка и повтор. Отправьте форму с пустым email: ни
lead_submit_success, ниgenerate_leadпоявиться не должны. Потом отправьте правильную форму и обновите страницу. Если после обновления пришёл второйgenerate_lead, ищите, что его отправляет: код страницы «Спасибо», который срабатывает при каждом открытии, или повторная отправка формы браузером. Два события на одну отправку - повод искать второй тег, например старый тег на клик, который забыли выключить.
Опубликуйте версию с описанием
- Нажмите «Отправить» справа вверху и выберите «Публикация и создание версии».
- В «Название версии» напишите, что сделано: «generate_lead по принятой заявке». В «Описание версии» - что проверено: «Тег на lead_submit_success, form_name и value из dataLayer, валюта KZT. Проверены успешная отправка, ошибка, обновление страницы, запрос и DebugView. Старый тег на клик удалён».
- Нажмите «Опубликовать» (публикация и версии).
Через месяц это описание ответит, кто и зачем поменял число заявок в отчёте. Если после публикации что-то сломалось, откройте «Версии» и опубликуйте предыдущую, Google так и советует. Но всё, что успело уйти в GA4, там и останется, поэтому дни до и после публикации сравнивают с этой поправкой.
После публикации откройте сайт в обычном окне, без предварительного просмотра, отправьте ещё одну заявку и снова найдите запрос на вкладке «Сеть». Посетители получают именно опубликованную версию, а не ту, что вы смотрели в Tag Assistant.
Задание: тренажёр и своя форма
Если тестового сайта ещё нет, пройдите тренажёр сейчас, а пункты про сайт закройте, когда подключите GA4.
Если в DebugView generate_lead есть, а form_name пустой, откройте в Tag Assistant событие lead_submit_success и посмотрите, что лежало в dataLayer в этот момент. Если form_name приходит следующим сообщением, тег к тому времени уже ушёл: GTM берёт значение в момент события, и позднее сообщение отправленный запрос не исправит. Попросите разработчика положить form_name в тот же push. Если поле в том же push, а переменная всё равно пустая, сравните ключ в переменной с кодом по буквам: form_name и formName для GTM разные ключи.
А владельцу школы после публикации можно ответить так: раньше GA4 считал нажатия на кнопку, теперь считает принятые заявки. До штуки с CRM цифры всё равно не сойдутся: GA4 не видит тех, кто отказался от аналитики в баннере cookies или сидит с блокировщиком рекламы. Зато разница перестанет зависеть от того, сколько раз люди ошибаются в форме.
Видео: настройка GA4 через GTM
Видео канала Google Analytics на английском: тег Google и первое событие GA4 через GTM. Проверки из этого урока делайте поверх него.