DataLayer – jak zaprojektować strukturę, która nie zawiedzie za pół roku
Każdy DataLayer zaczyna się niewinnie. Jedno zdarzenie purchase, jedno add_to_cart. Potem przychodzi potrzeba śledzenia formularzy. Potem nowe narzędzie marketingowe, które potrzebuje własnych pól. Po pół roku nikt już nie pamięta, co każdy klucz oznacza, a każda zmiana w GTM grozi awarią. Oto jak tego uniknąć.
Dlaczego większość DataLayerów umiera po trzech miesiącach
Problem nie leży w GTM ani w GA4. Problem leży w tym, że DataLayer jest traktowany jak śmietnik: każdy developer wrzuca tam swoje dane w formacie, który akurat miał pod ręką. Efekt? Po kilku miesiącach masz trzydzieści różnych nazw dla tego samego zdarzenia (sign_up, signup, user_signup, register) i zero spójności.
Rozwiązanie jest proste, ale wymaga dyscypliny: konwencja nazewnicza przed pierwszym pushem. Nie po trzecim. Nie przy okazji redesignu. Zanim ktokolwiek wywoła dataLayer.push(), wszyscy muszą znać reguły gry.
Zasada pierwsza: jeden format nazw zdarzeń
Wybierz jedną konwencję i trzymaj się jej bezwzględnie. Dwie najczęściej stosowane:
- snake_case:
add_to_cart,begin_checkout,form_submit. Zgodne ze standardem GA4 ecommerce. Zalecane dla nowych wdrożeń. - PascalCase z prefiksem:
UserSignedUp,ProductViewed. Czytelne dla developerów, ale wymaga mapowania w GTM.
Nie mieszaj. Jeśli połowa zdarzeń używa snake_case, a druga połowa camelCase, GTM będzie wymagał osobnych triggerów i zmiennych dla każdego wariantu. To podwaja pracę przy każdej zmianie.
Zasada druga: struktura hierarchiczna zamiast płaskiej
Płaski DataLayer wygląda tak:
dataLayer.push({
event: "purchase",
transaction_id: "T123",
value: "149.99",
currency: "PLN",
product_name: "Kurs GA4",
product_category: "Szkolenia",
product_price: "149.99",
product_quantity: "1"
});
Problem: co jeśli w koszyku są dwa produkty? Dokładasz product2_name, product2_price? A przy trzech?
Struktura hierarchiczna rozwiązuje to raz na zawsze:
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "T123",
value: "299.97",
currency: "PLN",
items: [
{ item_name: "Kurs GA4", item_category: "Szkolenia", price: "149.99", quantity: 1 },
{ item_name: "Audyt GTM", item_category: "Audyt", price: "149.98", quantity: 1 }
]
}
});
Tablica items obsługuje dowolną liczbę produktów. GA4 ecommerce już jej oczekuje. GTM odczytuje ją bez dodatkowej konfiguracji. Nie wymyślaj koła na nowo – używaj standardu, który już istnieje.
Zasada trzecia: dokumentujesz albo giniesz
Największy mit w analityce: „nasz DataLayer jest tak prosty, że nie potrzebuje dokumentacji". Za trzy miesiące developer, który go tworzył, zmieni pracę. Za sześć miesięcy nikt nie będzie pamiętał, co oznacza klucz user_type i jakie przyjmuje wartości.
Minimalna dokumentacja DataLayer to jedna tabelka w README repo:
- Nazwa zdarzenia:
purchase,add_to_cart,login - Trigger: która strona / akcja użytkownika je wyzwala
- Klucze i typy:
value: number,currency: string,items: array - Dozwolone wartości:
currencyto zawsze kod ISO (PLN, EUR, USD), nie „zł" ani „złotówki"
Bez tego każda nowa osoba w zespole spędzi pierwszy tydzień na reverse-engineeringu własnego trackingu. A to kosztuje więcej niż godzina spędzona na dokumentacji.
Zasada czwarta: GTM nie jest od naprawiania DataLayer
Częsty antywzorzec: developer wysyła do DataLayer surowe dane w formacie „jak leci", a potem GTM próbuje to poskładać regexami, zmiennymi CSS i lookup tables. To działa – przez miesiąc. Potem ktoś zmienia klasę w HTML i tracking się sypie.
DataLayer powinien dostarczać GTM dane gotowe do użycia. Jeśli GTM potrzebuje dodatkowego przetwarzania, coś jest nie tak z DataLayer. Napraw źródło, nie skutek.
Lista kontrolna przed pierwszym pushem
- Konwencja nazw zdarzeń jest jedna i udokumentowana (snake_case albo PascalCase, nie oba).
- Zdarzenia ecommerce używają standardowej struktury GA4 (
ecommerce.itemsjako tablica). - Każdy klucz ma zdefiniowany typ i format (np.
valueto zawsze number,currencyto zawsze kod ISO). - Dokumentacja DataLayer istnieje w README repo i jest aktualizowana przy każdej zmianie.
- Żaden tag w GTM nie polega na selektorach CSS zamiast na danych z DataLayer.
Dobre nawyki, które procentują
Poza samą strukturą, trzy rzeczy, które oszczędzą Ci nerwów:
- Wersjonuj DataLayer. Dodaj klucz
dl_version: "2.1"do każdego pusha. Gdy za rok będziesz debugować stary kod, od razu zobaczysz, która wersja konwencji była aktywna. - Testuj w GTM Preview przed produkcją. Brzmi oczywiście, ale 70% awarii trackingu, które widzimy u klientów, pochodzi z wdrożeń, które nikt nie sprawdził w Preview Mode przed publikacją.
- Nie kasuj starych kluczy bez uprzedzenia. Jeśli zmieniasz nazwę
user_idnacustomer_id, przez okres przejściowy wysyłaj oba. Tagi w GTM potrzebują czasu na migrację.
Potrzebujesz pomocy z DataLayer? Napisz do nas – zaprojektujemy strukturę, która przeżyje rotację zespołu, redesign i trzy nowe narzędzia marketingowe.