Spis treści
- Czym jest warstwa danych i dlaczego sklep potrzebuje specyfikacji
- Lista zdarzeń e-commerce GA4 i moment ich wysyłki
- Parametry produktu w tablicy items
- Przykładowy kod dataLayer e-commerce: karta produktu i zakup
- Zasady, które musisz zapisać w specyfikacji dla programisty
- Dane klienta i Enhanced Conversions w warstwie danych
- Jak odebrać dane w GTM i przetestować wdrożenie
- Najczęstsze błędy w implementacji dataLayer e-commerce
- Najczęściej zadawane pytania
dataLayer e-commerce to ustandaryzowany sposób, w jaki sklep przekazuje do Google Tag Managera informacje o produktach, koszyku i zamówieniach – w formacie zgodnym ze zdarzeniami rekomendowanymi GA4. Programista wysyła do obiektu window.dataLayer komunikaty takie jak view_item, add_to_cart czy purchase z listą produktów items, a GTM odczytuje je i przekazuje do GA4, Google Ads czy Meta. Poniżej znajdziesz specyfikację, którą możesz niemal bez zmian przekazać programiście: listę zdarzeń, parametry, przykłady kodu i zasady, które w praktyce najczęściej są pomijane.
Najważniejsze w skrócie
- Pełna specyfikacja dataLayer e-commerce obejmuje około 10 zdarzeń, od
view_item_listpopurchase, z tablicąitemsw każdym z nich. - Przed każdym zdarzeniem e-commerce czyść poprzedni obiekt komunikatem
{ ecommerce: null }, żeby dane produktów się nie mieszały. - Kwoty przekazuj jako liczby, walutę jako kod ISO 4217 (PLN), a
item_idutrzymuj zgodny z identyfikatorem produktu w feedzie. - Parametr
valuew zakupie to sumaprice × quantitypo rabatach; kosztów dostawy nie doliczaj, tylko przekaż je w osobnym parametrzeshipping. - Zdarzenie
purchasewysyłaj tylko raz na zamówienie, z unikalnymtransaction_id, którego odświeżenie strony podziękowania nie powtórzy.
Czym jest warstwa danych i dlaczego sklep potrzebuje specyfikacji
Warstwa danych to obiekt JavaScript, do którego strona dopisuje komunikaty o tym, co się wydarzyło, a GTM je odczytuje. Specyfikacja to umowa między marketingiem a programistą: określa, jakie zdarzenia, kiedy i z jakimi polami mają się pojawić.
Bez takiej umowy pomiar opiera się na odczytywaniu danych z wyglądu strony: ceny z elementu na karcie produktu, nazwy z nagłówka, kwoty zamówienia z tabeli podsumowania. Działa to do pierwszej zmiany szablonu. Warstwa danych oddziela pomiar od wyglądu – programista przekazuje dane bezpośrednio z systemu sklepu, a marketer decyduje w GTM, gdzie je wysłać. Te same komunikaty obsłużą GA4, tag konwersji Google Ads z danymi koszyka, Meta Pixel i inne narzędzia. Jeśli dopiero zaczynasz pracę z kontenerem, najpierw przeczytaj tekst Google Tag Manager od podstaw.
Lista zdarzeń e-commerce GA4 i moment ich wysyłki
GA4 ma zestaw rekomendowanych nazw zdarzeń e-commerce i tylko przy nich wypełnia raporty zakupów i produktów. Nazwy muszą być zapisane dokładnie tak jak w tabeli, małymi literami.
| Zdarzenie | Kiedy wysłać | Parametry poza items |
|---|---|---|
| view_item_list | Wyświetlenie listy produktów: kategoria, wyniki wyszukiwania, polecane | item_list_id, item_list_name |
| select_item | Kliknięcie produktu na liście | item_list_id, item_list_name |
| view_item | Wyświetlenie karty produktu | currency, value |
| add_to_wishlist | Dodanie do ulubionych | currency, value |
| add_to_cart | Dodanie do koszyka, także z listy | currency, value |
| remove_from_cart | Usunięcie z koszyka | currency, value |
| view_cart | Wyświetlenie koszyka | currency, value |
| begin_checkout | Rozpoczęcie składania zamówienia | currency, value, coupon |
| add_shipping_info | Wybór formy dostawy | currency, value, shipping_tier |
| add_payment_info | Wybór formy płatności | currency, value, payment_type |
| purchase | Potwierdzenie zamówienia | transaction_id, currency, value, tax, shipping, coupon |
| refund | Zwrot całkowity lub częściowy | transaction_id, currency, value |
Minimum, bez którego raporty sprzedaży nie mają sensu, to view_item, add_to_cart, begin_checkout i purchase. Pozostałe zdarzenia pozwalają zbudować pełny lejek i sprawdzić, na którym etapie odpadają klienci. Zwroty zwykle obsługuje się nie w przeglądarce, ale z systemu sklepu, bo klient nie odwiedza wtedy strony.
Parametry produktu w tablicy items
Tablica items występuje w każdym zdarzeniu e-commerce i zawiera po jednym obiekcie na produkt. Każdy obiekt musi mieć co najmniej item_id lub item_name, ale w praktyce przekazuj oba.
| Parametr | Typ | Przykład | Uwagi |
|---|---|---|---|
| item_id | tekst | SKU-1042 | Taki sam jak identyfikator w feedzie |
| item_name | tekst | Konewka ogrodowa 5 l | Bez kodów i zbędnych dopisków |
| price | liczba | 129.99 | Cena jednostkowa po rabacie |
| quantity | liczba całkowita | 2 | Domyślnie 1, ale przekazuj zawsze |
| discount | liczba | 20.00 | Rabat na jedną sztukę |
| item_brand | tekst | GreenLine | Marka produktu |
| item_category – item_category5 | tekst | Ogród / Podlewanie | Do pięciu poziomów hierarchii |
| item_variant | tekst | zielona | Kolor, rozmiar, wersja |
| item_list_name | tekst | Kategoria: Podlewanie | Lista, z której wybrano produkt |
| index | liczba | 3 | Pozycja na liście |
| coupon | tekst | JESIEN10 | Kupon przypisany do produktu |
Zgodność item_id z feedem produktowym ma znaczenie nie tylko dla porządku. Google Ads przy konwersjach z danymi koszyka łączy produkty z zamówienia z produktami z Merchant Center właśnie po identyfikatorze. Jak utrzymać feed bez błędów, opisujemy w artykule o najczęstszych odrzuceniach w Merchant Center.
Przykładowy kod dataLayer e-commerce: karta produktu i zakup
Każde zdarzenie e-commerce składa się z dwóch komunikatów: wyczyszczenia poprzedniego obiektu ecommerce i właściwego zdarzenia. Poniżej wzór dla karty produktu.
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'view_item',
ecommerce: {
currency: 'PLN',
value: 129.99,
items: [{
item_id: 'SKU-1042',
item_name: 'Konewka ogrodowa 5 l',
item_brand: 'GreenLine',
item_category: 'Ogród',
item_category2: 'Podlewanie',
item_variant: 'zielona',
price: 129.99,
discount: 20.00,
quantity: 1
}]
}
});
Zakup wysyłasz na stronie potwierdzenia zamówienia. Najpewniejszym zabezpieczeniem przed duplikatami jest znacznik po stronie systemu sklepu (np. pole „zdarzenie wysłane” w zamówieniu), a jeśli to niemożliwe – blokada w przeglądarce, jak w przykładzie.
(function () {
var orderId = 'ZAM-2026-104233';
var key = 'purchase_sent_' + orderId;
try {
if (window.localStorage.getItem(key)) { return; }
window.localStorage.setItem(key, '1');
} catch (e) {}
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: orderId,
currency: 'PLN',
value: 259.98,
shipping: 14.99,
tax: 48.61, // VAT zawarty w cenach brutto
coupon: 'JESIEN10',
items: [{ item_id: 'SKU-1042', item_name: 'Konewka ogrodowa 5 l', price: 129.99, quantity: 2 }]
}
});
})();
Zasady, które musisz zapisać w specyfikacji dla programisty
Sam przykład kodu nie wystarczy, bo najwięcej błędów wynika z interpretacji: co to jest cena, kiedy zamówienie jest zakupem, co z rabatem. Te zasady dopisz wprost do dokumentu.
- Kolejność komunikatów. Najpierw
{ ecommerce: null }, potem zdarzenie. Nigdy nie nadpisuj całego obiektu przypisaniemdataLayer = []po załadowaniu GTM. - Liczby jako liczby.
129.99, a nie"129,99 zł". Kropka jako separator dziesiętny, bez spacji i symbolu waluty. - Waluta przy każdej wartości. Parametr
currencyz kodem ISO 4217, np.PLNlubEUR, zawsze gdy podajeszvalue. - Definicja value. Suma
price × quantitywszystkich produktów. Nie doliczaj do niej kosztów dostawy ani podatku – przekazujesz je wshippingitax. Przy cenach bruttotaxjest informacją o VAT zawartym w cenach, a nie kwotą do dodania. - Brutto czy netto. Zdecyduj raz i zapisz. Ważne, żeby GA4, Google Ads i raporty finansowe używały tej samej konwencji, inaczej porównanie ROAS z danymi księgowymi będzie wymagało przeliczeń.
- Rabaty.
priceto cena jednostkowa po rabacie, adiscountto rabat na jedną sztukę. - Unikalny transaction_id. Ten sam numer co w panelu sklepu i w CRM, żeby można było łączyć dane i usuwać duplikaty.
- Jedno zdarzenie purchase na zamówienie. Także przy odświeżeniu strony, powrocie z bramki płatności i otwarciu linku z e-maila.
- Sklepy jednostronicowe (SPA). Zdarzenia wysyłaj po każdej wirtualnej zmianie widoku, a nie tylko przy pierwszym załadowaniu.
- Limit produktów. Jedno zdarzenie może zawierać do 200 elementów w tablicy
items.
Osobny problem to płatności przez bramki, np. szybkie przelewy czy BLIK. Część klientów nie wraca na stronę podziękowania, więc zdarzenie w przeglądarce się nie wykona. Rozwiązaniem jest wysłanie zakupu z serwera w momencie potwierdzenia płatności – to jeden z głównych powodów, dla których sklepy przenoszą pomiar na własny serwer tagowania. Na serwerze możesz też bezpiecznie dopisać do transakcji marżę, której nie powinno się ujawniać w przeglądarce; opisujemy to w tekście o wzbogacaniu zdarzeń po stronie serwera.
Dane klienta i Enhanced Conversions w warstwie danych
Jeśli korzystasz z rozszerzonych konwersji Google Ads, na stronie potwierdzenia zamówienia przekaż też dane klienta w osobnym obiekcie. GTM odczyta je zmienną danych przekazywanych przez użytkownika i zahaszuje algorytmem SHA-256 przed wysłaniem.
window.dataLayer.push({
event: 'user_data_ready',
user_data: {
email: '[email protected]',
phone_number: '+48600100200',
address: { first_name: 'Jan', last_name: 'Kowalski', postal_code: '00-001', city: 'Warszawa', country: 'PL' }
},
new_customer: true
});
Telefon przekazuj w formacie międzynarodowym z kodem kraju, a e-mail małymi literami i bez spacji. Pole new_customer przyda się, jeśli chcesz raportować pozyskanie nowych klientów w Google Ads – jak z niego korzystać, wyjaśniamy w artykule o raportowaniu nowych klientów w Google Ads. Konfigurację tagu krok po kroku opisuje poradnik o Enhanced Conversions przez GTM.
Dane osobowe w warstwie danych są widoczne dla każdego skryptu na stronie, dlatego wysyłaj je wyłącznie na stronie potwierdzenia, nie umieszczaj ich w parametrach produktów i przekazuj tylko wtedy, gdy pozwala na to stan zgód. Zakres i podstawę prawną takiego przetwarzania w konkretnym sklepie warto omówić z prawnikiem.
Jak odebrać dane w GTM i przetestować wdrożenie
Po stronie GTM potrzebujesz niewiele: w tagu zdarzenia GA4 włącz w sekcji „Więcej ustawień” wysyłanie danych e-commerce i jako źródło wskaż warstwę danych. Tag sam odczyta items, value i currency.
Wiele kontenerów obsługuje wszystkie zdarzenia e-commerce jednym tagiem GA4, w którym nazwa zdarzenia to zmienna wbudowana {{Event}}, a regułą jest „Zdarzenie niestandardowe” z wyrażeniem regularnym. Użyj zamkniętej listy nazw zamiast .*, bo od października 2026 roku ogólne wyrażenie łapie też zdarzenie gtag.config – szczegóły znajdziesz w omówieniu zmian w GTM w 2026 roku.
Reguła: Zdarzenie niestandardowe, dopasowanie do wyrażenia regularnego
^(view_item_list|select_item|view_item|add_to_cart|remove_from_cart|view_cart|begin_checkout|add_shipping_info|add_payment_info|purchase)$
Tag: Google Analytics: zdarzenie GA4, nazwa zdarzenia: {{Event}}
Testuj w trzech miejscach. W podglądzie GTM, na karcie warstwy danych, sprawdź treść każdego komunikatu. W GA4 otwórz DebugView i potwierdź, że zdarzenia mają parametry i produkty; najczęstsze przyczyny braku zdarzeń opisujemy w tekście o problemach w DebugView. Po 24–48 godzinach porównaj liczbę transakcji i przychód w raporcie zakupów e-commerce z panelem sklepu. Przy większej skali kontrolę ułatwia eksport do BigQuery i gotowe zapytania do danych GA4.
Najczęstsze błędy w implementacji dataLayer e-commerce
Większość problemów z danymi e-commerce w GA4 sprowadza się do kilku powtarzalnych błędów. Każdy z nich da się wykryć w podglądzie albo w raportach.
- Brak czyszczenia obiektu ecommerce. Zdarzenie
view_item_listzawiera produkty z poprzedniegoview_item. Widać to w podglądzie na karcie warstwy danych. - Wartości jako tekst z przecinkiem. Przychód w GA4 wynosi zero albo jest zaniżony, choć transakcje są liczone.
- Zakup przy każdym odświeżeniu. Liczba transakcji rośnie szybciej niż w panelu sklepu, a w raporcie pojawiają się powtórzone identyfikatory; procedurę naprawy zawiera artykuł o duplikatach transakcji w GA4.
- Stary format z Universal Analytics. Struktury typu
ecommerce.purchase.actionFieldiproductsnie są automatycznie odczytywane przez tagi GA4 – trzeba je przepisać naitems. - Zakup przed potwierdzeniem płatności. Jeśli zdarzenie wysyłasz dla zamówień nieopłaconych, ustal, jak raportować anulowane transakcje, np. przez zdarzenie
refund.
Kolejne poradniki o konfiguracji tagów znajdziesz w podtemacie Google Tag Manager.
Najczęściej zadawane pytania
Czy wartości w dataLayer e-commerce powinny być brutto czy netto?
GA4 nie narzuca żadnej konwencji, więc decyzja należy do Ciebie. Najważniejsza jest spójność: GA4, Google Ads i raporty finansowe powinny używać tej samej zasady. Jeśli planujesz liczyć rentowność kampanii na danych netto, zapisz to w specyfikacji od początku, bo późniejsza zmiana rozbije porównania historyczne.
Czy trzeba czyścić obiekt ecommerce przed każdym zdarzeniem?
Tak. Warstwa danych scala kolejne komunikaty, więc bez wysłania { ecommerce: null } nowe zdarzenie może odziedziczyć produkty lub parametry z poprzedniego. Efektem są np. listy produktów w zdarzeniu zakupu, które nie zostały kupione. Czyszczenie to jedna linijka kodu przed każdym zdarzeniem e-commerce.
Czy stary dataLayer z Universal Analytics zadziała w GA4?
Nie wprost. Tagi GA4 oczekują tablicy items i nazw zdarzeń rekomendowanych, takich jak purchase czy add_to_cart. Stara struktura z obiektami products i actionField wymaga przepisania albo mapowania w GTM zmiennymi niestandardowymi. Przepisanie warstwy danych jest bardziej pracochłonne, ale daje stabilniejszy pomiar.
Co zrobić, gdy klient nie wraca z bramki płatności na stronę podziękowania?
Zdarzenie w przeglądarce się wtedy nie wykona i transakcja nie trafi do GA4. Najpewniejszym rozwiązaniem jest wysłanie zakupu z serwera sklepu w chwili potwierdzenia płatności, np. przez serwer tagowania GTM lub Measurement Protocol, z tym samym transaction_id, co pozwoli uniknąć podwójnego liczenia.
Ile produktów można przesłać w jednym zdarzeniu e-commerce?
Tablica items w jednym zdarzeniu GA4 może zawierać do 200 elementów. W typowym sklepie to wystarczający limit, ale przy listach produktów, np. kategoriach z nieskończonym przewijaniem, lepiej wysyłać zdarzenie view_item_list partiami, np. po każdym doładowaniu kolejnych produktów.