{"id":17211,"date":"2026-10-10T18:10:00","date_gmt":"2026-10-10T16:10:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=17211"},"modified":"2026-10-09T22:44:51","modified_gmt":"2026-10-09T20:44:51","slug":"ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/","title":{"rendered":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON"},"content":{"rendered":"<p>\u017b\u0105danie Measurement Protocol to pojedynczy POST po HTTPS: ci\u0105g zapytania z dwoma danymi dost\u0119powymi i tre\u015b\u0107 JSON ze zdarzeniami. T\u0105 drog\u0105 do us\u0142ugi GA4 trafiaj\u0105 dane, kt\u00f3re nie pochodz\u0105 z przegl\u0105darki \u2014 konwersje offline z CRM, p\u0142atno\u015b\u0107 potwierdzona webhookiem, backend aplikacji, nadrobienie trafie\u0144 po\u0142kni\u0119tych przez blokad\u0119 reklam.<\/p>\n<p>To zarazem jedyna droga dostarczania danych w ca\u0142ej uk\u0142adance, kt\u00f3ra nigdy nie m\u00f3wi, czy si\u0119 powiod\u0142a.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/mp-nutzlast-pl.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Po lewej budowa \u0142adunku Measurement Protocol wraz z udokumentowanymi limitami, po prawej tabela dziewi\u0119ciu celowo uszkodzonych \u017c\u0105da\u0144 i kodu statusu, kt\u00f3rym odpowiedzia\u0142 endpoint produkcyjny\"><figcaption>Z czego sk\u0142ada si\u0119 \u0142adunek i co odpowiada endpoint produkcyjny, gdy jego cz\u0119\u015bci s\u0105 b\u0142\u0119dne.<\/figcaption><\/figure>\n<h2>Co odpowiada endpoint<\/h2>\n<p>Dziewi\u0119\u0107 \u017c\u0105da\u0144 trafi\u0142o 9 wrze\u015bnia 2026 na <code>https:\/\/www.google-analytics.com\/mp\/collect<\/code>, ka\u017cde z wymy\u015blonym identyfikatorem pomiaru, aby nigdzie nic nie zosta\u0142o zapisane. Siedem z nich by\u0142o celowo uszkodzonych.<\/p>\n<p>Osiem z dziewi\u0119ciu wr\u00f3ci\u0142o jako <strong>204 No Content<\/strong>, w oko\u0142o 100 milisekundach i z pust\u0105 tre\u015bci\u0105. Nie tylko to poprawne: tak\u017ce zdarzenie o nazwie zaczynaj\u0105cej si\u0119 od podkre\u015blenia, puste <code>events<\/code>, \u0142adunek z wymy\u015blonym polem na najwy\u017cszym poziomie, \u017c\u0105danie bez <code>client_id<\/code> oraz tre\u015b\u0107, kt\u00f3ra wcale nie by\u0142a JSON-em. \u017b\u0105danie <strong>ca\u0142kiem bez ci\u0105gu zapytania<\/strong> \u2014 bez identyfikatora pomiaru, bez sekretu API \u2014 r\u00f3wnie\u017c wr\u00f3ci\u0142o z kodem 204.<\/p>\n<p>Dok\u0142adnie dwie rzeczy wywo\u0142a\u0142y b\u0142\u0105d HTTP i \u017cadna z nich nie jest ocen\u0105 \u0142adunku. Tre\u015b\u0107 o rozmiarze 140 kB zosta\u0142a odrzucona kodem <strong>413<\/strong> i stron\u0105 b\u0142\u0119du HTML z warstwy wej\u015bciowej, poniewa\u017c przekroczy\u0142a udokumentowany limit 130 kB, zanim cokolwiek zosta\u0142o odczytane. Metoda <code>GET<\/code> zosta\u0142a odrzucona kodem <strong>405<\/strong>.<\/p>\n<p>Europejski endpoint <code>region1.google-analytics.com<\/code> zachowuje si\u0119 tak samo. Po pi\u0119\u0107 przebieg\u00f3w na host: mediana czasu obiegu z tego samego serwera wynios\u0142a w obu przypadkach 90 milisekund.<\/p>\n<p>Kod odpowiedzi potwierdza wi\u0119c tylko, \u017ce \u017c\u0105danie dotar\u0142o. Nie m\u00f3wi, czy zdarzenie zosta\u0142o zrozumiane i zapisane ani czy pomini\u0119to kt\u00f3ry\u015b parametr. Przy wysy\u0142ce tych problem\u00f3w nie wida\u0107; ujawniaj\u0105 si\u0119 dopiero kilka godzin p\u00f3\u017aniej jako brakuj\u0105ce dane w raporcie.<\/p>\n<h2>Gdzie naprawd\u0119 nale\u017cy \u0142adunek<\/h2>\n<p>Dwie cz\u0119\u015bci, a pomylenie ich jest \u0142atwe.<\/p>\n<p><strong>Ci\u0105g zapytania<\/strong> niesie dane dost\u0119powe: <code>measurement_id<\/code> dla strumienia sieciowego (albo <code>firebase_app_id<\/code> dla strumienia aplikacji) oraz <code>api_secret<\/code>, zak\u0142adany osobno dla ka\u017cdego strumienia w administracji GA4. \u017badne z nich nie nale\u017cy do JSON-a. Tam staj\u0105 si\u0119 nieznanymi polami, a nieznane pole nie jest pomijane \u2014 czyni ca\u0142y \u0142adunek nieczytelnym.<\/p>\n<p><strong>Tre\u015b\u0107<\/strong> to obiekt JSON ze sta\u0142ym zestawem dozwolonych kluczy:<\/p>\n<pre><code>{\n  \"client_id\": \"1234567890.1700000000\",\n  \"user_id\": \"crm-88213\",\n  \"timestamp_micros\": 1788000000000000,\n  \"consent\": { \"ad_user_data\": \"GRANTED\", \"ad_personalization\": \"DENIED\" },\n  \"user_properties\": { \"poziom_klienta\": { \"value\": \"gold\" } },\n  \"events\": [\n    {\n      \"name\": \"purchase\",\n      \"params\": {\n        \"transaction_id\": \"T-8891\",\n        \"currency\": \"EUR\",\n        \"value\": 20,\n        \"session_id\": \"1700000000\",\n        \"engagement_time_msec\": 100,\n        \"items\": [\n          { \"item_id\": \"A-1\", \"item_name\": \"Koszula\", \"price\": 10, \"quantity\": 2 }\n        ]\n      }\n    }\n  ]\n}<\/code><\/pre>\n<p>Poza tym dokumentacja dopuszcza <code>user_data<\/code>, <code>user_location<\/code>, <code>ip_override<\/code>, <code>device<\/code>, <code>user_agent<\/code>, <code>non_personalized_ads<\/code> i <code>validation_behavior<\/code>. To jest pe\u0142na lista. Wszystko inne \u2014 klucz <code>event<\/code> przeniesiony razem z obiektu dataLayer, otoczka <code>ecommerce<\/code>, notatka dla kole\u017canki z zespo\u0142u \u2014 kosztuje ca\u0142e \u017c\u0105danie.<\/p>\n<h2>Pola identyfikacyjne<\/h2>\n<p><code>client_id<\/code> jest w strumieniu sieciowym obowi\u0105zkowe i to jedno pole decyduje, czy zdarzenie do\u0142\u0105czy do istniej\u0105cego u\u017cytkownika, czy wymy\u015bli nowego. Zalecana posta\u0107 to dwie dodatnie liczby po\u0142\u0105czone kropk\u0105 \u2014 dok\u0142adnie to, co wydaje <code>gtag('get')<\/code> i co zwraca wbudowana zmienna Analytics Client ID w Google Tag Managerze. Pe\u0142na warto\u015b\u0107 ciasteczka <code>_ga<\/code>, czyli <code>GA1.1.1234567890.1700000000<\/code>, te\u017c jest przyjmowana; obie liczby siedz\u0105 w \u015brodku.<\/p>\n<p>Warto\u015b\u0107 wymy\u015blona na serwerze r\u00f3wnie\u017c zostanie przyj\u0119ta i to jest kosztowna pomy\u0142ka. \u015awie\u017cy identyfikator przy ka\u017cdym \u017c\u0105daniu tworzy za ka\u017cdym razem nowego u\u017cytkownika i now\u0105 sesj\u0119 \u2014 us\u0142uga wygl\u0105da na ruchliw\u0105, a sk\u0142ada si\u0119 wy\u0142\u0105cznie z sesji po jednym zdarzeniu.<\/p>\n<p>Strumienie aplikacji u\u017cywaj\u0105 zamiast tego <code>app_instance_id<\/code>: 32 znaki szesnastkowe z SDK Firebase, a nie client_id pod inn\u0105 nazw\u0105. Wys\u0142anie obu nie szkodzi i nie pomaga; pole nale\u017c\u0105ce do drugiego rodzaju strumienia zostaje pomini\u0119te.<\/p>\n<p><code>user_id<\/code> jest opcjonalne, ma najwy\u017cej 256 znak\u00f3w i musi by\u0107 ci\u0105giem znak\u00f3w. To klucz \u0142\u0105cz\u0105cy, nie osoba: adres e-mail albo numer telefonu w tym polu to dana osobowa, czego warunki korzystania z Google Analytics zabraniaj\u0105 i co wystarczy jako pow\u00f3d usuni\u0119cia us\u0142ugi. To samo dotyczy ka\u017cdego parametru zdarzenia i ka\u017cdej w\u0142a\u015bciwo\u015bci u\u017cytkownika.<\/p>\n<h2>Dwa parametry, od kt\u00f3rych zale\u017cy zgodno\u015b\u0107 raport\u00f3w<\/h2>\n<p>Zdarzenie bez <code>session_id<\/code> nie nale\u017cy do \u017cadnej sesji. Nadal zostaje zapisane i policzone, ale sesje, sesje anga\u017cuj\u0105ce i wymiary o zakresie sesji si\u0119 nie zgadzaj\u0105, a w widoku czasu rzeczywistego zdarzenia mo\u017ce zabrakn\u0105\u0107 zupe\u0142nie.<\/p>\n<p>Zdarzenie bez <code>engagement_time_msec<\/code> nie wnosi nic do \u015bredniego czasu zaanga\u017cowania, kt\u00f3ry dla ruchu dostarczonego t\u0105 drog\u0105 pokazuje wtedy zero.<\/p>\n<p>\u017badne z nich nie jest obowi\u0105zkowe, \u017cadne nie wywo\u0142uje nigdzie ostrze\u017cenia i oba s\u0105 zwyk\u0142\u0105 odpowiedzi\u0105 na \u201ezdarzenia docieraj\u0105, ale raport si\u0119 nie zgadza&#8221;. <code>session_id<\/code> musi by\u0107 dodatni\u0105 liczb\u0105 ca\u0142kowit\u0105 \u2014 w typowym przypadku znacznikiem czasu \u2014 i mo\u017ce zosta\u0107 wys\u0142ane jako liczba albo jako ci\u0105g cyfr. Litery w \u015brodku s\u0105 odrzucane.<\/p>\n<h2>Zdarzenie i jego nazwa<\/h2>\n<p>Zdarzenie to obiekt z dok\u0142adnie dwoma dozwolonymi kluczami: <code>name<\/code> i <code>params<\/code>. Znacznik czasu postawiony obok nich jako trzeci klucz psuje \u0142adunek; znacznik dla pojedynczego zdarzenia nale\u017cy do <code>params<\/code> jako <code>timestamp_micros<\/code>.<\/p>\n<p>Nazwy musz\u0105 zaczyna\u0107 si\u0119 od litery i mog\u0105 zawiera\u0107 wy\u0142\u0105cznie litery, cyfry i podkre\u015blenia. My\u015blniki, kropki i spacje s\u0105 odrzucane wprost. Nazwy <strong>rozr\u00f3\u017cniaj\u0105 wielko\u015b\u0107 liter<\/strong> i to jest przypadek najcichszy: <code>Purchase<\/code> zostanie przyj\u0119te, zostanie zapisane i jest innym zdarzeniem ni\u017c <code>purchase<\/code> \u2014 w raportach e-commerce nie pojawi si\u0119 nigdy, bo te s\u0105 podpi\u0119te pod nazw\u0119 pisan\u0105 ma\u0142ymi literami.<\/p>\n<p>Trzydzie\u015bci jeden nazw Google zachowuje dla siebie, w\u015br\u00f3d nich <code>session_start<\/code>, <code>first_visit<\/code>, <code>user_engagement<\/code>, <code>app_remove<\/code> i <code>error<\/code>. Trzy kolejne \u2014 <code>screen_view<\/code>, <code>ad_impression<\/code> i <code>in_app_purchase<\/code> \u2014 istniej\u0105, ale s\u0105 dozwolone tylko w strumieniach aplikacji. W strumieniu sieciowym po prostu nie zostan\u0105 zebrane i nikt nigdzie o tym nie wspomina.<\/p>\n<h2>Parametry i obowi\u0105zuj\u0105ce je limity<\/h2>\n<p>Wszystkie limity protoko\u0142u w jednym miejscu:<\/p>\n<table>\n<tr>\n<th>Co<\/th>\n<th>Limit<\/th>\n<\/tr>\n<tr>\n<td>Tre\u015b\u0107 JSON<\/td>\n<td>poni\u017cej 130 kB<\/td>\n<\/tr>\n<tr>\n<td>Zdarzenia na \u017c\u0105danie<\/td>\n<td>25<\/td>\n<\/tr>\n<tr>\n<td>Nazwa zdarzenia<\/td>\n<td>40 znak\u00f3w<\/td>\n<\/tr>\n<tr>\n<td>Parametry na zdarzenie<\/td>\n<td>25<\/td>\n<\/tr>\n<tr>\n<td>Nazwa parametru<\/td>\n<td>40 znak\u00f3w<\/td>\n<\/tr>\n<tr>\n<td>Warto\u015b\u0107 parametru<\/td>\n<td>100 znak\u00f3w, 500 w us\u0142udze Analytics 360<\/td>\n<\/tr>\n<tr>\n<td>W\u0142a\u015bciwo\u015bci u\u017cytkownika na \u017c\u0105danie<\/td>\n<td>25<\/td>\n<\/tr>\n<tr>\n<td>Nazwa w\u0142a\u015bciwo\u015bci u\u017cytkownika<\/td>\n<td>24 znaki<\/td>\n<\/tr>\n<tr>\n<td>Warto\u015b\u0107 w\u0142a\u015bciwo\u015bci u\u017cytkownika<\/td>\n<td>36 znak\u00f3w<\/td>\n<\/tr>\n<tr>\n<td><code>user_id<\/code><\/td>\n<td>256 znak\u00f3w<\/td>\n<\/tr>\n<tr>\n<td>Pozycje na zdarzenie<\/td>\n<td>200<\/td>\n<\/tr>\n<tr>\n<td>W\u0142asne parametry na pozycj\u0119<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>Datowanie wstecz<\/td>\n<td>72 godziny<\/td>\n<\/tr>\n<\/table>\n<p>Nazwy parametr\u00f3w nie mog\u0105 zaczyna\u0107 si\u0119 od <code>_<\/code>, <code>firebase_<\/code>, <code>ga_<\/code>, <code>google_<\/code> ani <code>gtag.<\/code>, a <code>firebase_conversion<\/code> jest zastrze\u017cone wprost. Nazwy w\u0142a\u015bciwo\u015bci u\u017cytkownika podlegaj\u0105 tym samym regu\u0142om przedrostk\u00f3w plus pi\u0119ciu nazwom zastrze\u017conym, spo\u015br\u00f3d kt\u00f3rych po <code>user_id<\/code> si\u0119ga si\u0119 przez pomy\u0142k\u0119 najcz\u0119\u015bciej \u2014 identyfikator u\u017cytkownika nale\u017cy na najwy\u017cszy poziom, a nie do <code>user_properties<\/code>.<\/p>\n<p>Tablic\u0105 mo\u017ce by\u0107 wy\u0142\u0105cznie <code>items<\/code>. Ka\u017cdy inny parametr przyjmuje pojedyncz\u0105 warto\u015b\u0107; obiekt zagnie\u017cd\u017cony odpada, a w raporcie parametr pojawia si\u0119 jako brakuj\u0105cy, nie jako b\u0142\u0119dny.<\/p>\n<h2>Gdzie oba maksima wchodz\u0105 sobie w drog\u0119<\/h2>\n<p>Dwadzie\u015bcia pi\u0119\u0107 zdarze\u0144 na \u017c\u0105danie i dwie\u015bcie pozycji na zdarzenie s\u0105 udokumentowane oba, a razem si\u0119 nie mieszcz\u0105. Zmierzone na wygenerowanych \u0142adunkach z realistycznymi polami pozycji \u2014 identyfikator, nazwa, marka, kategoria, wariant, cena, ilo\u015b\u0107:<\/p>\n<ul>\n<li><code>purchase<\/code> z jedn\u0105 pozycj\u0105, wraz z consent i w\u0142a\u015bciwo\u015bciami u\u017cytkownika, ma <strong>558 bajt\u00f3w<\/strong>.<\/li>\n<li>Dwadzie\u015bcia pi\u0119\u0107 takich zdarze\u0144 daje oko\u0142o <strong>14 kB<\/strong>, czyli 10,7 % limitu.<\/li>\n<li>Dwadzie\u015bcia pi\u0119\u0107 zdarze\u0144 po <strong>29 pozycji<\/strong> przekracza 130 kB. Przy 28 pozycjach jest to wci\u0105\u017c 126 kB.<\/li>\n<li>Dwadzie\u015bcia pi\u0119\u0107 zdarze\u0144 po dozwolone 200 pozycji da\u0142oby 879 kB \u2014 <strong>6,8 raza<\/strong> wi\u0119cej ni\u017c limit.<\/li>\n<\/ul>\n<p>Pojedyncze zdarzenie z 200 pozycjami ma 35 kB i mie\u015bci si\u0119 swobodnie. Przy zwyczajnym ruchu wi\u0105\u017ce wi\u0119c liczba zdarze\u0144, a gdy koszyki si\u0119 wyd\u0142u\u017caj\u0105, przejmuje limit rozmiaru. Przej\u015bcie le\u017cy przy oko\u0142o 29 pozycjach na zdarzenie i jest to jedyny limit, kt\u00f3ry odpowiada b\u0142\u0119dem HTTP zamiast milczeniem.<\/p>\n<h2>Czas i trzy sposoby na jego pomylenie<\/h2>\n<p><code>timestamp_micros<\/code> to uniksowy znacznik czasu w <strong>mikrosekundach<\/strong>. Przy jego braku zdarzenie zostaje ostemplowane w chwili dotarcia, co jest s\u0142uszne dla wszystkiego bie\u017c\u0105cego i b\u0142\u0119dne dla wszystkiego nadrabianego.<\/p>\n<p>Pu\u0142apk\u0105 jest jednostka. <code>time()<\/code> w PHP i <code>time.time()<\/code> w Pythonie zwracaj\u0105 sekundy, <code>Date.now()<\/code> w JavaScripcie zwraca milisekundy. Oba zostan\u0105 przyj\u0119te jako liczba i oba umieszcz\u0105 zdarzenie gdzie\u015b w roku 1970. Serwer walidacyjny Google owszem to zg\u0142asza \u2014 jako \u201etimestamp too far in the past&#8221;, czyli komunikat kieruj\u0105cy poszukiwania ku problemowi z datowaniem wstecz, podczas gdy faktycznym b\u0142\u0119dem jest mno\u017cnik tysi\u0105c albo milion.<\/p>\n<p>Okno wynosi 72 godziny. Starsze zdarzenia s\u0105 odrzucane, a te wys\u0142ane z <code>validation_behavior<\/code> ustawionym na <code>ENFORCE_RECOMMENDATIONS<\/code> zostaj\u0105 odrzucone wprost, zamiast po cichu przepa\u015b\u0107. Znacznik w przysz\u0142o\u015bci oznacza zwykle rozstrojony zegar albo dwukrotnie doliczon\u0105 stref\u0119 czasow\u0105.<\/p>\n<h2>consent i klucze, kt\u00f3re tu nie nale\u017c\u0105<\/h2>\n<p>Obiekt <code>consent<\/code> przyjmuje dok\u0142adnie dwa klucze, <code>ad_user_data<\/code> i <code>ad_personalization<\/code>, ka\u017cdy o warto\u015bci <code>GRANTED<\/code> albo <code>DENIED<\/code>. Nie <code>analytics_storage<\/code>, nie <code>ad_storage<\/code> \u2014 to Consent Mode w przegl\u0105darce, inny mechanizm o innym s\u0142ownictwie.<\/p>\n<p>Wstawienie kt\u00f3rego\u015b z nich tutaj nie jest awari\u0105 cz\u0119\u015bciow\u0105. Nieznany klucz w <code>consent<\/code> albo warto\u015b\u0107 inna ni\u017c dwie dozwolone czyni \u0142adunek nieczytelnym, a ca\u0142e \u017c\u0105danie bezcelowym. Pomini\u0119ty zupe\u0142nie, obiekt ten ka\u017ce GA4 si\u0119gn\u0105\u0107 po stan zgody z interakcji przegl\u0105darkowych tego samego klienta, co dla integracji serwerowej jest zwykle dok\u0142adnie tym, o co chodzi.<\/p>\n<p><code>non_personalized_ads<\/code> nadal dzia\u0142a i jest wycofywane; zast\u0119puje je <code>ad_personalization<\/code> wewn\u0105trz <code>consent<\/code>.<\/p>\n<h2>validation_behavior i dlaczego produkcja nie powinna go ustawia\u0107<\/h2>\n<p><code>validation_behavior<\/code> ma dwie warto\u015bci. <code>RELAXED<\/code> jest domy\u015blne: \u017c\u0105dania zniekszta\u0142cone s\u0105 odrzucane, ale parametry ponad limitami zostaj\u0105 pomini\u0119te zamiast zg\u0142oszone, a dane niew\u0142a\u015bciwego typu mog\u0105 i tak przej\u015b\u0107. <code>ENFORCE_RECOMMENDATIONS<\/code> odrzuca w\u0142a\u015bnie to.<\/p>\n<p>Rygorystyczna walidacja sprawdza si\u0119 w testach, gdzie odrzucenie pomaga znale\u017a\u0107 b\u0142\u0105d. W dzia\u0142aj\u0105cym systemie lepiej ca\u0142kowicie pomin\u0105\u0107 to pole, poniewa\u017c odrzucenie oznacza utrat\u0119 danych. Przy \u0142agodnej walidacji zdarzenie ze zbyt d\u0142ugim parametrem dociera bez tego parametru. Przy rygorystycznej nie dociera wcale.<\/p>\n<h2>Jak w og\u00f3le znale\u017a\u0107 b\u0142\u0105d<\/h2>\n<p>Skoro endpoint produkcyjny nic nie m\u00f3wi, b\u0142\u0119dy trzeba znale\u017a\u0107 przed wysy\u0142k\u0105. Serwer walidacyjny Google przyjmuje to samo \u017c\u0105danie pod adresem <code>\/debug\/mp\/collect<\/code> i odpowiada tablic\u0105 <code>validationMessages<\/code>; wys\u0142ane tam zdarzenia nigdy nie zostaj\u0105 zapisane.<\/p>\n<p>Zanim oprzesz kontrol\u0119 na serwerze walidacyjnym, poznaj jego dwa ograniczenia. Zg\u0142asza <strong>tylko pierwszy znaleziony b\u0142\u0105d<\/strong>: je\u015bli zdarzenie ma trzy problemy, najpierw zwr\u00f3ci jeden komunikat, a nast\u0119pny pojawi si\u0119 dopiero po naprawieniu pierwszego b\u0142\u0119du. Nie sprawdza te\u017c ani <code>measurement_id<\/code>, ani <code>api_secret<\/code>. \u017b\u0105danie ze zmy\u015blonymi danymi dost\u0119powymi otrzyma wi\u0119c dok\u0142adnie tak\u0105 sam\u0105 ocen\u0119 jak \u017c\u0105danie z prawdziwymi. Jest to udokumentowane i pozwala sprawdzi\u0107 \u0142adunek bez wysy\u0142ania prawdziwego sekretu poza firm\u0119.<\/p>\n<p>Warto te\u017c pozna\u0107 to, czego nie sprawdza wcale. W pomiarze przeciwko niemu, z ustawionym <code>ENFORCE_RECOMMENDATIONS<\/code>, bez s\u0142owa przesz\u0142o wszystko poni\u017csze: trzydzie\u015bci zdarze\u0144 w jednym \u017c\u0105daniu, puste <code>events<\/code>, \u0142adunek zupe\u0142nie bez klucza <code>events<\/code>, dwa zdarzenia o tej samej nazwie, <code>screen_view<\/code> w strumieniu sieciowym oraz <code>purchase<\/code> bez <code>value<\/code> i bez <code>currency<\/code>. Bez <code>validation_behavior<\/code> \u2014 czyli tak, jak ten sam tekst traktuje produkcja \u2014 czysto wr\u00f3ci\u0142a r\u00f3wnie\u017c warto\u015b\u0107 parametru o d\u0142ugo\u015bci 120 znak\u00f3w.<\/p>\n<h2>Czym protok\u00f3\u0142 jest dzisiaj<\/h2>\n<p>Google wprowadzi\u0142 Measurement Protocol w czerwcu 2026 w stan zamkni\u0119ty: bez wycofania, bez nowych funkcji. Dokumentacja poleca dzi\u015b dla nowych integracji serwer\u2013serwer interfejs Data Manager API, z OAuth zamiast sekretu API, wieloma miejscami docelowymi na \u017c\u0105danie i szyfrowanymi identyfikatorami.<\/p>\n<p>Dla istniej\u0105cej integracji nie jest to stan wyj\u0105tkowy. Measurement Protocol dzia\u0142a dalej, jego limity obowi\u0105zuj\u0105 dalej, a jego endpoint dalej odpowiada 204 na wszystko \u2014 co czyni kontrol\u0119 przed wysy\u0142k\u0105 tym samym zadaniem, kt\u00f3rym by\u0142a zawsze.<\/p>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Jak w dzia\u0142aj\u0105cym systemie stwierdzi\u0107, czy zdarzenia Measurement Protocol naprawd\u0119 docieraj\u0105?<\/h3>\n<p>Nie po kodzie odpowiedzi, bo ten prawie zawsze wynosi 204. Skuteczne jest po\u0142\u0105czenie kontroli przed wysy\u0142k\u0105 i uzgadniania po niej:<\/p>\n<ol>\n<li>Ka\u017cdy nowy lub zmieniony \u0142adunek trafia najpierw na <code>\/debug\/mp\/collect<\/code>. Poniewa\u017c serwer walidacyjny zg\u0142asza tylko pierwszy b\u0142\u0105d, przebieg nale\u017cy powtarza\u0107, dop\u00f3ki nie przestan\u0105 wraca\u0107 komunikaty.<\/li>\n<li>To, czego serwer walidacyjny nie sprawdza, sprawdza w\u0142asny kod: najwy\u017cej 25 zdarze\u0144 na \u017c\u0105danie, niepuste events, zalecane nazwy zdarze\u0144, takie jak purchase, pisane ma\u0142ymi literami, brak zdarze\u0144 przeznaczonych tylko dla aplikacji w strumieniu sieciowym, value i currency przy purchase.<\/li>\n<li>Nadawca zapisuje, co wys\u0142a\u0142, na przyk\u0142ad dzienn\u0105 liczb\u0119 zdarze\u0144 purchase i ich transaction_id. Gdy kilka godzin p\u00f3\u017aniej raport jest gotowy, por\u00f3wnanie pokazuje, czy zdarze\u0144 brakuje.<\/li>\n<\/ol>\n<p>Tylko trzeci krok wykrywa tak\u017ce straty w bie\u017c\u0105cym dzia\u0142aniu, na przyk\u0142ad po wymianie sekretu API albo przy znaczniku czasu w z\u0142ej jednostce.<\/p>\n<h3>Co si\u0119 dzieje, gdy sekret API zostanie usuni\u0119ty albo wymieniony w administracji GA4?<\/h3>\n<p>Przy wysy\u0142ce nic widocznego: w pomiarze endpoint odpowiedzia\u0142 kodem 204 nawet na \u017c\u0105danie ca\u0142kiem bez danych dost\u0119powych, a serwer walidacyjny nie sprawdza measurement_id ani api_secret. Nadawca z nieaktualnym sekretem traci wi\u0119c zdarzenia niepostrze\u017cenie. Przy wymianie nale\u017cy najpierw przestawi\u0107 wszystkich nadawc\u00f3w, a dopiero potem usun\u0105\u0107 stary sekret.<\/p>\n<h3>Jak zdarzenia wysy\u0142ane z serwera maj\u0105 si\u0119 do zgody zebranej w przegl\u0105darce przez Consent Mode?<\/h3>\n<p>Wy\u0142\u0105cznie przez w\u0142asny kod. Obiekt consent w Measurement Protocol zna tylko ad_user_data i ad_personalization; klucza dla analytics_storage nie ma, a wys\u0142anie go mimo to czyni \u0142adunek nieczytelnym. Odmowy zgody na analityk\u0119 nie da si\u0119 wi\u0119c przekaza\u0107 endpointowi przez obiekt consent. Decyzja, czy dla tego klienta w og\u00f3le wys\u0142a\u0107 zdarzenie, musi zapa\u015b\u0107 wcze\u015bniej, we w\u0142asnym systemie.<\/p>\n<p>Dochodzi do tego identyfikator. Przy odrzuconym analytics_storage tag Google w przegl\u0105darce nie ustawia ciasteczka _ga, wi\u0119c serwer odczytuj\u0105cy z niego client_id niczego nie znajdzie. Zast\u0119pczy identyfikator wymy\u015blony na serwerze by\u0142by dok\u0142adnie t\u0105 kosztown\u0105 pomy\u0142k\u0105: nowym u\u017cytkownikiem z sesj\u0105 z\u0142o\u017con\u0105 z jednego zdarzenia.<\/p>\n<h3>Czy znacznik czasu w milisekundach trafia do roku 1970, czy w og\u00f3le nie dociera do raport\u00f3w?<\/h3>\n<p>Nie dociera, bo nie mie\u015bci si\u0119 w oknie 72 godzin. Dla chwili z przyk\u0142adowego \u0142adunku <code>Date.now()<\/code> zwraca warto\u015b\u0107 1\u00a0788\u00a0000\u00a0000\u00a0000. Odczytana jako mikrosekundy daje 1\u00a0788\u00a0000 sekund, oko\u0142o 20,7 dnia od pocz\u0105tku czasu uniksowego, czyli 21 stycznia 1970. Warto\u015b\u0107 w sekundach l\u0105duje nieca\u0142e p\u00f3\u0142 godziny po p\u00f3\u0142nocy 1 stycznia 1970. Oba znaczniki s\u0105 starsze ni\u017c 72 godziny i zostaj\u0105 odrzucone, a endpoint produkcyjny nadal odpowiada kodem 204.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/protocol\/ga4\" target=\"_blank\" rel=\"noopener noreferrer\">GA4 Measurement Protocol<\/a><\/li>\n<li><a href=\"https:\/\/support.google.com\/analytics\/answer\/9267744\" target=\"_blank\" rel=\"noopener noreferrer\">GA4 collection and configuration limits<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\" target=\"_blank\" rel=\"noopener noreferrer\">Google Analytics 4 developer guide<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Dziewi\u0119\u0107 \u017c\u0105da\u0144, siedem celowo uszkodzonych, trafi\u0142o na produkcyjny endpoint Measurement Protocol. Osiem wr\u00f3ci\u0142o w oko\u0142o 100 milisekund jako 204 No Content &#8211; w tym to, kt\u00f3re wcale nie by\u0142o JSON-em, i to bez \u017cadnych danych dost\u0119powych. Tu opisana jest pe\u0142na budowa \u0142adunku: ka\u017cde dozwolone pole, ka\u017cdy udokumentowany limit i miejsce, w kt\u00f3rym dwa z tych limit\u00f3w nie mieszcz\u0105 si\u0119 razem.<\/p>\n","protected":false},"author":1,"featured_media":19746,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[92097,92100,92136],"class_list":["post-17211","post","type-post","status-publish","format-standard","hentry","category-digital-analytics-pl","tag-data-quality-pl","tag-google-analytics-4-pl","tag-server-side-gtm-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Ka\u017cde pole i ka\u017cdy limit \u0142adunku Measurement Protocol w GA4, zmierzone: co endpoint przyjmuje po cichu, gdzie 25 zdarze\u0144 i 200 pozycji wchodz\u0105 sobie w drog\u0119 i czego nie sprawdza serwer walidacyjny.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Ka\u017cde pole i ka\u017cdy limit \u0142adunku Measurement Protocol w GA4, zmierzone: co endpoint przyjmuje po cichu, gdzie 25 zdarze\u0144 i 200 pozycji wchodz\u0105 sobie w drog\u0119 i czego nie sprawdza serwer walidacyjny.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-10T16:10:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON\",\"datePublished\":\"2026-10-10T16:10:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/\"},\"wordCount\":2309,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png\",\"keywords\":[\"Data Quality\",\"Google Analytics 4\",\"Server-Side GTM\"],\"articleSection\":[\"Digital Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/\",\"name\":\"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png\",\"datePublished\":\"2026-10-10T16:10:00+00:00\",\"description\":\"Ka\u017cde pole i ka\u017cdy limit \u0142adunku Measurement Protocol w GA4, zmierzone: co endpoint przyjmuje po cichu, gdzie 25 zdarze\u0144 i 200 pozycji wchodz\u0105 sobie w drog\u0119 i czego nie sprawdza serwer walidacyjny.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png\",\"width\":1200,\"height\":630,\"caption\":\"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON | Lukas Wojcik","description":"Ka\u017cde pole i ka\u017cdy limit \u0142adunku Measurement Protocol w GA4, zmierzone: co endpoint przyjmuje po cichu, gdzie 25 zdarze\u0144 i 200 pozycji wchodz\u0105 sobie w drog\u0119 i czego nie sprawdza serwer walidacyjny.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/","og_locale":"en_US","og_type":"article","og_title":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON | Lukas Wojcik","og_description":"Ka\u017cde pole i ka\u017cdy limit \u0142adunku Measurement Protocol w GA4, zmierzone: co endpoint przyjmuje po cichu, gdzie 25 zdarze\u0144 i 200 pozycji wchodz\u0105 sobie w drog\u0119 i czego nie sprawdza serwer walidacyjny.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-10T16:10:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON","datePublished":"2026-10-10T16:10:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/"},"wordCount":2309,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png","keywords":["Data Quality","Google Analytics 4","Server-Side GTM"],"articleSection":["Digital Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/","name":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png","datePublished":"2026-10-10T16:10:00+00:00","description":"Ka\u017cde pole i ka\u017cdy limit \u0142adunku Measurement Protocol w GA4, zmierzone: co endpoint przyjmuje po cichu, gdzie 25 zdarze\u0144 i 200 pozycji wchodz\u0105 sobie w drog\u0119 i czego nie sprawdza serwer walidacyjny.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-17211-ladunki-measurement-protocol-w-ga4-k-dn.png","width":1200,"height":630,"caption":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/ladunki-measurement-protocol-w-ga4-kazde-pole-kazdy-limit-i-dlaczego\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u0141adunki Measurement Protocol w GA4: ka\u017cde pole, ka\u017cdy limit i dlaczego endpoint odpowiada 204 na uszkodzony JSON"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=17211"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17211\/revisions"}],"predecessor-version":[{"id":21840,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/17211\/revisions\/21840"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/19746"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=17211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=17211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=17211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}