{"id":13139,"date":"2026-09-22T18:25:00","date_gmt":"2026-09-22T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13139"},"modified":"2026-09-09T13:25:47","modified_gmt":"2026-09-09T11:25:47","slug":"tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","title":{"rendered":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM"},"content":{"rendered":"<p>Sklep wypycha dane produktowe jako jeden zagnie\u017cd\u017cony obiekt, bo tak je i tak przechowuje. Mened\u017cer tag\u00f3w chce warto\u015bci p\u0142askich, po jednej na zmienn\u0105, a pomostem mi\u0119dzy nimi jest zapis z kropkami.<\/p>\n<p>Ten zapis si\u0119ga wszystkiego. Nie m\u00f3wi natomiast, kt\u00f3ra z powsta\u0142ych \u015bcie\u017cek b\u0119dzie poprawna tak\u017ce w przysz\u0142ym miesi\u0105cu &#8211; a mniej wi\u0119cej po\u0142owa nie b\u0119dzie, z powodu niemaj\u0105cego nic wsp\u00f3lnego z mened\u017cerem tag\u00f3w.<\/p>\n<figure class=\"lw-diagram\">\n<img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/datalayer-pfade-pl.png\" width=\"1120\" height=\"580\" decoding=\"async\" loading=\"lazy\"\n     alt=\"Po lewej zagnie\u017cd\u017cony push dataLayer, po prawej jego p\u0142askie \u015bcie\u017cki kropkowe, ka\u017cda oznaczona jako stabilna albo zale\u017cna od pozycji artyku\u0142u w li\u015bcie\"><figcaption>Ka\u017cda warto\u015b\u0107 jest osi\u0105galna. \u015acie\u017cki biegn\u0105ce przez indeks listy to te, kt\u00f3re staj\u0105 si\u0119 b\u0142\u0119dne, gdy tylko zmieni si\u0119 kolejno\u015b\u0107.<\/figcaption><\/figure>\n<h2>Jak dociera zagnie\u017cd\u017cony push<\/h2>\n<p>Zwyk\u0142y push e-commerce niesie trzy poziomy: zdarzenie, obiekt pod nim, a pod nim list\u0119 artyku\u0142\u00f3w.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>dataLayer.push({\n  event: \"add_to_cart\",\n  ecommerce: {\n    currency: \"EUR\",\n    value: 129.90,\n    items: [\n      { item_id: \"SKU-42\", item_name: \"Stuhl\", price: 64.95, quantity: 2,\n        item_category: \"Moebel\", index: 0 },\n      { item_id: \"SKU-77\", item_name: \"Tisch\", price: 219.00, quantity: 1,\n        item_category: \"Moebel\", index: 1 }\n    ]\n  },\n  user: { logged_in: true, segment: \"b2b\" }\n});<\/code><\/pre>\n<p>Rozpisany na \u015bcie\u017cki obiekt ten zawiera jedn\u0105 nazw\u0119 zdarzenia, trzy warto\u015bci pod <code>ecommerce<\/code>, dwana\u015bcie wewn\u0105trz listy artyku\u0142\u00f3w i dwie pod <code>user<\/code>. Ka\u017cda z nich jest osi\u0105galna, a adresem jest \u0142a\u0144cuch kluczy po\u0142\u0105czony kropkami.<\/p>\n<h2>Wersja 2 i kropka b\u0119d\u0105ca rozdzielnikiem<\/h2>\n<p>Zmienna warstwy danych w mened\u017cerze tag\u00f3w ma ustawienie wersji i to ono wyznacza spos\u00f3b odczytu nazwy.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>Wersja 2:  ecommerce.currency          \u2192  \"EUR\"\n           ecommerce.items.0.item_id   \u2192  \"SKU-42\"\n           user.segment                \u2192  \"b2b\"\n\nWersja 1:  ecommerce.currency          \u2192  undefined\n           (caly ciag uchodzi za jeden klucz)<\/code><\/pre>\n<p>Wersja 2 jest domy\u015blna dla nowych zmiennych i niemal zawsze w\u0142a\u015bciwa. Wersja 1 istnieje dla jednego przypadku: klucza faktycznie nosz\u0105cego kropk\u0119 w nazwie. Push z <code>{\"page.type\": \"pdp\"}<\/code> jest osi\u0105galny wy\u0142\u0105cznie wersj\u0105 1, bo wersja 2 szuka\u0142aby <code>type<\/code> w <code>page<\/code>, kt\u00f3rego nie ma.<\/p>\n<p>Dwa szczeg\u00f3\u0142y kosztuj\u0105ce czas, dop\u00f3ki s\u0105 nieznane. \u015acie\u017cka rozr\u00f3\u017cnia wielko\u015b\u0107 liter w ca\u0142o\u015bci, wi\u0119c <code>Ecommerce.Items<\/code> nic nie znajduje i nic nie zg\u0142asza. A zmienna bez warto\u015bci domy\u015blnej zwraca dla brakuj\u0105cej \u015bcie\u017cki <code>undefined<\/code>, co w tagu staje si\u0119 pustym parametrem, a nie b\u0142\u0119dem &#8211; przekr\u0119cona \u015bcie\u017cka wygl\u0105da wi\u0119c tak samo jak warto\u015b\u0107 nigdy niewys\u0142ana.<\/p>\n<h2>Listy i dlaczego indeks jest cz\u0119\u015bci\u0105 kruch\u0105<\/h2>\n<p>Krok w list\u0119 jest liczb\u0105, a ta liczba to pozycja, a nie to\u017csamo\u015b\u0107.<\/p>\n<table style=\"width:100%;border-collapse:collapse;table-layout:auto;\">\n<thead>\n<tr>\n<th style=\"vertical-align:top;\">\u015acie\u017cka<\/th>\n<th style=\"white-space:nowrap;vertical-align:top;\">Stabilna?<\/th>\n<th style=\"vertical-align:top;\">Dlaczego<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">ecommerce.currency<\/td>\n<td>tak<\/td>\n<td>Nazwany klucz na sta\u0142ej g\u0142\u0119boko\u015bci<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">ecommerce.value<\/td>\n<td>tak<\/td>\n<td>Tak samo<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">user.segment<\/td>\n<td>tak<\/td>\n<td>Tak samo<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">ecommerce.items.0.item_id<\/td>\n<td>nie<\/td>\n<td>Pozycja 0 to artyku\u0142, kt\u00f3ry akurat stoi z przodu<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top;\">ecommerce.items.1.price<\/td>\n<td>nie<\/td>\n<td>Brakuje jej ca\u0142kiem w koszyku z jednym artyku\u0142em<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Drugi wiersz dolnej po\u0142owy wytwarza szkod\u0119 cich\u0105. W koszyku z jednym artyku\u0142em <code>items.1<\/code> nie istnieje, zmienna pozostaje pusta, a tag wysy\u0142a parametr bez warto\u015bci. Nic nie zawodzi, a raport pokazuje liczb\u0119 nieco mniejsz\u0105 ni\u017c sklep.<\/p>\n<p>\u015acie\u017cka z indeksem da si\u0119 obroni\u0107 w dok\u0142adnie jednym po\u0142o\u017ceniu: na stronie zawsze nosz\u0105cej dok\u0142adnie jeden artyku\u0142, na przyk\u0142ad karcie produktu. Wsz\u0119dzie indziej &#8211; koszyk, kasa, zakup &#8211; liczba artyku\u0142\u00f3w jest zmienna, a ich kolejno\u015b\u0107 tak samo.<\/p>\n<h2>Scalanie, o kt\u00f3re nikt nie prosi\u0142<\/h2>\n<p>Warstwa danych nie jest list\u0105 komunikat\u00f3w. Mened\u017cer tag\u00f3w prowadzi scalony model wszystkich dotychczasowych pushy, a nowy push zostaje w niego wtopiony, zamiast go zast\u0105pi\u0107.<\/p>\n<p>Skutek jest okre\u015blony i przykry. Strona wypychaj\u0105ca najpierw <code>view_item<\/code> z jednym artyku\u0142em, a potem <code>add_to_cart<\/code> z innym, zostawia warto\u015bci pierwszego artyku\u0142u wsz\u0119dzie tam, gdzie drugi push ich nie nadpisze. Po li\u015bcie artyku\u0142\u00f3w o d\u0142ugo\u015bci trzy przychodzi lista o d\u0142ugo\u015bci jeden, a wychodzi scalona lista o d\u0142ugo\u015bci trzy, z dwoma wpisami z poprzedniego zdarzenia.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>dataLayer.push({ ecommerce: null });   \/\/ sprzata galaz\ndataLayer.push({\n  event: \"add_to_cart\",\n  ecommerce: { currency: \"EUR\", value: 64.95, items: [ \/* \u2026 *\/ ] }\n});<\/code><\/pre>\n<p>Push sprz\u0105taj\u0105cy nale\u017cy bez wyj\u0105tku przed ka\u017cdy push e-commerce i jest najcz\u0119stszym pomini\u0119ciem w pod\u0142\u0105czeniu sklepu. Jego dzia\u0142anie wida\u0107 w podgl\u0105dzie: widok komunikat\u00f3w pokazuje, co zosta\u0142o wypchni\u0119te, widok modelu pokazuje, co zmienna naprawd\u0119 odczyta &#8211; a r\u00f3\u017cnica mi\u0119dzy nimi to dok\u0142adnie ten problem.<\/p>\n<h2>Jedna zmienna zamiast dwudziestu<\/h2>\n<p>Tam, gdzie potrzebna jest ca\u0142a lista, odpowiedzi\u0105 nie jest dwadzie\u015bcia \u015bcie\u017cek z indeksem. Jest ni\u0105 w\u0142asna zmienna JavaScript czytaj\u0105ca list\u0119 i zwracaj\u0105ca to, czego potrzebuje tag.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>function () {\n  var artikel = {{DLV - ecommerce.items}};\n  if (!Array.isArray(artikel) || !artikel.length) { return undefined; }\n\n  return artikel.map(function (a) {\n    return {\n      item_id:       String(a.item_id || a.id || \"\"),\n      item_name:     String(a.item_name || a.name || \"\"),\n      price:         Number(a.price) || 0,\n      quantity:      Number(a.quantity) || 1,\n      item_category: String(a.item_category || \"\")\n    };\n  }).filter(function (a) { return a.item_id !== \"\"; });\n}<\/code><\/pre>\n<p>Trzy rzeczy daje to ponad odporno\u015b\u0107 na kolejno\u015b\u0107. Ujednolica nazwy p\u00f3l, wi\u0119c sklep wysy\u0142aj\u0105cy na jednej stronie <code>id<\/code>, a na innej <code>item_id<\/code>, wytwarza dalej jedn\u0105 posta\u0107. Wymusza typy, przez co cena przychodz\u0105ca jako ci\u0105g <code>\"64.95\"<\/code> przestaje by\u0107 problemem. I odrzuca artyku\u0142y bez identyfikatora, kt\u00f3re GA4 i tak by odrzuci\u0142o &#8211; tyle \u017ce po cichu.<\/p>\n<p>Zmienna, kt\u00f3r\u0105 to czyta, jest zwyk\u0142\u0105 zmienn\u0105 warstwy danych wskazuj\u0105c\u0105 <code>ecommerce.items<\/code>, bez indeksu. Ta \u015bcie\u017cka jest stabilna, bo nazywa klucz, a nie pozycj\u0119.<\/p>\n<h2>Sprawdzenie w podgl\u0105dzie<\/h2>\n<p>Dwa widoki podgl\u0105du rozstrzygaj\u0105 wszystko om\u00f3wione powy\u017cej i \u0142atwo je ze sob\u0105 pomyli\u0107.<\/p>\n<p>Widok komunikat\u00f3w pokazuje push dok\u0142adnie tak, jak wys\u0142a\u0142a go strona. Widok modelu pokazuje scalony stan, kt\u00f3ry zmienna odczyta w tej chwili. Warto\u015b\u0107 stoj\u0105ca w drugim, a brakuj\u0105ca w pierwszym, to pozosta\u0142o\u015b\u0107 po wcze\u015bniejszym pushu &#8211; problem sprz\u0105tania &#8211; a warto\u015b\u0107 w pierwszym, brakuj\u0105ca w drugim, zosta\u0142a zwykle nadpisana przez push p\u00f3\u017aniejszy.<\/p>\n<p>Trzeci widok, obszar zmiennych wybranego zdarzenia, pokazuje, co ka\u017cda skonfigurowana zmienna faktycznie zwr\u00f3ci\u0142a. <code>undefined<\/code> w tym miejscu jest odpowiedzi\u0105 na niemal ka\u017cde pytanie o brakuj\u0105cy parametr i rozdziela dwie mo\u017cliwe przyczyny: \u015bcie\u017cka jest b\u0142\u0119dna albo warto\u015b\u0107 nigdy nie zosta\u0142a wypchni\u0119ta. Zestawienie zmiennej z widokiem modelu rozdziela to w sekundy.<\/p>\n<p>Ostatni nawyk zapobiega najbardziej mozolnej klasie b\u0142\u0119d\u00f3w. \u015acie\u017cka ze \u017ar\u00f3d\u0142a strony to nie \u015bcie\u017cka z warstwy danych &#8211; wtyczka sklepu potrafi zmieni\u0107 nazwy kluczy mi\u0119dzy szablonem a pushem, a sklep przet\u0142umaczony czasem t\u0142umaczy je razem z reszt\u0105. \u015acie\u017ck\u0119 nale\u017cy skopiowa\u0107 z widoku modelu prawdziwego zdarzenia, a nie przepisa\u0107 z dokumentacji.<\/p>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/datalayer\" target=\"_blank\" rel=\"noopener noreferrer\">The data layer<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager documentation<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Notacja kropkowa si\u0119ga ka\u017cdej warto\u015bci w zagnie\u017cd\u017conym pushu, a po\u0142owa tych \u015bcie\u017cek p\u0119ka, gdy tylko zmieni si\u0119 kolejno\u015b\u0107 w li\u015bcie. Kt\u00f3ra to po\u0142owa, da si\u0119 rozstrzygn\u0105\u0107 z g\u00f3ry &#8211; a jedna w\u0142asna zmienna zast\u0119puje dwadzie\u015bcia tych kruchych.<\/p>\n","protected":false},"author":1,"featured_media":13251,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[117],"tags":[92133,92271,92044,92238],"class_list":["post-13139","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl","tag-google-tag-manager-pl","tag-javascript-pl","tag-tracking-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM - Lukas Wojcik - Blog<\/title>\n<meta name=\"description\" content=\"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-22T16:25:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM\",\"datePublished\":\"2026-09-22T16:25:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\"},\"wordCount\":976,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png\",\"keywords\":[\"Google Tag Manager\",\"JavaScript\",\"Tracking\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\",\"name\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png\",\"datePublished\":\"2026-09-22T16:25:00+00:00\",\"description\":\"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM - Lukas Wojcik - Blog","description":"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM - Lukas Wojcik - Blog","og_description":"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-22T16:25:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM","datePublished":"2026-09-22T16:25:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/"},"wordCount":976,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png","keywords":["Google Tag Manager","JavaScript","Tracking","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/","name":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png","datePublished":"2026-09-22T16:25:00+00:00","description":"Odczyt zagnie\u017cd\u017conych pushy notacj\u0105 kropkow\u0105, oddzielenie \u015bcie\u017cek stabilnych od zale\u017cnych od indeksu i scalanie przywracaj\u0105ce stare warto\u015bci.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13139-tutorial-z-zagniezdzonego-datalayer-zbud.png","width":1200,"height":630,"caption":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/tutorial-z-zagniezdzonego-datalayer-zbudowac-trwale-zmienne-gtm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Z zagnie\u017cd\u017conego dataLayer zbudowa\u0107 trwa\u0142e zmienne GTM"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13139"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13139\/revisions"}],"predecessor-version":[{"id":17340,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13139\/revisions\/17340"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13251"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}