Przejdź do treści

~/www cat data-layer-w-gtm-poradnik.md

Data Layer w Google Tag Manager – poradnik krok po kroku z przykładami dla GA4

Czym jest data layer w Google Tag Manager i jak go wdrożyć: dataLayer.push, zmienne warstwy danych, reguły, e-commerce GA4 i debugowanie w trybie podglądu.

CZCzarek Zawolski--aktualizacja=--czas=7 min--dział=WWW i WordPress
Ilustracja przepływu danych ze strony internetowej do Google Tag Managera i narzędzi analitycznych
tldr.txt — W skrócie

~ xad tldr data-layer-w-gtm-poradnik

  • Data layer (warstwa danych) to tablica JavaScript window.dataLayer, przez którą strona przekazuje do Google Tag Managera informacje o stronie, użytkowniku i zdarzeniach.
  • Dane dodajesz wyłącznie przez dataLayer.push(), a inicjalizację window.dataLayer = window.dataLayer || [] umieszczasz przed kodem kontenera GTM.
  • W GTM odczytujesz wartości zmienną typu „Zmienna warstwy danych”, a zdarzenia wychwytujesz regułą „Zdarzenie niestandardowe” z nazwą z klucza event.
  • Dla e-commerce w GA4 używaj zdarzeń view_item, add_to_cart, purchase z obiektem ecommerce.items i czyść poprzedni obiekt przez push({ ecommerce: null }).
  • Każde wdrożenie sprawdzaj w trybie Podgląd (Tag Assistant) i nie wysyłaj do warstwy danych e-maili ani innych danych osobowych w jawnej postaci.
$ tree --spis-tresci

Data layer (warstwa danych) w Google Tag Manager to tablica JavaScript window.dataLayer, przez którą Twoja strona przekazuje do GTM uporządkowane informacje: jaki to typ strony, co jest w koszyku, że ktoś wysłał formularz albo złożył zamówienie. GTM odczytuje te dane i na ich podstawie uruchamia tagi GA4, Google Ads czy Meta Pixel — bez wyciągania czegokolwiek z HTML-a.

To najpewniejszy sposób śledzenia, bo dane pochodzą bezpośrednio z aplikacji, a nie z kruchego parsowania przycisków i klas CSS. W tym poradniku przejdziesz cały proces: od inicjalizacji, przez zmienne i reguły w GTM, po e-commerce w GA4 i debugowanie.

Czym jest data layer i dlaczego lepiej z niego korzystać

Bez warstwy danych GTM zgaduje. Wartość zamówienia odczytuje ze strony z podziękowaniem regułą „Element DOM”, a kliknięcie „Dodaj do koszyka” — po klasie przycisku. Wystarczy, że ktoś przebuduje szablon, i dane przestają spływać, często niezauważenie.

Z warstwą danych podział ról jest czysty:

  • programista wysyła dane w ustalonym formacie (dataLayer.push(...)),
  • marketing / analityk w GTM decyduje, które tagi i kiedy mają te dane wykorzystać.

Zmiana wyglądu strony nie psuje pomiarów, a te same dane można przekazać do wielu narzędzi naraz.

Technicznie GTM nie czyta tablicy bezpośrednio. Każdy push jest przetwarzany przez wewnętrzny model danych kontenera: nowe klucze są dopisywane, a istniejące nadpisywane. Dlatego wartość ustawiona raz (np. pageType) jest dostępna dla wszystkich kolejnych zdarzeń na tej samej stronie, ale znika po przeładowaniu — warstwa danych nie przechodzi między odsłonami.

Krok 1: inicjalizacja dataLayer przed kodem kontenera GTM

W sekcji <head>, nad fragmentem kodu kontenera Google Tag Managera, umieść inicjalizację i dane, które są znane od razu przy ładowaniu strony:

<script>
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({
    pageType: 'produkt',
    pageCategory: 'routery-lte',
    userStatus: 'zalogowany',
    language: 'pl'
  });
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){ /* standardowy kod kontenera GTM */ })(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
<!-- End Google Tag Manager -->

Dlaczego taka kolejność? Dzięki temu wartości są w modelu danych już przy pierwszym zdarzeniu kontenera, więc możesz ich użyć np. w regule odsłony strony.

Uwaga: Nigdy nie pisz dataLayer = [{...}] po załadowaniu kodu GTM. Takie przypisanie zastępuje tablicę, którą GTM już obserwuje, i kolejne dane przestają do niego trafiać. Zawsze używaj window.dataLayer = window.dataLayer || [] i push().

Krok 2: wysyłanie zdarzeń przez dataLayer.push()

Zdarzenia wysyłasz w momencie, gdy coś się dzieje. Klucz event jest specjalny — to po nim GTM rozpoznaje zdarzenie i może uruchomić regułę.

Przykład: formularz kontaktowy wysłany poprawnie (po odpowiedzi serwera, nie po kliknięciu przycisku):

fetch('/api/kontakt', { method: 'POST', body: new FormData(form) })
  .then((res) => {
    if (res.ok) {
      window.dataLayer.push({
        event: 'form_submit_success',
        formId: 'kontakt-stopka',
        formType: 'kontakt'
      });
    }
  });

Kilka zasad nazewnictwa, które oszczędzą Ci kłopotów:

  1. Ustal jeden styl (np. snake_case dla zdarzeń, camelCase dla parametrów) i trzymaj się go — GTM rozróżnia wielkość liter.
  2. Nazywaj zdarzenia według tego, co się stało (newsletter_signup), a nie według elementu (button_click_3).
  3. Spisz wszystkie zdarzenia i parametry w jednym dokumencie (specyfikacja warstwy danych), który dostaje programista i analityk.

Krok 3: zmienne warstwy danych w GTM

Żeby wykorzystać wartość z warstwy danych w tagu, utwórz zmienną:

  1. W GTM przejdź do Zmienne → sekcja Zmienne zdefiniowane przez użytkownika → Nowa.
  2. Wybierz typ Zmienna warstwy danych (Data Layer Variable).
  3. W polu Nazwa zmiennej warstwy danych wpisz klucz dokładnie tak, jak w kodzie, np. formType.
  4. Dla danych zagnieżdżonych użyj kropek, np. ecommerce.transaction_id albo ecommerce.items.0.item_name (pierwszy element tablicy).
  5. Zostaw Wersja 2 (domyślna) — obsługuje notację kropkową i scalanie obiektów.
  6. Opcjonalnie ustaw wartość domyślną, np. (brak), żeby w raportach zamiast undefined widzieć czytelny opis.

Nazwij zmienną z prefiksem, np. DLV - formType, żeby od razu było widać, skąd pochodzi.

Krok 4: reguła „Zdarzenie niestandardowe” i tag GA4

Teraz połącz zdarzenie z tagiem:

  1. Reguły → Nowa → typ Zdarzenie niestandardowe. Jako nazwę zdarzenia wpisz form_submit_success (dokładnie jak w push). Możesz zaznaczyć dopasowanie wyrażeniem regularnym, jeśli chcesz objąć kilka zdarzeń naraz.
  2. Tagi → Nowy → Google Analytics: zdarzenie GA4. Podaj identyfikator pomiaru (lub wybierz istniejący Tag Google), nazwę zdarzenia, np. generate_lead.
  3. W Parametrach zdarzenia dodaj form_type z wartością {{DLV - formType}}.
  4. Jako regułę uruchamiania wybierz utworzone zdarzenie niestandardowe.
  5. Zapisz i przejdź do testów (krok 6), zanim opublikujesz kontener.

Pamiętaj, że niestandardowe parametry zdarzeń trzeba zarejestrować w GA4 jako wymiary niestandardowe (Administracja → Definicje niestandardowe), żeby pojawiły się w raportach.

Jeśli Twoja strona używa banera zgód, konfiguracja tagów musi współgrać z trybem uzyskiwania zgody — szczegóły znajdziesz w poradniku Google Consent Mode v2.

Krok 5: data layer dla e-commerce w GA4

Stary model Enhanced Ecommerce z Universal Analytics jest nieaktualny — UA przestało przetwarzać dane w 2023 roku. GA4 ma własny zestaw rekomendowanych zdarzeń: view_item_list, select_item, view_item, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info, purchase, refund.

Przykład zdarzenia zakupu na stronie z podziękowaniem:

window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null }); // wyczyść poprzedni obiekt ecommerce
window.dataLayer.push({
  event: 'purchase',
  ecommerce: {
    transaction_id: 'ZAM-2026-10452',
    value: 234.98,       // suma price × quantity, bez wysyłki
    shipping: 14.99,
    currency: 'PLN',
    coupon: 'JESIEN10',
    items: [
      { item_id: 'SKU-123', item_name: 'Router LTE', item_brand: 'Huawei', item_category: 'Routery', price: 199.99, quantity: 1 },
      { item_id: 'SKU-456', item_name: 'Antena zewnętrzna', item_category: 'Anteny', price: 34.99, quantity: 1 }
    ]
  }
});

Po co ecommerce: null? Model danych GTM scala obiekty, więc bez wyczyszczenia produkty z poprzedniego zdarzenia (np. add_to_cart) mogłyby „przykleić się” do kolejnego.

W GTM nie musisz tworzyć zmiennej dla każdego pola. W tagu Google Analytics: zdarzenie GA4 rozwiń Więcej ustawień → E-commerce, zaznacz Wysyłaj dane e-commerce i jako źródło wybierz Warstwa danych. Tag sam pobierze obiekt ecommerce. Jako nazwę zdarzenia możesz użyć wbudowanej zmiennej {{Event}}, a jedną regułą obsłużyć wszystkie zdarzenia e-commerce (wyrażenie regularne, np. ^(view_item|add_to_cart|begin_checkout|purchase)$).

Ważne: Wartości liczbowe (price, value) wysyłaj jako liczby, nie teksty z przecinkiem („199,99”). Zabezpiecz też stronę podziękowania przed ponownym wysłaniem purchase po odświeżeniu — np. wysyłając zdarzenie tylko raz dla danego transaction_id.

WordPress i WooCommerce

Na WordPressie nie musisz pisać tego ręcznie. Wtyczka GTM4WP (Google Tag Manager for WordPress) wstawia kod kontenera i potrafi generować warstwę danych WooCommerce w formacie GA4. Sprawdź tylko, czy nie dublujesz pomiaru — np. gdy GA4 jest jednocześnie wpięte przez inną wtyczkę. Jeśli konfigurujesz sklep od zera, przydadzą się też poradniki o płatnościach Stripe w WooCommerce i SEO sklepu internetowego.

Krok 6: testowanie i debugowanie warstwy danych

Zanim klikniesz Prześlij, uruchom Podgląd w GTM. Otworzy się Tag Assistant połączony z Twoją stroną.

  1. Wykonaj akcję na stronie (wyślij formularz, dodaj produkt do koszyka).
  2. W lewym panelu Tag Assistanta kliknij odpowiednie zdarzenie, np. form_submit_success.
  3. Zakładka Tags pokaże, które tagi się uruchomiły, a które nie i dlaczego.
  4. Zakładka Variables pokaże wartości zmiennych w tym momencie.
  5. Zakładka Data Layer pokaże dokładnie, co zostało wypchnięte i jak wygląda scalony model danych.

Szybki podgląd możesz też zrobić w konsoli przeglądarki (F12), wpisując dataLayer — zobaczysz całą tablicę z kolejnymi wpisami. W GA4 dane w czasie zbliżonym do rzeczywistego sprawdzisz w raporcie DebugView (Administracja → Wyświetlanie danych → DebugView), gdy aktywny jest podgląd GTM.

Najczęstsze błędy przy wdrażaniu data layer

ProblemPrzyczynaRozwiązanie
Zmienna zwraca undefinedLiterówka lub inna wielkość liter w nazwie klucza, brak notacji kropkowejPorównaj nazwę z zakładką Data Layer w podglądzie
Tag nie uruchamia sięBrak klucza event w push lub inna nazwa w reguleDodaj event i skopiuj nazwę 1:1
GTM przestał widzieć danedataLayer = [...] nadpisało tablicę po załadowaniu GTMUżywaj wyłącznie push()
Produkty z poprzedniego kroku w zakupieBrak czyszczenia obiektu ecommercedataLayer.push({ ecommerce: null }) przed każdym zdarzeniem e-commerce
Zdublowane transakcjeOdświeżenie strony podziękowania, podwójny tag GA4Wysyłka raz na transaction_id, przegląd wtyczek i tagów
Dane osobowe w GA4E-mail lub telefon w parametrachUsuń je z warstwy danych lub nie przekazuj do tagów GA4

W aplikacjach typu SPA (React, Vue, Angular) pamiętaj, że przejście między widokami nie przeładowuje strony. Wysyłaj wtedy własne zdarzenie, np. virtual_page_view, z adresem i tytułem nowego widoku, albo korzystaj z reguły „Zmiana historii” w GTM.

Od czego zacząć we własnym projekcie

Nie próbuj od razu śledzić wszystkiego. Zacznij od dwóch–trzech zdarzeń, które naprawdę mają znaczenie dla biznesu: wysłanie formularza, zapis do newslettera, zakup. Spisz je w krótkiej specyfikacji, wdroż push w kodzie, zbuduj zmienne, reguły i tagi, przetestuj w podglądzie i dopiero wtedy publikuj kontener z opisem wersji.

Pamiętaj też o wydajności — każdy tag w GTM to dodatkowy skrypt ładowany przez przeglądarkę. Po większych zmianach warto sprawdzić czas ładowania, np. narzędziem opisanym w artykule o analizie wydajności stron z WebPageTest.

~ man faq

Najczęściej zadawane pytania

Co to jest data layer?

To obiekt JavaScript, najczęściej tablica window.dataLayer, w której strona zapisuje ustrukturyzowane dane o sobie i o działaniach użytkownika. Google Tag Manager odczytuje je i przekazuje do narzędzi takich jak GA4 czy Google Ads.

Gdzie umieścić kod data layer na stronie?

Inicjalizację i dane dostępne od początku (np. typ strony) umieść w sekcji head nad fragmentem kodu kontenera GTM. Zdarzenia, takie jak wysłanie formularza czy dodanie do koszyka, wysyłasz przez dataLayer.push() w momencie, w którym zachodzą.

Dlaczego zmienna warstwy danych w GTM zwraca undefined?

Najczęściej nazwa w zmiennej nie zgadza się z kluczem w push (wielkość liter ma znaczenie), ścieżka zagnieżdżona jest wpisana bez kropek albo tag uruchamia się wcześniej, niż dane trafiły do warstwy danych. Sprawdź to w zakładce Data Layer w trybie podglądu.

Czy Enhanced Ecommerce nadal działa?

Nie w nowych wdrożeniach. Enhanced Ecommerce był częścią Universal Analytics, które przestało przetwarzać dane w 2023 roku. W GA4 obowiązuje nowy schemat zdarzeń e-commerce, np. view_item, add_to_cart i purchase z tablicą items.

Czy do data layer można wysyłać adres e-mail użytkownika?

Do Google Analytics nie wolno przesyłać danych umożliwiających identyfikację osoby. Jeśli e-mail jest potrzebny np. do rozszerzonych konwersji Google Ads, przekazuj go zgodnie z dokumentacją tej funkcji, po uzyskaniu zgody i najlepiej w postaci zahaszowanej.

Ten artykuł jest częścią tematu

CZ

$ whoami

Czarek Zawolski

Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.

~ ls ../podobne