8 хв читанняТуторіали

Налагодження GA4 Measurement Protocol: чому 2xx нічого не доводить

Гайд із налагодження GA4 Measurement Protocol: використовуйте сервер валідації, читайте validationMessages, знайте, що він пропускає, і підтверджуйте серверні події в GA4.

Ana Kowalska
Marketing solutions engineering
Обкладинка налагодження GA4 Measurement Protocol: серверна подія спершу йде на сервер валідації /debug/mp/collect і повертає validationMessages перед справжнім надсиланням

GA4 Measurement Protocol повертає статус 2xx майже на все, що ви до нього надсилаєте: валідну подію, подію з помилкою в назві, подію без client_id, вигаданий вами секрет. Тож код статусу марний для налагодження. Щоб налагоджувати виклики GA4 Measurement Protocol, надішліть те саме тіло на сервер валідації за адресою /debug/mp/collect, прочитайте повернуті validationMessages, виправте те, що вони називають, і лише потім підтверджуйте появу в DebugView або Realtime.

Останній крок важливіший, ніж багато хто очікує. Чому? Сервер валідації не перевіряє ваш API secret, тому дані можуть пройти валідацію, отримати 204 від справжньої кінцевої точки і все одно ніколи не потрапити у вашу властивість. Я бачила, як команда втратила на цьому тиждень, перш ніж хтось здогадався знову скопіювати секрет.

Якщо ви підключаєте серверні події для відстеження кампаній, базовий гайд про відстеження UTM від початку до кінця пояснює, що має бути в посиланні до всього цього. Ця стаття про момент, коли ви надсилаєте подію, а нічого не з'являється.

Чому Measurement Protocol відповідає 2xx на все

Довідник протоколу Google говорить прямо: кінцева точка повертає код статусу 2xx, якщо HTTP-запит отримано, і не повертає помилку, якщо дані мають неправильну структуру або їх не оброблено. Збирання працює за принципом "надіслав і забув". Ваш сервер ніколи не чекає на обробку.

Ми перевірили це самі. POST до /mp/collect з тілом {"garbage":true}, фальшивим measurement ID і вигаданим секретом повернув HTTP 204 з порожнім тілом. Так само, як і ідеальна подія.

Логіка повторних спроб, прив'язана до кодів статусу, ловить мережеві збої. І нічого більше. Вона не скаже вам, що GA4 відкинула ваші події. Для цього потрібна друга кінцева точка.

Як використовувати сервер валідації на /debug/mp/collect

Сервер валідації measurement protocol розміщений на тому самому хості. Той самий рядок запиту, те саме тіло:

curl -s -X POST \
  "https://www.google-analytics.com/debug/mp/collect?measurement_id=G-XXXXXXXXXX&api_secret=YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"events":[{"name":"session_start","params":{"firebase_x":1}}]}'

Він відповідає 200 з JSON-тілом замість порожнього. У цьому тестовому наборі даних є три проблеми, і сервер повідомляє про першу, на яку натрапляє:

{
  "validationMessages": [
    {
      "fieldPath": "client_id",
      "description": "Measurement requires a client_id.",
      "validationCode": "VALUE_REQUIRED"
    }
  ]
}

Додайте client_id, і він перейде до NAME_RESERVED для session_start; перейменуйте подію, і наступним стане префікс firebase_. Кожне повідомлення містить fieldPath, опис для людини та код. Серед задокументованих Google кодів є VALUE_INVALID, VALUE_REQUIRED, NAME_INVALID, NAME_RESERVED, VALUE_OUT_OF_BOUNDS, EXCEEDED_MAX_ENTITIES і NAME_DUPLICATED.

Порівняння кінцевих точок для налагодження GA4 Measurement Protocol: /mp/collect відповідає HTTP 204 з порожнім тілом і для валідних, і для зламаних подій, а /debug/mp/collect відповідає 200 з validationMessages і нічого не зберігає; жодна з них не перевіряє API secret

Порожній масив, "validationMessages": [ ], означає, що зі структурою все гаразд. Нічого, надіслане до /debug/mp/collect, не зберігається. Навантажуйте його під час розробки скільки завгодно; просто пам'ятайте, що debug-виклик ніколи не доводить, що дані дійшли.

Чого сервер валідації не перевіряє

Більшість навчальних матеріалів пропускають цю частину. На сторінці про валідацію подій Google прямо сказано, що сервер валідації не перевіряє api_secret. У нашому тесті 22 вересня 2026 року він не перевіряв і measurement ID: G-FAKE123 із секретом nonsense повернув порожній масив validationMessages.

Неправильний секрет проходить. Так само проходить відкликаний секрет, секрет з іншого потоку даних або друкарська помилка в G-. Measurement protocol api_secret - найчастіша причина "дані валідні, даних у GA4 немає", яку я бачу, і підтвердити її можна тільки побачивши, що подія прийшла.

Друга прогалина - режим валідації. За замовчуванням сервер працює в режимі RELAXED, і в цьому режимі він пропустив дві речі, які забороняють власні ліміти Google: подію з 26 параметрами та значення параметра довжиною 120 символів. Додайте "validation_behavior": "ENFORCE_RECOMMENDATIONS" до debug-тіла, і обидва випадки не пройдуть, з EXCEEDED_MAX_ENTITIES і VALUE_TOO_LONG. Я завжди перевіряла б у суворому режимі, навіть якщо в продакшені лишається м'який режим. Це різниця між перевіркою та формальною печаткою.

Як бачити серверні події в GA4 DebugView і Realtime

Коли дані пройшли валідацію, надішліть їх до справжньої кінцевої точки і подивіться, чи вони доходять. Для серверних подій працюють два подання, і стандартні звіти не серед них, бо можуть відставати на 24-48 годин.

DebugView потребує явного ввімкнення для кожної події. Гайд із перевірки Google просить "debug_mode": 1 (або true) у params події плюс додатний engagement_time_msec. Показуються лише події з цим прапорцем, тому пакет, де одній події його бракує, виглядає напівпорожнім. Відкрийте Admin, потім DebugView, і дайте йому хвилину.

Realtime не потребує нічого додаткового. Прокрутіть до картки "Event count by Event name" і знайдіть свою подію. Google зазначає, що session_id і engagement_time_msec важливі для показу активності користувача в Realtime, тож якщо подія проходить валідацію, але Realtime лишається порожнім, спершу перевірте ці два поля.

Ще одне застереження з того самого гайда: для веб-потоків там сказано, що валідна подія використовує client_id, який gtag.js уже використовував. Синтетичні ID все одно зараховуються, кожен як окремий користувач, але вони ніколи не приєднуються до браузерної сесії, і у звіті, побудованому навколо сесій, це виглядає як довгий хвіст користувачів з однією подією, який ви не зможете пояснити, доки не знатимете, звідки він узявся. Про це докладніше в наступному розділі. Якщо бракує не подій, а даних кампанії, UTM-параметри не показуються в GA4 розбирає цю проблему з боку DebugView.

Типові помилки в даних і що каже валідатор

Більшість зламаних подій вкладається в кілька шаблонів. Ось вони разом з тим, що повернув сервер валідації, коли ми надсилали кожну з них 22 вересня 2026 року:

ПомилкаВідповідь валідатора (стандартний режим)Виправлення
Немає client_id у тіліVALUE_REQUIRED для client_idНадішліть значення _ga або власний стабільний ID
Подія з назвою session_startNAME_RESERVEDПерейменуйте; first_visit, user_engagement зарезервовані
Параметр із префіксом firebase_NAME_RESERVED для events.paramsПриберіть префікси _, firebase_, ga_, google_
Подія з назвою Link ClickNAME_INVALIDЛітери, цифри й _; починайте з літери
26 параметрів або 120-символьне значенняПорожній масив (суворий режим ловить це)Тримайтеся 25 параметрів і 100-символьних значень
timestamp_micros старший за 72 годиниПорожній масив (суворий режим відхиляє це)М'який режим переписує його на 72 години тому
Немає engagement_time_msecПорожній масивЗадайте додатне число, інакше Realtime може лишитися порожнім

Два рядки потребують коментаря. Префікс ga_ зарезервований згідно з довідником, але валідатор прийняв ga_session_id в обох режимах, коли ми це пробували, тож не сприймайте порожній масив як дозвіл. А ліміт значення у 100 символів постійно зачіпає повні URL призначення: цільова сторінка з п'ятьма UTM-мітками часто довша за це.

Сам client_id - тонкий момент. Будь-який рядок проходить валідацію в м'якому режимі, але суворий режим відхилив і c1, і elido-12-4711 з повідомленням "It should be in . format". Якщо ваші події мають зшиватися з браузерними сесіями, надсилайте справжнє значення _ga; гайд із серверного відстеження GA4 детально пояснює це зшивання.

Як GA4 Forwarder і Test Connection в Elido використовують це

Elido пересилає кліки коротких посилань до GA4 на серверному боці. Ви вставляєте Measurement ID і Measurement Protocol API secret у картку GA4 в розділі Integrations, і відтоді кожен клік у цьому робочому просторі стає однією подією link_click:

{
  "client_id": "elido-12-4711",
  "events": [
    {
      "name": "link_click",
      "params": {
        "workspace_id": 12,
        "link_id": 4711,
        "slug": "spring-26",
        "country": "DE",
        "device": "mobile",
        "destination": "https://shop.example/spring?utm_source=newsletter",
        "engagement_time_msec": 100
      }
    }
  ]
}

client_id має вигляд elido-<workspace>-<link>, тому кожен клік за одним посиланням читається як той самий користувач GA4, і жоден з них не приєднується до браузерної сесії. Це чесний компроміс, коли ви робите це без cookie: підсумки та розбивки за slug, country і device працюють; кількість користувачів і сесійні воронки - ні. Country і device - звичайні параметри подій. Спершу зареєструйте їх як спеціальні параметри. А destination довше за 100 символів упирається в ліміт з таблиці вище, тому звітуйте за slug або link_id натомість.

Кнопка Test connection дотримується порядку, який радить ця стаття:

Як кнопка Test connection в Elido налагоджує інтеграцію GA4 Measurement Protocol: вона валідує синтетичний link_click на /debug/mp/collect, завершується помилкою з власним повідомленням Google, якщо validationMessages не порожній, інакше надсилає подію до /mp/collect і показує відповідь постачальника з приміткою, що секрет не перевірено

Спершу вона надсилає синтетичний link_click, позначений elido_test: true, до /debug/mp/collect. Якщо validationMessages не порожній, тест завершується помилкою і показує описи Google дослівно. Якщо масив порожній, та сама подія справді йде до /mp/collect. Під кнопкою ви бачите відповідь постачальника (статус HTTP, кінцеву точку для налагодження з вашим measurement ID, але ніколи не секретом, і тіло Google) плюс примітку, що Measurement Protocol не перевіряє API secret.

Тож зелений колір означає "валідно, і Google це отримала". Не "це є у вашій властивості". Тестова подія містить debug_mode: 1 і elido_test: true, тому вона з'являється в DebugView як link_click; у Realtime її теж видно. Якщо хочете події кліків у GA4 без тегу на кожній цільовій сторінці, створіть робочий простір і спершу спрямуйте картку GA4 на тестову властивість.

Робочий порядок налагодження GA4 Measurement Protocol

Коли події GA4 не з'являються, пройдіть цей порядок і зупиніться на першому збої:

  1. Надішліть тіло до /debug/mp/collect з validation_behavior, встановленим у ENFORCE_RECOMMENDATIONS. Виправте кожне повідомлення.
  2. Знову скопіюйте API secret з Admin, Data streams, вашого веб-потоку, Measurement Protocol API secrets. Перевірте, що він з того самого потоку, що й G- ID.
  3. Надішліть одну подію до /mp/collect з debug_mode: 1 і дві хвилини дивіться DebugView.
  4. Приберіть прапорець і перевірте Realtime, а потім дайте стандартним звітам день або два.

Крок 2 - місце, де закінчується більшість мого власного налагодження. Сторінка усунення проблем Google починається з тих самих трьох питань: правильний секрет, ще чинний, скопійований точно. Коли цифри нарешті течуть, але все одно не збігаються з кількістю кліків за посиланнями, кліки коротких посилань проти сесій GA4 пояснює розрив, а серверне відстеження конверсій покриває події конверсій, які зазвичай ідуть далі. Та сама звичка "спершу валідувати, потім перевіряти" стосується й інших напрямків на сторінці відстеження конверсій.

Пов'язане в блозі

Поширені запитання

Як налагоджувати події GA4 Measurement Protocol?

Надішліть ті самі дані на https://www.google-analytics.com/debug/mp/collect замість /mp/collect. Сервер валідації відповідає масивом validationMessages, де названо поле, описано проблему й наведено код, наприклад NAME_RESERVED або VALUE_REQUIRED. Порожній масив означає, що структура валідна. Потім надішліть справжню подію з debug_mode зі значенням 1 і перевірте її появу в DebugView.

Чому мої події Measurement Protocol не з'являються в GA4?

Звичні причини - неправильний або відкликаний API secret, Measurement ID з іншого потоку, відсутній client_id або занадто ранній перегляд стандартних звітів. Для всього цього кінцева точка повертає 2xx, тому код статусу нічого не підкаже. Перевірте дані, потім вручну перевірте секрет, а тоді дивіться Realtime або DebugView, а не звіти, які можуть відставати на день або більше.

Чи перевіряє сервер валідації GA4 API secret?

Ні. У документації Google сказано, що сервер валідації не перевіряє api_secret, а в нашому тесті 22 вересня 2026 року він також прийняв Measurement ID, який не належить жодній властивості. Порожній масив validationMessages означає лише, що JSON сформовано коректно. Чи відповідає секрет потоку, можна підтвердити тільки побачивши, що подія прийшла в GA4.

Чи потрапляють події, надіслані до /debug/mp/collect, у звіти GA4?

Ні. Сервер валідації перевіряє дані й відкидає їх, тож нічого з надісланого туди не доходить до звітів, Realtime або DebugView. Щоб побачити подію в DebugView, надішліть її до звичайної кінцевої точки /mp/collect з параметром debug_mode зі значенням 1 і додатним engagement_time_msec, як описано в гайді Google з перевірки.

Який client_id надсилати з GA4 Measurement Protocol?

Для веб-потоку Google очікує client_id, згенерований тегом GA4 на вашому сайті, тобто значення з cookie _ga, щоб серверні події приєднувалися до браузерної сесії. Будь-який рядок проходить стандартну валідацію, але суворіший режим ENFORCE_RECOMMENDATIONS відхиляє ідентифікатори не у форматі number.number. Вигаданий ID усе одно зараховує події, але просто ніколи не приєднує їх до браузерної сесії.

Скільки параметрів може мати подія Measurement Protocol?

Двадцять п'ять параметрів на подію і 25 подій на запит, з назвами до 40 символів і значеннями до 100 символів у стандартній властивості або до 500 у GA4 360. Стандартний режим валідації не позначив 26-й параметр або значення довжиною 120 символів, коли ми це тестували; додавання validation_behavior зі значенням ENFORCE_RECOMMENDATIONS у debug-виклику зробило це.

Спробуйте Elido

Вставте URL - отримайте коротке посилання

Без реєстрації. Посилання живе 30 днів. Зареєструйтесь, щоб зберегти назавжди.

Безкоштовно, без реєстрації · 2 на день

Спробуйте Elido

URL-скорочувач із хостингом у ЄС: власні домени, глибока аналітика, відкритий API. Безкоштовний тариф - без кредитної картки.

Теги
ga4 measurement protocol debug
measurement protocol validation server
debug/mp/collect
ga4 events not showing
measurement protocol api_secret
ga4 debugview server events

Читати далі