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?

  1. Separacja kodu - Oddziela logikę biznesową od implementacji tagów
  2. Elastyczność - Zmiany w tagach bez modyfikacji kodu strony
  3. Standaryzacja - Jednolita struktura danych dla wszystkich platform
  4. 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ź:

  1. Summary - Lista wszystkich eventów na stronie
  2. Data Layer - Stan dataLayer w każdym momencie
  3. Variables - Wartości zmiennych GTM
  4. 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:

  1. Standaryzacja - Stosuj oficjalne nazwy eventów GA4
  2. Konsekwencja - Używaj spójnych konwencji nazewnictwa
  3. Czyszczenie - Zawsze czyść obiekt ecommerce przed nowym eventem
  4. Walidacja - Testuj każdy event w GTM Preview Mode
  5. 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

  1. Google Analytics 4 - Recommended events https://support.google.com/analytics/answer/9267735

  2. Google Tag Manager - Data layer https://developers.google.com/tag-platform/tag-manager/datalayer

  3. GA4 Ecommerce - Developer guide https://developers.google.com/analytics/devguides/collection/ga4/ecommerce

  4. Google Tag Manager - Preview and debug https://support.google.com/tagmanager/answer/6107056

  5. web.dev - Measure ecommerce https://web.dev/articles/measure-ecommerce