{"id":455,"date":"2026-09-09T18:40:00","date_gmt":"2026-09-09T16:40:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=455"},"modified":"2026-09-09T16:31:53","modified_gmt":"2026-09-09T14:31:53","slug":"sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/","title":{"rendered":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">\u015aledzenie zdarze\u0144 e-commerce w aplikacjach typu Single-Page Application (SPA) opartych na frameworkach React, Vue lub Next.js wi\u0105\u017ce si\u0119 ze z\u0142o\u017conymi wyzwaniami architektonicznymi. Poniewa\u017c podczas zmian tras nie dochodzi do klasycznego prze\u0142adowania strony w przegl\u0105darce, standardowe wyzwalacze oparte na gotowo\u015bci struktury DOM lub pe\u0142nym za\u0142adowaniu okna zawodz\u0105. Ponadto asynchroniczne renderowanie komponent\u00f3w cz\u0119sto prowadzi do zjawiska wy\u015bcigu (race condition) w warstwie danych DataLayer: tagi Google Tag Managera (GTM) mog\u0105 zosta\u0107 wywo\u0142ane przed pe\u0142nym za\u0142adowaniem obiekt\u00f3w e-commerce, a przestarza\u0142e dane transakcyjne z poprzednich widok\u00f3w mog\u0105 zaburza\u0107 kolejne zdarzenia. Wdro\u017cenie deterministycznej architektury \u015bledzenia GA4 e-commerce eliminuje ryzyko wy\u015bcig\u00f3w i gwarantuje precyzj\u0119 danych w ca\u0142ym lejku sprzeda\u017cowym.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">1. Architektoniczne przyczyny b\u0142\u0119d\u00f3w \u015bledzenia w aplikacjach SPA<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Zjawiska wy\u015bcigu w aplikacjach SPA wynikaj\u0105 najcz\u0119\u015bciej z trzech strukturalnych b\u0142\u0119downych wzorc\u00f3w:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Brak czyszczenia obiektu e-commerce:<\/strong> Tagi GA4 e-commerce \u0142\u0105cz\u0105 (merge) nowo wypychane dane ze strukturami ju\u017c istniej\u0105cymi w warstwie danych. Je\u015bli stary obiekt <code>ecommerce<\/code> nie zostanie jawnie wyczyszczony, produkty z poprzednich widok\u00f3w ulegaj\u0105 duplikacji w kolejnych zdarzeniach.<\/li>\r\n<li><strong>Zale\u017cno\u015b\u0107 od wyzwalaczy History Change:<\/strong> Opieranie wirtualnych ods\u0142on o wyzwalacze zmian historii w GTM powoduje wywo\u0142ywanie tag\u00f3w, zanim asynchroniczne punkty ko\u0144cowe API zd\u0105\u017c\u0105 zwr\u00f3ci\u0107 aktualne ceny produkt\u00f3w lub stan koszyka.<\/li>\r\n<li><strong>Nieuproszczona kolejno\u015b\u0107 wysy\u0142ania zdarze\u0144:<\/strong> Rozdzielenie aktualizacji stanu aplikacji i zdarze\u0144 \u015bledz\u0105cych do osobnych, nieskoordynowanych blok\u00f3w wykonawczych JavaScript generuje losow\u0105 kolejno\u015b\u0107 odpalania tag\u00f3w.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/ga4-spa-kolejnosc-datalayer-pl.png\" width=\"1120\" height=\"650\" alt=\"Diagram sekwencji pushy do dataLayer w aplikacji SPA, od zmiany trasy przez czyszczenie i atomowy push a\u017c po zdarzenie GA4\">\n<figcaption>Czas biegnie w d\u00f3\u0142: najpierw czyszczenie, potem jeden push nios\u0105cy zdarzenie i \u0142adunek razem. To w\u0142a\u015bnie ich rozdzielenie pozwala tagowi zadzia\u0142a\u0107 na starym obiekcie.<\/figcaption>\n<\/figure>\n\n<h2 class=\"wp-block-heading\">2. Wdro\u017cenie deterministycznych transfer\u00f3w DataLayer krok po kroku<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Aby zagwarantowa\u0107 bezpieczn\u0105 komunikacj\u0119 z warstw\u0105 danych we frameworkach frontendowych, wysy\u0142ka zdarze\u0144 e-commerce musi przebiega\u0107 wed\u0142ug rygorystycznego, tr\u00f3jetapowego wzorca:<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li><strong>Jawne czyszczenie obiektu:<\/strong> Ka\u017cde przekazanie danych e-commerce musi by\u0107 poprzedzone instrukcj\u0105 resetuj\u0105c\u0105 <code>ecommerce: null<\/code>. Operacja ta czy\u015bci wewn\u0119trzne modele danych GTM.<\/li>\r\n<li><strong>Atomowe pakowanie zdarzenia i \u0142adunku danych:<\/strong> Nigdy nie nale\u017cy przekazywa\u0107 \u0142adunku danych oraz zdarzenia wyzwalaj\u0105cego w osobnych instrukcjach. Nazwa zdarzenia i kompletny obiekt <code>ecommerce<\/code> musz\u0105 by\u0107 przekazywane w jednej, atomowej operacji push.<\/li>\r\n<li><strong>Synchronizacja ze stanem frameworka:<\/strong> W aplikacjach React lub Next.js wywo\u0142ania analityczne nale\u017cy hermetyzowa\u0107 w hakach efekt\u00f3w ubocznych (np. <code>useEffect<\/code>) z precyzyjnie zdefiniowan\u0105 tablic\u0105 zale\u017cno\u015bci, co zapewnia odp\u0142anie tag\u00f3w dopiero po zako\u0144czeniu hydratacji DOM i stabilizacji stanu.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Produkcyjny wzorzec w j\u0119zyku TypeScript \/ Vanilla JS<\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code class=\"language-javascript\">\/**\n * Bezpiecznie przesy\u0142a zdarzenie e-commerce GA4, eliminuj\u0105c zjawisko wy\u015bcigu.\n * @param {string} eventName - Nazwa zdarzenia GA4 (np. 'add_to_cart', 'purchase').\n * @param {Object} ecommercePayload - Ustandaryzowany obiekt e-commerce GA4.\n *\/\nfunction dispatchGa4EcommerceEvent(eventName, ecommercePayload) {\n  window.dataLayer = window.dataLayer || [];\n\n  \/\/ Etap 1: Wyczyszczenie przestarza\u0142ych danych e-commerce w celu unikni\u0119cia kolizji scalania\n  window.dataLayer.push({ ecommerce: null });\n\n  \/\/ Etap 2: Atomowy push zdarzenia oraz \u0142adunku danych\n  window.dataLayer.push({\n    event: eventName,\n    ecommerce: ecommercePayload\n  });\n}\n\n\/\/ Przyk\u0142ad u\u017cycia w komponencie koszyka React:\n\/\/ dispatchGa4EcommerceEvent('add_to_cart', {\n\/\/   currency: 'PLN',\n\/\/   value: 549.99,\n\/\/   items: [{ item_id: 'SKU_441', item_name: 'Enterprise Router', price: 549.99, quantity: 1 }]\n\/\/ });<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">3. Konfiguracja Google Tag Managera (GTM) krok po kroku<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Niezawodno\u015b\u0107 kodu frontendowego musi by\u0107 wspierana przez defensywn\u0105 konfiguracj\u0119 kontenera GTM:<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li><strong>Wy\u0142\u0105cznie wyzwalacze zdarze\u0144 niestandardowych (Custom Event):<\/strong> Dla zdarze\u0144 e-commerce nale\u017cy zrezygnowa\u0107 z wyzwalaczy <code>All Pages<\/code> oraz <code>History Change<\/code>. Konieczne jest utworzenie wyzwalaczy Custom Event dok\u0142adnie odpowiadaj\u0105cych nazwom zdarze\u0144 GA4 (np. <code>add_to_cart<\/code>, <code>begin_checkout<\/code>, <code>purchase<\/code>).<\/li>\r\n<li><strong>Konfiguracja zmiennej warstwy danych:<\/strong> Zdefiniowanie zmiennej warstwy danych (Data Layer Variable) o nazwie <code>dlv - ecommerce<\/code> wskazuj\u0105cej klucz <code>ecommerce<\/code>. Warto\u015b\u0107 domy\u015blna powinna pozosta\u0107 nieokre\u015blona (undefined).<\/li>\r\n<li><strong>Mapowanie tagu zdarzenia GA4:<\/strong> Tag zdarzenia GA4 nale\u017cy przypisa\u0107 do wyzwalacza Custom Event. W sekcji <em>Wi\u0119cej ustawie\u0144 &gt; E-commerce<\/em> trzeba zaznaczy\u0107 opcj\u0119 <code>Wy\u015blij dane e-commerce<\/code> i wybra\u0107 <code>Data Layer<\/code> jako \u017ar\u00f3d\u0142o danych.<\/li>\r\n<li><strong>Wymuszenie sekwencjonowania tag\u00f3w:<\/strong> W przypadku kluczowych konwersji, takich jak <code>purchase<\/code>, nale\u017cy wykorzysta\u0107 sekwencjonowanie tag\u00f3w w GTM, aby zagwarantowa\u0107 zako\u0144czenie dzia\u0142ania tag\u00f3w platform znowu zg\u00f3d (CMP) oraz atrybucji User-ID przed odpaleniem w\u0142a\u015bciwego tagu transakcji.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">4. Podsumowanie i warto\u015b\u0107 architektoniczna<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Co da si\u0119 osi\u0105gn\u0105\u0107 dzi\u0119ki temu poradnikowi:<\/strong> Wdro\u017cenie deterministycznej, wolnej od zjawiska wy\u015bcigu architektury \u015bledzenia Google Analytics 4 e-commerce w aplikacjach typu Single-Page Application (React, Vue, Next.js) z wykorzystaniem atomowego resetowania struktur danych i wyzwalaczy Custom Event.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Wynikaj\u0105ca z tego warto\u015b\u0107:<\/strong> Zbiory danych analitycznych z obszaru e-commerce staj\u0105 si\u0119 w pe\u0142ni precyzyjne i powtarzalne. Sztuczne zawy\u017canie przychod\u00f3w wywo\u0142ane \u0142\u0105czeniem starych obiekt\u00f3w warstwy danych zostaje trwale wyeliminowane, a utrata krok\u00f3w w lejku zakupowym spowodowana asynchronicznym renderowaniem przestaje wyst\u0119powa\u0107. W efekcie systemy atrybucji marketingu efektywno\u015bciowego oraz algorytmy automatycznego licytowania otrzymuj\u0105 czyste i wiarygodne sygna\u0142y o konwersjach.<\/p>\r\n\n\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\/reference\/events\" target=\"_blank\" rel=\"noopener noreferrer\">Google Analytics 4 event reference<\/a><\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\" target=\"_blank\" rel=\"noopener noreferrer\">MDN Web Docs<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Techniczny przewodnik wdro\u017cenia deterministycznego \u015bledzenia e-commerce GA4 bez zjawiska wy\u015bcigu w aplikacjach SPA (React, Vue, Next.js).<\/p>\n","protected":false},"author":1,"featured_media":14015,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[117],"tags":[92113,92100,92133,92271,92499,92044,92238],"class_list":["post-455","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl","tag-e-commerce-pl","tag-google-analytics-4-pl","tag-google-tag-manager-pl","tag-javascript-pl","tag-single-page-application-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>\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer - Lukas Wojcik - Blog<\/title>\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\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Techniczny przewodnik wdro\u017cenia deterministycznego \u015bledzenia e-commerce GA4 bez zjawiska wy\u015bcigu w aplikacjach SPA (React, Vue, Next.js).\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-09T16:40:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.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=\"luky\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"luky\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 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\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/\"},\"author\":{\"name\":\"luky\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer\",\"datePublished\":\"2026-09-09T16:40:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/\"},\"wordCount\":697,\"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\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png\",\"keywords\":[\"E-Commerce\",\"Google Analytics 4\",\"Google Tag Manager\",\"JavaScript\",\"Single-Page Application\",\"Tracking\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/\",\"name\":\"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png\",\"datePublished\":\"2026-09-09T16:40:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png\",\"width\":1200,\"height\":630,\"caption\":\"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer\"}]},{\"@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\":\"luky\",\"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\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/author\\\/luky\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer - Lukas Wojcik - Blog","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\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/","og_locale":"en_US","og_type":"article","og_title":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer - Lukas Wojcik - Blog","og_description":"Techniczny przewodnik wdro\u017cenia deterministycznego \u015bledzenia e-commerce GA4 bez zjawiska wy\u015bcigu w aplikacjach SPA (React, Vue, Next.js).","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-09T16:40:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png","type":"image\/png"}],"author":"luky","twitter_card":"summary_large_image","twitter_misc":{"Written by":"luky","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/"},"author":{"name":"luky","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer","datePublished":"2026-09-09T16:40:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/"},"wordCount":697,"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\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png","keywords":["E-Commerce","Google Analytics 4","Google Tag Manager","JavaScript","Single-Page Application","Tracking","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/","name":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png","datePublished":"2026-09-09T16:40:00+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-455-ga4-e-commerce-enhanced-tracking-spa-g.png","width":1200,"height":630,"caption":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/sledzenie-e-commerce-ga4-w-aplikacjach-spa-bez-zjawiska-race-condition\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u015aledzenie e-commerce GA4 w aplikacjach SPA bez zjawiska Race Condition z DataLayer"}]},{"@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":"luky","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":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"],"url":"https:\/\/www.lukaswojcik.com\/blog\/author\/luky\/"}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/455","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=455"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/455\/revisions"}],"predecessor-version":[{"id":17519,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/455\/revisions\/17519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/14015"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}