dataLayer to fundament każdej profesjonalnej implementacji Google Tag Manager. To tablica JavaScript, która służy jako pomost między Twoją stroną a GTM, przekazując dane o użytkownikach, produktach i wydarzeniach. Prawidłowa struktura dataLayer decyduje o jakości danych analitycznych i skuteczności kampanii marketingowych.
Czym jest dataLayer?
dataLayer to globalna tablica JavaScript (window.dataLayer), która przechowuje dane w formacie klucz-wartość. GTM nasłuchuje zmian w tej tablicy i reaguje na nie, uruchamiając odpowiednie tagi.
// Podstawowa inicjalizacja dataLayer
window.dataLayer = window.dataLayer || [];
// Dodawanie danych do dataLayer
dataLayer.push({
event: 'page_view',
page_title: 'Strona główna',
page_location: window.location.href
});
Dlaczego dataLayer jest ważny?
- Separacja kodu - Oddziela logikę biznesową od implementacji tagów
- Elastyczność - Zmiany w tagach bez modyfikacji kodu strony
- Standaryzacja - Jednolita struktura danych dla wszystkich platform
- Debugowanie - Łatwe śledzenie przepływu danych
Struktura i konwencje nazewnictwa
Nazewnictwo eventów
Stosuj spójne konwencje nazewnictwa. Rekomendowane podejście to snake_case:
// Dobrze - snake_case (standard GA4)
dataLayer.push({ event: 'add_to_cart' });
dataLayer.push({ event: 'begin_checkout' });
dataLayer.push({ event: 'purchase' });
// Źle - niespójne nazewnictwo
dataLayer.push({ event: 'AddToCart' });
dataLayer.push({ event: 'beginCheckout' });
dataLayer.push({ event: 'PURCHASE' });
Nazewnictwo zmiennych
Dla zmiennych również stosuj snake_case lub camelCase, ale bądź konsekwentny:
// Dobrze - konsekwentne snake_case
dataLayer.push({
event: 'purchase',
transaction_id: 'T12345',
transaction_total: 299.99,
currency_code: 'PLN'
});
// Lub konsekwentne camelCase
dataLayer.push({
event: 'purchase',
transactionId: 'T12345',
transactionTotal: 299.99,
currencyCode: 'PLN'
});
Standardowe eventy GA4
Google Analytics 4 definiuje zalecane eventy, które warto stosować dla spójności danych.
Eventy e-commerce
// view_item - Wyświetlenie produktu
dataLayer.push({
event: 'view_item',
ecommerce: {
currency: 'PLN',
value: 149.99,
items: [{
item_id: 'SKU_12345',
item_name: 'Koszulka polo',
item_brand: 'Marka',
item_category: 'Odzież',
item_category2: 'Męska',
item_variant: 'Niebieski',
price: 149.99,
quantity: 1
}]
}
});
// add_to_cart - Dodanie do koszyka
dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: 'PLN',
value: 149.99,
items: [{
item_id: 'SKU_12345',
item_name: 'Koszulka polo',
price: 149.99,
quantity: 1
}]
}
});
// purchase - Zakup
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T_12345',
value: 299.99,
tax: 55.93,
shipping: 15.00,
currency: 'PLN',
coupon: 'LATO2024',
items: [{
item_id: 'SKU_12345',
item_name: 'Koszulka polo',
price: 149.99,
quantity: 2
}]
}
});
Eventy zaangażowania
// sign_up - Rejestracja
dataLayer.push({
event: 'sign_up',
method: 'Google'
});
// login - Logowanie
dataLayer.push({
event: 'login',
method: 'Email'
});
// search - Wyszukiwanie
dataLayer.push({
event: 'search',
search_term: 'koszulka polo'
});
// generate_lead - Generowanie leada
dataLayer.push({
event: 'generate_lead',
currency: 'PLN',
value: 50.00
});
Enhanced Ecommerce - kompletna ścieżka
Pełna implementacja ścieżki zakupowej wymaga śledzenia każdego kroku:
1. Lista produktów (view_item_list)
dataLayer.push({
event: 'view_item_list',
ecommerce: {
item_list_id: 'category_mens_shirts',
item_list_name: 'Koszule męskie',
items: [
{
item_id: 'SKU_001',
item_name: 'Koszula Oxford',
price: 199.99,
index: 0
},
{
item_id: 'SKU_002',
item_name: 'Koszula slim fit',
price: 179.99,
index: 1
}
]
}
});
2. Kliknięcie produktu (select_item)
dataLayer.push({
event: 'select_item',
ecommerce: {
item_list_id: 'category_mens_shirts',
item_list_name: 'Koszule męskie',
items: [{
item_id: 'SKU_001',
item_name: 'Koszula Oxford',
price: 199.99,
index: 0
}]
}
});
3. Wyświetlenie produktu (view_item)
dataLayer.push({
event: 'view_item',
ecommerce: {
currency: 'PLN',
value: 199.99,
items: [{
item_id: 'SKU_001',
item_name: 'Koszula Oxford',
item_brand: 'Premium Brand',
item_category: 'Odzież',
item_category2: 'Koszule',
item_variant: 'Biały / L',
price: 199.99,
quantity: 1
}]
}
});
4. Dodanie do koszyka (add_to_cart)
dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: 'PLN',
value: 199.99,
items: [{
item_id: 'SKU_001',
item_name: 'Koszula Oxford',
price: 199.99,
quantity: 1
}]
}
});
5. Wyświetlenie koszyka (view_cart)
dataLayer.push({
event: 'view_cart',
ecommerce: {
currency: 'PLN',
value: 399.98,
items: [
{ item_id: 'SKU_001', item_name: 'Koszula Oxford', price: 199.99, quantity: 2 }
]
}
});
6. Rozpoczęcie checkoutu (begin_checkout)
dataLayer.push({
event: 'begin_checkout',
ecommerce: {
currency: 'PLN',
value: 399.98,
coupon: 'RABAT10',
items: [
{ item_id: 'SKU_001', item_name: 'Koszula Oxford', price: 199.99, quantity: 2 }
]
}
});
7. Dodanie danych wysyłki (add_shipping_info)
dataLayer.push({
event: 'add_shipping_info',
ecommerce: {
currency: 'PLN',
value: 414.98,
shipping_tier: 'Kurier DPD',
items: [
{ item_id: 'SKU_001', item_name: 'Koszula Oxford', price: 199.99, quantity: 2 }
]
}
});
8. Dodanie danych płatności (add_payment_info)
dataLayer.push({
event: 'add_payment_info',
ecommerce: {
currency: 'PLN',
value: 414.98,
payment_type: 'Przelewy24',
items: [
{ item_id: 'SKU_001', item_name: 'Koszula Oxford', price: 199.99, quantity: 2 }
]
}
});
9. Zakup (purchase)
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T_2024_001234',
value: 414.98,
tax: 77.59,
shipping: 15.00,
currency: 'PLN',
coupon: 'RABAT10',
items: [
{
item_id: 'SKU_001',
item_name: 'Koszula Oxford',
item_brand: 'Premium Brand',
item_category: 'Odzież',
price: 199.99,
quantity: 2
}
]
}
});
Czyszczenie danych ecommerce
Ważne jest czyszczenie obiektu ecommerce przed każdym nowym eventem, aby uniknąć “wyciekania” danych między zdarzeniami:
// Zawsze czyść przed nowym eventem ecommerce
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'view_item',
ecommerce: {
// ...dane
}
});
Debugowanie dataLayer
GTM Preview Mode
Najważniejsze narzędzie do debugowania. Otwórz GTM Preview i sprawdź:
- Summary - Lista wszystkich eventów na stronie
- Data Layer - Stan dataLayer w każdym momencie
- Variables - Wartości zmiennych GTM
- Tags - Które tagi się odpaliły
Console w przeglądarce
// Wyświetl cały dataLayer
console.log(window.dataLayer);
// Filtruj eventy
dataLayer.filter(item => item.event === 'purchase');
// Nasłuchuj na nowe eventy
(function() {
var originalPush = dataLayer.push;
dataLayer.push = function() {
console.log('dataLayer.push:', arguments[0]);
return originalPush.apply(this, arguments);
};
})();
Google Analytics Debugger
Rozszerzenie do Chrome, które pokazuje dane wysyłane do GA4 w czasie rzeczywistym.
dataLayer Inspector+
Rozszerzenie do Chrome dedykowane do inspekcji dataLayer. Pokazuje:
- Historię wszystkich pushów
- Strukturę danych
- Potencjalne błędy
Najczęstsze błędy
1. Brak inicjalizacji dataLayer
// Źle - dataLayer może nie istnieć
dataLayer.push({ event: 'page_view' });
// Dobrze - zawsze inicjalizuj
window.dataLayer = window.dataLayer || [];
dataLayer.push({ event: 'page_view' });
2. Niespójne typy danych
// Źle - wartość jako string
dataLayer.push({ value: '199.99' });
// Dobrze - wartość jako number
dataLayer.push({ value: 199.99 });
3. Nadpisywanie zamiast dodawania
// Źle - nadpisuje cały dataLayer
window.dataLayer = [{ event: 'page_view' }];
// Dobrze - dodaje do istniejącego
dataLayer.push({ event: 'page_view' });
4. Brak czyszczenia ecommerce
// Źle - dane z poprzedniego eventu mogą się przenieść
dataLayer.push({ event: 'purchase', ecommerce: {...} });
// Dobrze - czyść przed każdym eventem
dataLayer.push({ ecommerce: null });
dataLayer.push({ event: 'purchase', ecommerce: {...} });
5. Duplikaty eventów
Upewnij się, że eventy nie są wysyłane wielokrotnie, np. przy renderowaniu komponentów w React/Vue.
Integracja z frameworkami JavaScript
React
// Hook do wysyłania eventów
import { useEffect } from 'react';
export const useDataLayer = () => {
const pushEvent = (eventData) => {
window.dataLayer = window.dataLayer || [];
if (eventData.ecommerce) {
window.dataLayer.push({ ecommerce: null });
}
window.dataLayer.push(eventData);
};
return { pushEvent };
};
// Użycie w komponencie
const ProductPage = ({ product }) => {
const { pushEvent } = useDataLayer();
useEffect(() => {
pushEvent({
event: 'view_item',
ecommerce: {
currency: 'PLN',
value: product.price,
items: [{ item_id: product.id, item_name: product.name, price: product.price }]
}
});
}, [product.id]);
return <div>...</div>;
};
Vue 3
// composable/useDataLayer.js
export function useDataLayer() {
const pushEvent = (eventData) => {
window.dataLayer = window.dataLayer || [];
if (eventData.ecommerce) {
window.dataLayer.push({ ecommerce: null });
}
window.dataLayer.push(eventData);
};
return { pushEvent };
}
// Użycie w komponencie
<script setup>
import { onMounted } from 'vue';
import { useDataLayer } from '@/composables/useDataLayer';
const props = defineProps(['product']);
const { pushEvent } = useDataLayer();
onMounted(() => {
pushEvent({
event: 'view_item',
ecommerce: {
currency: 'PLN',
value: props.product.price,
items: [{ item_id: props.product.id, item_name: props.product.name }]
}
});
});
</script>
Podsumowanie
Prawidłowa implementacja dataLayer to fundament skutecznej analityki i marketingu. Kluczowe zasady to:
- Standaryzacja - Stosuj oficjalne nazwy eventów GA4
- Konsekwencja - Używaj spójnych konwencji nazewnictwa
- Czyszczenie - Zawsze czyść obiekt ecommerce przed nowym eventem
- Walidacja - Testuj każdy event w GTM Preview Mode
- Dokumentacja - Dokumentuj strukturę dataLayer dla zespołu
Dobrze zaimplementowany dataLayer ułatwia późniejsze rozszerzenia, debugowanie i migracje między platformami analitycznymi.
Źródła
-
Google Analytics 4 - Recommended events https://support.google.com/analytics/answer/9267735
-
Google Tag Manager - Data layer https://developers.google.com/tag-platform/tag-manager/datalayer
-
GA4 Ecommerce - Developer guide https://developers.google.com/analytics/devguides/collection/ga4/ecommerce
-
Google Tag Manager - Preview and debug https://support.google.com/tagmanager/answer/6107056
-
web.dev - Measure ecommerce https://web.dev/articles/measure-ecommerce



