LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Digital Analytics / Measurement Protocol w GA4: dane, limity i...
Ten artykuł w innych językach:

Measurement Protocol w GA4: dane, limity i kontrola przed wysyłką

Measurement Protocol w GA4: dane, limity i kontrola przed wysyłką

Management Summary

Measurement Protocol w GA4 pozwala systemom firmy przesyłać zdarzenia bezpośrednio do Google Analytics, na przykład płatność potwierdzoną dopiero po wizycie na stronie. Dzięki temu późniejszy wynik biznesowy może zostać powiązany z wcześniejszą aktywnością online i uzupełnić raporty. Potrzebne są zgodne identyfikatory, poprawne daty oraz dopuszczalność przetwarzania danych. Samo potwierdzenie odbioru nie oznacza jeszcze, że zakup trafił do raportu i został przypisany do właściwej wizyty.

Spis treści
  1. Adres, sekret i zawartość
  2. Mały przykład zakupu
  3. Pola opcjonalne z konkretnym celem
  4. Nazwy i ważne limity
  5. Znaczniki czasu bez pomyłek jednostek
  6. Zgoda i walidacja
  7. Pytania i odpowiedzi
  8. Źródła

Measurement Protocol przesyła zdarzenia z serwera do Google Analytics 4. Przykładem jest potwierdzenie płatności, które dociera później od operatora płatności. Ładunek oznacza zawartość takiego przesłania: dokument JSON z identyfikatorami i danymi zdarzeń. Protokół uzupełnia zbieranie danych przez tag Google lub SDK Firebase. Żądanie z serwera nie zastępuje pełnej integracji w przeglądarce ani decyzji o dopuszczalnym przetwarzaniu danych.

Najważniejsze rozróżnienie jest proste: odpowiedź HTTP z zakresu 2xx potwierdza odebranie żądania, a nie obecność zdarzenia w raporcie. Błędne dane również mogą nie wywołać miarodajnego błędu HTTP. Stały kod 204 dla każdego możliwego żądania nie jest jednak gwarantowaną właściwością interfejsu.

Trzy kontrole Measurement Protocol: lokalne sprawdzenie danych, serwer walidacyjny i porównanie z raportami.
Odebranie, walidacja i obecność w raporcie to osobne kontrole.

Adres, sekret i zawartość

Przesłanie odbywa się przez HTTPS POST na https://www.google-analytics.com/mp/collect. Do zbierania danych w UE Google dokumentuje adres https://region1.google-analytics.com/mp/collect. Sam ten adres nie stanowi gwarancji, że wszystkie późniejsze etapy przetwarzania odbywają się wyłącznie w UE.

Dla strumienia internetowego measurement_id i api_secret trafiają do parametrów URL. Identyfikator pomiaru wskazuje strumień, a sekret API uprawnia do przesyłania danych. Tylko sekret jest poufny. Kod przeglądarki, publiczne repozytoria i nieoczyszczone logi adresów URL nie są odpowiednim miejscem na sekret. Strumienie aplikacji używają firebase_app_id zamiast identyfikatora pomiaru.

JSON zawiera client_id dla zdarzeń internetowych albo app_instance_id dostarczony przez SDK Firebase dla aplikacji. Powiązanie zdarzenia z wcześniejszą wizytą wymaga zgodności Client ID z identyfikatorem tagu Google. Nowa losowa wartość przy każdej płatności utrudnia to powiązanie i może zniekształcać liczbę użytkowników. Nie oznacza jednak automatycznie nowej sesji przy każdym żądaniu.

Mały przykład zakupu

Poniższy JSON przedstawia strukturę zakupu internetowego. Wszystkie identyfikatory i czas zaangażowania są przykładowe; rzeczywiste przesłanie wymaga odpowiednich wartości. Opcjonalny czas zaangażowania musi odzwierciedlać faktycznie zmierzony czas od poprzedniego zdarzenia. Sama płatność obsłużona w tle nie dostarcza takiego pomiaru. Bez historycznego znacznika czasu obowiązuje chwila odebrania danych.

JSON
{
  "client_id": "1234567890.1700000000",
  "events": [
    {
      "name": "purchase",
      "params": {
        "transaction_id": "T-8891",
        "currency": "EUR",
        "value": 20,
        "session_id": 1700000000,
        "engagement_time_msec": 100,
        "items": [
          {
            "item_id": "A-1",
            "price": 10,
            "quantity": 2
          }
        ]
      }
    }
  ]
}

Wartość towaru wynosi tutaj 10 euro razy dwie sztuki. value zawiera sumę za towary bez oddzielnie wykazanych kosztów dostawy i podatków, a currency określa walutę. Stały, unikalny transaction_id pomaga unikać podwójnego zliczania zakupu. Ponowienie tego samego przesłania technicznego nie może więc tworzyć nowego numeru zamówienia.

session_id łączy zdarzenie z sesją; nowy identyfikator sesji może utworzyć nową sesję. engagement_time_msec opisuje czas zaangażowania w milisekundach. Obie wartości pomagają w obliczaniu wskaźników sesji i zaangażowania oraz w raportach czasu rzeczywistego. Brak wartości wyjaśnia możliwe luki, lecz nie dowodzi nieobecności zdarzenia w każdym raporcie.

Pola opcjonalne z konkretnym celem

user_id to opcjonalny wewnętrzny identyfikator użytkownika. Adresy e-mail i numery telefonów nie należą do tego pola, zwykłych parametrów zdarzeń ani właściwości użytkownika. Osobna funkcja user_data ma własne warunki i zasady przygotowania danych, w tym normalizację oraz haszowanie określonych informacji. To pole nie zezwala na dowolne dane osobowe.

user_properties opisuje cechy, na przykład poziom klienta. user_location, ip_override i device mogą dostarczać informacji o lokalizacji lub urządzeniu. Dodatkowe dane wymagają znanego pochodzenia, odpowiedniej dokładności i dopuszczalnego celu użycia. Niezmieniony obiekt dataLayer nie pasuje automatycznie do protokołu. Własne pola wymagają przyporządkowania i sprawdzenia według dokumentacji; nieznany klucz nie oznacza udokumentowanej utraty całego żądania w każdym przypadku.

Nazwy i ważne limity

Zalecane nazwy zdarzeń mają określone znaczenie. purchase oznacza zakup, a Purchase z wielką literą jest inną nazwą. Nazwy zastrzeżone, takie jak session_start, nie zastępują poprawnego identyfikatora sesji. screen_view, ad_impression i in_app_purchase są przeznaczone dla strumieni aplikacji.

PoleLimit
Treść JSONponiżej 130 kB
Zdarzenia na żądanie25
Parametry na zdarzenie25
Nazwa zdarzenia / parametru40 znaków
Właściwości użytkownika na żądanie25
Nazwa / wartość właściwości24 / 36 znaków
Tekstowa wartość parametru100 znaków; 500 dla Analytics 360
Własne parametry pozycji10 według instrukcji wysyłania; rozbieżność poniżej

Instrukcja wysyłania podaje najwyżej dziesięć własnych parametrów pozycji, natomiast dokumentacja zdarzenia purchase podaje 27. Do wyjaśnienia tej rozbieżności dziesięć jest ostrożniejszym limitem dla żądań Measurement Protocol. Tabela zbiera często istotne ograniczenia, ale nie zastępuje dokumentacji konkretnego zdarzenia.

Znaki i bajty to różne wielkości. Polska litera może zajmować kilka bajtów UTF-8. Rozmiar żądania zależy zatem od gotowego JSON-a, na przykład wyniku Buffer.byteLength(JSON.stringify(payload), 'utf8') w Node.js. Nie istnieje stała granica 29 pozycji na zdarzenie: dłuższe nazwy produktów i dodatkowe pola zmieniają rozmiar. Paczka musi jednocześnie spełniać limit liczby zdarzeń i limit bajtów.

Znaczniki czasu bez pomyłek jednostek

timestamp_micros używa mikrosekund od 1 stycznia 1970 r. Dla istniejącego czasu zdarzenia w JavaScripcie, wyrażonego w milisekundach, eventTimeMs * 1000 daje wymaganą jednostkę. Liczba milisekund omyłkowo przesłana jako mikrosekundy matematycznie wskazuje datę w 1970 r.

Dla znaczników starszych niż 72 godziny Google rozróżnia dwa przypadki. Bez validation_behavior albo przy RELAXED czas zostaje przesunięty na 72 godziny przed odebraniem danych. Przy ENFORCE_RECOMMENDATIONS zdarzenie zostaje odrzucone. Pomyłka jednostek może więc spowodować błędne umiejscowienie w czasie zamiast całkowitej utraty zdarzenia.

Instrukcja wysyłania dodatkowo wskazuje 48-godzinne okno dla łączenia ze zdarzeniami wcześniej zebranymi przez tag lub SDK. Samo dozwolone datowanie wstecz nie gwarantuje prawidłowego przypisania do reklamy lub wcześniejszej wizyty.

Kolejna rozbieżność w dokumentacji dotyczy czasu pojedynczego zdarzenia: instrukcja wysyłania umieszcza timestamp_micros bezpośrednio w zdarzeniu, a opis pól wymienia wartość w parametrach zdarzenia. Proste rozwiązanie używa jednoznacznie udokumentowanego czasu na poziomie żądania i grupuje wyłącznie zdarzenia o tym samym czasie. Różne czasy wymagają wtedy osobnych żądań.

Zgoda i walidacja

Obiekt consent obsługuje ad_user_data i ad_personalization z wartościami GRANTED lub DENIED. Bez tego obiektu GA4 korzysta z ustawień powiązanych interakcji online. analytics_storage i ad_storage nie są tutaj udokumentowanymi polami. Nadawca potrzebuje więc osobnej decyzji o dopuszczalności przesłania przed wysyłką. Brak Client ID lub blokada reklam nie uzasadnia obchodzenia odmowy za pomocą wymyślonych identyfikatorów. non_personalized_ads jest przestarzałe; zastępuje je consent.ad_personalization.

Adres walidacyjny /debug/mp/collect zwraca validationMessages. Te zdarzenia testowe nie pojawiają się w raportach. Google zaleca ENFORCE_RECOMMENDATIONS w testach i pominięcie validation_behavior w produkcji. Pusta lista komunikatów nadal nie potwierdza działania całej drogi: serwer walidacyjny nie sprawdza identyfikatora strumienia ani sekretu API.

Pytania i odpowiedzi

Co pozwala sprawdzić przesłanie danych?

Trzy osobne kontrole mają różne zadania: kod nadawcy sprawdza wymagane pola, typy, limity i kwoty zakupów; serwer walidacyjny bada nowe ładunki; następnie kontrolowane rzeczywiste przesłanie jest porównywane z raportami we właściwej usłudze testowej. W produkcji pomagają zbiorcze liczby wysłanych zdarzeń i oszczędnie przechowywane powiązania techniczne. Pełne ładunki i sekrety nie należą do zwykłych logów.

Co jest ważne przy wymianie sekretu API?

Nowy sekret trafia do odpowiednich nadawców i przechodzi kontrolę przez rzeczywiste przesłanie, zanim stary sekret zostanie usunięty. Sukces HTTP i pusta lista komunikatów walidacyjnych nie dowodzą, że nowy sekret prowadzi do właściwej usługi.

Czy żądanie z serwera zastępuje brakujący pomiar w przeglądarce?

Measurement Protocol uzupełnia zbieranie przez tag. Żądanie z serwera nie odtwarza automatycznie brakujących identyfikatorów, decyzji dotyczących zgody ani informacji o sesji. Płatność może zostać technicznie przesłana bez zapewnienia wszystkich powiązań w raportach.

Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA do ochrony przed spamem.

Napisanie komentarza

Odmienne wyniki z innych kont i pytania o konfigurację są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.