Realizacja
Zakres projektu
Kontekst projektu
Klient prowadzi sklep ecommerce na Shopify. Po wdrożeniu CMP oraz Consent Mode v2 pojawiły się problemy z jakością danych w GA4 i Google Ads: spadki eventów ecommerce, duży udział ruchu Unassigned, brak stabilnych danych z checkoutu oraz rozjazd między realnymi zamówieniami a raportami analitycznymi.
Dodatkowym utrudnieniem był Shopify Checkout Extensibility / Checkout 2.0, gdzie klasyczne wdrożenie GTM przez checkout.liquid nie jest dostępne na standardowym planie. Tracking musiał zostać rozdzielony na storefront i checkout, przy jednoczesnym zachowaniu zgodności z Consent Mode v2 oraz ograniczeniami sandboxa Shopify Web Pixels.
Problem
W początkowej konfiguracji występowało kilka nakładających się problemów:
- storefrontowy GTM nie otrzymywał pełnych eventów ecommerce w
dataLayer, - checkout działał w osobnym sandboxie Shopify Custom Pixel,
- consent z Pandectes był poprawnie widoczny na storefront, ale nie był prawidłowo mapowany w checkout custom pixelu,
- część eventów checkoutowych wysyłana była jako
G100, czyli bez pełnej zgody i bez normalnego kontekstu cookies, - GA4 pokazywało duży udział
Unassignedoraz(not set) / (not set), - eventy typu
add_to_cart,view_item,begin_checkout,purchasebyły niespójne albo niepełne, - istniało ryzyko duplikowania zakupów między Google & YouTube App, GTM i custom pixelem.
Zakres prac
Prace objęły pełny audyt i przebudowę warstwy analitycznej sklepu:
- Audyt konfiguracji GA4, Google Ads, GTM i Consent Mode v2.
- Rozdzielenie infrastruktury trackingowej na dwa kontenery GTM: osobny kontener dla storefrontu i osobny kontener dla checkoutu.
- Wdrożenie Shopify Custom Pixel dla Checkout 2.0.
- Przygotowanie checkoutowego
dataLayerdla GA4 ecommerce. - Naprawa Consent Mode v2 w sandboxie checkoutu.
- Odtworzenie brakujących eventów ecommerce na storefront.
- Deduplikacja eventów
add_to_cartoraz eventów checkoutowych. - Weryfikacja requestów GA4 i Google Ads przez Network, HAR, Tag Assistant i DebugView.
- Analiza źródeł
Unassignedi problemów z atrybucją. - Uporządkowanie Google Ads, Meta i TikTok pod kątem UTM oraz klasyfikacji kanałów.
Architektura rozwiązania
Finalna infrastruktura została oparta o dwa niezależne kontenery GTM.
Storefront
Storefront obsługiwany jest przez Pandectes CMP oraz kontener GTM ładowany na stronach sklepu przed checkoutem.
Zakres eventów storefrontowych:
page_view,view_item,view_cart,add_to_cart,- opcjonalnie w przyszłości:
view_item_list,select_item,search,remove_from_cart.
Storefront odpowiada za bazowy pomiar GA4, Consent Mode v2 przez Pandectes, utrzymanie atrybucji, Conversion Linker, eventy produktowe i koszykowe oraz przekazanie użytkownika do checkoutu z zachowaniem źródła sesji.
Checkout
Checkout obsługiwany jest przez Shopify Custom Pixel oraz osobny kontener GTM działający w sandboxie Shopify Web Pixels.
Zakres eventów checkoutowych:
begin_checkout,add_shipping_info,add_payment_info,purchase.
Checkout custom pixel odpowiada za odczyt zgód z Shopify Customer Privacy API, ustawienie Consent Mode v2 w sandboxie checkoutu, załadowanie checkoutowego GTM, push eventów ecommerce do dataLayer, przekazanie purchase do GA4 i Google Ads, deduplikację eventów oraz poprawne przekazanie transaction_id, value, currency, tax, shipping, coupon i items.
Najważniejsze problemy techniczne i rozwiązania
1. Brak ecommerce eventów na storefront
Po audycie okazało się, że GTM był gotowy do odbierania eventów ecommerce, ale storefront nie pushował ich do dataLayer. W praktyce GA4 widziało page_view, scroll i user_engagement, ale brakowało view_item i add_to_cart.
Rozwiązaniem było wdrożenie własnego storefront bridge’a w theme Shopify, który pushuje eventy ecommerce w formacie zgodnym z GA4:
view_itemna stronie produktu,add_to_cartprzy dodaniu produktu do koszyka,view_cartna stronie koszyka.
Bridge został dodatkowo zabezpieczony przed duplikacją eventów, ponieważ Shopify może równocześnie odpalić submit formularza i AJAX /cart/add.
2. Rozjazd consentu między storefrontem a checkoutem
Na storefront zgody były poprawnie widoczne jako G111, natomiast checkout custom pixel nadal wysyłał eventy jako G100.
Oznaczało to, że Pandectes poprawnie ustawiał zgodę na storefront, ale checkoutowy custom pixel nieprawidłowo mapował status zgody odczytany z Shopify Customer Privacy API.
Pierwotnie pixel sprawdzał tylko konkretne pola:
analyticsProcessingAllowed,marketingAllowed.
Po debugowaniu okazało się, że mapping musi być odporniejszy i obsługiwać różne nazwy pól oraz wartości logiczne/stringowe. Po poprawce checkout zaczął poprawnie wysyłać:
analytics_storage: granted,ad_storage: granted,ad_user_data: granted,ad_personalization: granted.
Efekt: checkoutowe eventy zaczęły wychodzić jako G111, a nie G100.
3. Duży udział Unassigned w GA4
W GA4 pojawił się gwałtowny wzrost ruchu Unassigned. Analiza wykazała kilka potencjalnych źródeł:
- opóźnienia w przetwarzaniu GA4,
- cookieless pingi z Consent Mode Advanced,
- brak UTM w kampaniach Meta/TikTok,
- checkoutowe eventy wysyłane wcześniej z niepełnym consentem,
- możliwe problemy z cross-domain i linkerem.
Wykonano test z własnym UTM:
utm_source=test&utm_medium=cpc&utm_campaign=test_attrTest potwierdził, że po poprawkach sesja przechodziła przez storefront, koszyk, checkout i purchase z zachowaniem tego samego sid, co wskazywało, że mechanika linkera i sesji działa poprawnie.
Dodatkowo zidentyfikowano, że część Unassigned wynikała prawdopodobnie z braku poprawnego tagowania Meta/TikTok oraz opóźnionej klasyfikacji danych w GA4.
4. Ryzyko duplikacji purchase
W konfiguracji wyłączono Google & YouTube App jako źródło Google tracking, aby uniknąć podwójnego wysyłania purchase.
Finalnie purchase do GA4 i Google Ads wysyłany jest wyłącznie przez checkoutowy Custom Pixel + GTM.
5. Google Ads i Consent Mode v2
Sprawdzono również sygnały zgód wymagane przez Consent Mode v2:
ad_storage,analytics_storage,ad_user_data,ad_personalization.
Po poprawce checkoutowego pixela requesty zaczęły zawierać poprawny consent state, co powinno poprawić diagnostykę Google Ads i komunikaty typu “Ads measurement consent signals need attention”.
Wynik
Po wdrożeniu poprawek:
- GA4 otrzymuje poprawne eventy storefrontowe:
view_item,add_to_cart,view_cart, - checkout wysyła
begin_checkout,add_shipping_info,add_payment_info,purchase, - eventy ecommerce zawierają poprawne
items,value,currency,transaction_id, add_to_cartnie dubluje się przy jednym kliknięciu,- checkoutowe eventy po akceptacji zgody wychodzą jako
G111, nieG100, - purchase jest wysyłany do GA4 i Google Ads z pełnym consentem,
- tracking został rozdzielony logicznie na storefront i checkout,
- ograniczono ryzyko duplikowania konwersji,
- przygotowano podstawę do dalszej optymalizacji UTM i atrybucji kampanii Meta/TikTok.
Finalna architektura
Storefront
Pandectes CMP
-> GTM Storefront
-> GA4 page_view / view_item / add_to_cart / view_cart
-> Google Ads base tag
-> Conversion Linker
Checkout
Shopify Custom Pixel
-> Shopify Customer Privacy API
-> Consent Mode v2 update
-> GTM Checkout
-> GA4 begin_checkout / add_shipping_info / add_payment_info / purchase
-> Google Ads purchase conversionTechnologie
- Shopify
- Shopify Checkout Extensibility / Checkout 2.0
- Shopify Custom Pixel
- Shopify Web Pixels API
- Shopify Customer Privacy API
- Google Tag Manager
- Google Analytics 4
- Google Ads
- Consent Mode v2
- Pandectes GDPR CMP
- Meta Ads
- TikTok Ads
- JavaScript
- Liquid
- HAR / Network debugging
- Google Tag Assistant
- GA4 DebugView
Kluczowe wnioski
Największym wyzwaniem nie było samo wysłanie eventów do GA4, ale poprawne zsynchronizowanie trzech warstw:
- consentu,
- ecommerce
dataLayer, - atrybucji kampanii.
W Shopify Checkout 2.0 tracking checkoutu działa w izolowanym sandboxie, dlatego nie można zakładać, że zgoda i dataLayer ze storefrontu będą automatycznie dostępne w checkout. W praktyce wymaga to osobnego Custom Pixela, osobnego GTM-a i świadomego mapowania zgód z Shopify Customer Privacy API.
Projekt pokazał również, że wzrost Unassigned w GA4 nie zawsze oznacza jeden konkretny błąd. Może być sumą opóźnień GA4, Consent Mode Advanced, braku UTM-ów w kampaniach social, problemów z linkerem oraz błędnego consent mappingu w checkout.