DfGtagManager: kompletna dokumentacja
Kompletny przewodnik po pluginie DfGtagManager: kontener GTM, GA4 Enhanced Ecommerce, Consent Mode v2, Enhanced Conversions haszowane SHA-256, dopasowanie do Google Shopping i server-side GTM.
DfGtagManager to plugin dla Shopware 6.7, który wstrzykuje kontener Google Tag Manager, emituje pełne zdarzenia e-commerce GA4, obsługuje Consent Mode v2 z natywnym banerem cookies Shopware, wysyła Enhanced Conversions haszowane SHA-256 i dopasowuje data layer do Twojego feedu Google Merchant Center. Ta dokumentacja obejmuje instalację, pełną konfigurację i weryfikację.
Wymagania
- Shopware 6.7.0 lub nowszy
- PHP minimum 8.2
- Dostęp SSH albo administracja Shopware do instalacji ZIP-a
- Konto Google Tag Manager (zalecane) albo co najmniej konto Google Analytics 4
- Dla Enhanced Conversions: konto Google Ads ze skonfigurowanymi kampaniami konwersji
Instalacja
Trzy możliwe metody, zależnie od Twojego środowiska.
Z administracji Shopware
- W panelu: Rozszerzenia → Moje rozszerzenia → Prześlij rozszerzenie
- Wybierz plik
DfGtagManager.zip - Kliknij Zainstaluj, a następnie Aktywuj
- Wyczyść cache: Ustawienia → System → Cache i indeksy → Wyczyść i wygeneruj ponownie
Z wiersza poleceń (zalecane w produkcji)
cd /path/to/shopware
unzip DfGtagManager.zip -d custom/plugins/
bin/console plugin:refresh
bin/console plugin:install --activate DfGtagManager
bin/console assets:install
bin/console cache:clear
Wskazówka. Po assets:install plik df-gtag-manager.js jest publikowany w public/bundles/dfgtagmanager/ i staje się dostępny przez helper assetów Twig. Nie jest potrzebny żaden build webpacka ani TypeScriptu.
Konfiguracja
Otwórz konfigurację: Rozszerzenia → Moje rozszerzenia → DataFirefly Google Tag Manager → menu ⋮ → Konfiguruj. Wybierz odpowiedni sales-channel u góry ekranu: każdy sales-channel może mieć własną, niezależną konfigurację.
Ustawienia ogólne
- Włącz plugin: przełącznik główny. Wyłącz, aby odciąć całe wstrzykiwanie bez odinstalowywania.
- Tryb debug: wyświetla logi z prefiksem
[DfGtag]w konsoli przeglądarki (add_to_cart, remove_from_cart, consent update…). Włączaj wyłącznie w środowisku testowym.
Google Tag Manager
- GTM Container ID: format
GTM-XXXXXXX. Znajdziesz go na tagmanager.google.com w prawym górnym rogu swojego kontenera. Zostaw puste, jeśli nie używasz GTM: plugin przełączy się automatycznie na loadergtag.js, o ile podano Measurement ID GA4. - Server-side GTM URL (opcjonalnie): adres URL Twojego loadera Tag Manager server-side (na przykład
https://gtm.twojadomena.com, bez końcowego ukośnika). Zobacz sekcję Server-side GTM poniżej.
Google Analytics 4
- GA4 Measurement ID: format
G-XXXXXXXXXX. Znajdziesz go w GA4 w Administracja → Strumienie danych → Sieć. Używany jako fallbackgtag.js, gdy nie skonfigurowano kontenera GTM, i wypychany do dataLayer na potrzeby tagów GTM. - Wysyłaj automatyczne zdarzenie page_view: domyślnie włączone. Wyłącz, jeśli wolisz wyzwalać
page_viewręcznie z GTM.
Consent Mode v2
- Włącz Consent Mode v2: emituje
gtag consent defaultprzed załadowaniem GTM, z siedmioma kategoriami Consent Mode v2. Zobacz Consent Mode v2 w szczegółach. - Domyślny stan zgody:
- Odmowa: zalecane dla UE/RODO. Żaden cookie analityczny ani reklamowy nie jest zapisywany przed akceptacją użytkownika.
- Udzielona: zarezerwuj dla odwiedzających spoza UE albo dla sklepów kierowanych do odbiorców zawodowych nieobjętych RODO.
- Włącz url_passthrough: zachowuje parametry
gclid,_gl,dclidmiędzy stronami nawet przy odrzuconych cookies. Przydatne przy atrybucji multi-touch. - Włącz ads_data_redaction przy odmowie: redaguje identyfikatory reklamowe wysyłane do Google Ads, gdy użytkownik odmawia. Dodatkowo zmniejsza powierzchnię śledzenia.
Enhanced Conversions
- Włącz Enhanced Conversions: wypycha obiekt
user_dataz e-mailem, telefonem, imieniem, nazwiskiem, ulicą, miastem i kodem pocztowym, wszystkim haszowanym SHA-256 po stronie serwera, na stronach confirm i finish ścieżki zakupowej. Zobacz Enhanced Conversions w szczegółach.
Google Shopping / Merchant Center
- Źródło item_id: określa, co plugin wypycha jako
item_idw każdym itemie GA4. Ta wartość musi odpowiadać poluidTwojego feedu Merchant Center. Trzy opcje:- Product number (SKU): zalecane, najczęstszy format w feedach XML/CSV Merchant Center.
- Shopware UUID: przydatne, jeśli generujesz feed bezpośrednio z bazy Shopware.
- EAN / GTIN: przydatne, jeśli Twój feed opiera się na międzynarodowych kodach kreskowych.
- Domyślna kategoria Google: wartość wypychana w
google_product_category, gdy ani produkt, ani jego kategoria jej nie definiuje. Format Google (na przykładApparel & Accessories > Clothing). - Domyślna marka: używana jako fallback w
item_brand, gdy produkt nie ma przypisanego producenta.
Zdarzenia
Każde zdarzenie GA4 można włączyć indywidualnie. Odznacz te, których nie chcesz.
- view_item: karta produktu
- view_item_list: strona kategorii i wyniki wyszukiwania
- add_to_cart: kliknięcie przycisku dodania do koszyka (listener JavaScript)
- remove_from_cart: usunięcie pozycji z koszyka albo z offcanvas
- view_cart: strona koszyka
- begin_checkout: strona potwierdzenia w ścieżce zakupowej
- purchase: strona finish po złożeniu zamówienia
- search: strona wyników wyszukiwania
- login / sign_up: wysłanie formularzy konta
Consent Mode v2 w szczegółach
Consent Mode v2 to oficjalny mechanizm Google do obsługi zgody użytkownika. Od marca 2024 Google Ads wymaga go od reklamodawców kierujących reklamy do Europejskiego Obszaru Gospodarczego: bez niego tracisz dostęp do remarketingu i pomiaru konwersji.
Kolejność ładowania
Plugin gwarantuje następującą kolejność na każdej stronie storefrontu:
- Inicjalizacja
window.dataLayeri stubagtag() - Emisja
gtag consent defaultz siedmioma kategoriami Consent Mode v2 iwait_for_update: 500 - Emisja
url_passthroughiads_data_redaction, jeśli są włączone - Wypchnięcie zdarzeń GA4 danej strony (view_item, view_cart…) do dataLayer
- Załadowanie skryptu GTM (albo
gtag.jsjako fallback)
Dlaczego wait_for_update: 500? Ta instrukcja mówi Google, aby odczekał do 500 ms po załadowaniu strony przed wysłaniem hitów w trybie odmowy, dając czas Twojemu banerowi cookies na zebranie odpowiedzi użytkownika, a pluginowi na wypchnięcie gtag consent update. Bez tego opóźnienia wszystkie początkowe hity wychodzą w trybie odmowy, nawet jeśli użytkownik natychmiast zaakceptuje.
Integracja z banerem cookies Shopware
Plugin dekoruje CookieProviderInterface i rejestruje dwa wirtualne cookies w grupach natywnego banera:
df-gtag-analyticsw grupie Statystyki: sterujeanalytics_storagedf-gtag-adsw grupie Marketing: sterujead_storage,ad_user_data,ad_personalization
Gdy użytkownik zatwierdza swoje preferencje, Shopware emituje zdarzenie CookieConfiguration_Update. Kontroler JavaScript pluginu nasłuchuje tego zdarzenia, odczytuje wartość obu wirtualnych cookies i natychmiast emituje odpowiadający gtag consent update.
Zgodność z banerem firm trzecich
Jeśli zamiast natywnego banera Shopware używasz Cookiebota, CookieFirst, OneTrust albo Axeptio, musisz samodzielnie emitować gtag consent update z tego banera, z właściwymi kategoriami. Plugin Ci tego nie utrudnia: obsługuje wyłącznie początkowy consent default i nasłuch zdarzenia Shopware.
Enhanced Conversions w szczegółach
Enhanced Conversions poprawiają precyzję pomiaru w Google Ads, wysyłając dane użytkownika first-party (e-mail, telefon, imię i nazwisko, adres) haszowane SHA-256 przy konwersji. Google następnie łączy te konwersje z zalogowanymi użytkownikami Google, co zwykle odzyskuje od 10 do 30% konwersji wcześniej traconych przez blokery cookies, ruch cross-device albo zmianę przeglądarki.
Stosowana normalizacja
Plugin normalizuje każde pole zgodnie ze specyfikacją Google przed haszowaniem:
- E-mail: małe litery, przycięte spacje, następnie SHA-256
- Telefon: E.164 (prefiks kraju automatycznie z kodu ISO adresu rozliczeniowego, przykład
+48601234567), następnie SHA-256 - Imię, nazwisko, ulica, miasto: małe litery, przycięte spacje, następnie SHA-256
- Kod pocztowy: małe litery, przycięte spacje; dla USA obcinany do pierwszych 5 cyfr przed haszowaniem
- Kraj: kod ISO-2 wielkimi literami, niehaszowany
Payload dataLayer
Przy zdarzeniach begin_checkout i purchase plugin wypycha:
{
"event": "purchase",
"ecommerce": { ... },
"user_data": {
"sha256_email_address": "...",
"sha256_phone_number": "...",
"address": {
"sha256_first_name": "...",
"sha256_last_name": "...",
"sha256_street": "...",
"sha256_city": "...",
"postal_code": "...",
"country": "PL"
}
}
}
Konfiguracja w GTM
- W swoim kontenerze GTM utwórz albo edytuj tag Google Ads Conversion Tracking
- Sekcja Include user-provided data from your website → Manual configuration
- Utwórz osiem zmiennych Data Layer Variable wskazujących na:
user_data.sha256_email_address→ mapowane na Email (hashed)user_data.sha256_phone_number→ mapowane na Phone (hashed)user_data.address.sha256_first_name→ First name (hashed)user_data.address.sha256_last_name→ Last name (hashed)user_data.address.sha256_street→ Street (hashed)user_data.address.sha256_city→ City (hashed)user_data.address.postal_code→ Postal codeuser_data.address.country→ Country
- Zapisz i opublikuj kontener
Uwaga. Google wymaga, aby wartości były zahaszowane już po stronie witryny: nie stosuj do tych zmiennych zmiennej SHA-256 Hash z GTM, one wychodzą z pluginu już zahaszowane. Podwójne haszowanie uniemożliwiłoby dopasowanie.
Google Shopping i feed Merchant Center
Aby GA4 i Google Ads mogły dopasować zdarzenia e-commerce do Twoich produktów Shopping, każdy item w dataLayer musi używać tego samego item_id co feed Merchant Center.
Pola wypychane w każdym itemie
item_id: konfigurowalne źródło (SKU / UUID / EAN)item_name: nazwa produktu w aktywnym językuitem_brand: nazwa producenta albo marka domyślna, jeśli nie podanoitem_categorydoitem_category5: pełna ścieżka nawigacyjna od najgłębszej kategoriigoogle_product_category: zobacz niżejprice,quantity,currencympn: Manufacturer Part Number, jeśli uzupełniony na produkciegtin: EAN, jeśli uzupełnionydiscount: obliczany z różnicy między ceną przekreśloną a ceną sprzedaży
google_product_category per produkt
Możesz nadpisać kategorię Google Shopping dla produktu albo kategorii przez pole niestandardowe:
- W panelu: Ustawienia → System → Pola niestandardowe → Utwórz nowy zestaw
- Nazwa techniczna:
df_google_product_category, typ Tekst - Przypisz ten zestaw do encji Produkt i/albo Kategoria
- Na każdym produkcie albo kategorii uzupełnij wartość Google (na przykład
Sporting Goods > Athletics > Football > Football Balls)
Plugin szuka wartości w tej kolejności: pole niestandardowe produktu → pole niestandardowe jego najgłębszej kategorii → globalna wartość domyślna z konfiguracji.
Server-side GTM
Tagowanie server-side pozwala kierować ruch GTM przez domenę, którą kontrolujesz, co omija blokery przeglądarkowe, chroni dane użytkowników i poprawia odporność na zmiany polityk cookies.
Wymagania
- Skonfigurowany kontener server-side GTM (zobacz dokumentację Google)
- Dedykowana domena albo subdomena wskazująca na Twój serwer Tag Manager, na przykład
gtm.twojadomena.com
Aktywacja
W konfiguracji pluginu, w sekcji Google Tag Manager, uzupełnij Server-side GTM URL swoją domeną bez końcowego ukośnika:
https://gtm.twojadomena.com
Skrypt GTM i ramka noscript będą automatycznie wskazywać na Twój serwer zamiast na www.googletagmanager.com.
Weryfikacja
Google Tag Assistant
- Zainstaluj rozszerzenie Chrome Tag Assistant Companion
- Otwórz tagassistant.google.com, kliknij Add domain i wpisz adres swojego storefrontu
- Przejdź na kartę produktu, dodaj do koszyka, przejdź do checkoutu: każdy krok powinien pojawić się w asystencie wraz z odpowiadającymi zdarzeniami GA4
GA4 DebugView
W GA4: Administracja → DebugView. Zdarzenia pojawiają się tam w czasie rzeczywistym, gdy tryb debug jest aktywny w pluginie albo gdy wysyłany jest parametr debug_mode=true.
Tryb debug pluginu
Włącz Tryb debug w konfiguracji, a następnie otwórz konsolę przeglądarki. Zobaczysz:
[DfGtag] consent update { analytics_storage: "granted", ad_storage: "denied", ... }
[DfGtag] add_to_cart { item_id: "SW10001", item_name: "...", price: 129, quantity: 1 }
[DfGtag] remove_from_cart { ... }
Lista kontrolna walidacji
- Na stronie głównej: consent default emitowany przed skryptem GTM (kolejność znaczników w sekcji head)
- Na karcie produktu:
view_itemzitem_id,item_brand,item_category,google_product_category - Przy dodaniu do koszyka:
add_to_cartz tym samym itemem - W koszyku:
view_cartze wszystkimi itemami - Na stronie confirm:
begin_checkoutz zahaszowanymuser_data - Na stronie finish:
purchaseztransaction_id,value,tax,shipping,currency,itemsi zahaszowanymuser_data - Przy akceptacji cookies:
consent updatez kategoriami granted
Rozwiązywanie problemów
Zdarzenia nie pojawiają się w GA4 DebugView
- Sprawdź, czy Measurement ID GA4 w konfiguracji jest poprawne
- Sprawdź, czy tag GA4 Configuration jest utworzony i opublikowany w Twoim kontenerze GTM
- Sprawdź, czy wyzwalacz tagu obejmuje wszystkie strony (All Pages)
- Wyczyść cache Shopware i przeładuj stronę twardym odświeżeniem (Ctrl+F5)
Enhanced Conversions nie dopasowują się
- Sprawdź, czy do zmiennych
user_datanie jest stosowana dodatkowa transformacja (zmienna SHA-256 Hash z GTM): wartości wychodzą już zahaszowane - Sprawdź format E.164 telefonu w dataLayer (z prefiksem kraju zaczynającym się od
+) - Sprawdź, czy pole
countryjest w ISO-2 wielkimi literami (PL, a niePolska) - Odczekaj 24 do 48 godzin po aktywacji: Google Ads potrzebuje tego czasu na pierwszą synchronizację
Consent update nie jest emitowany, gdy użytkownik akceptuje
- Potwierdź, że używany baner to rzeczywiście natywny baner Shopware
- Otwórz konsolę przeglądarki w trybie debug i sprawdź, czy zdarzenie
CookieConfiguration_Updatejest emitowane, gdy użytkownik zatwierdza baner - Sprawdź, czy cookies
df-gtag-analyticsidf-gtag-adspojawiają się w banerze i są zaznaczone
item_id nie pasuje do mojego feedu Merchant Center
- Otwórz swój feed XML/CSV i sprawdź pole
<g:id>dla jednego produktu - W konfiguracji pluginu wybierz źródło
item_id, które daje dokładnie tę samą wartość (SKU, UUID albo EAN) - Jeśli Twój feed używa prefiksu (na przykład
shopware_SW10001), trzeba utworzyć tag GTM dodający prefiks do wartości przed wysyłką do Google Ads
Plugin nie ładuje się na niektórych stronach
- Sprawdź, czy bieżący sales-channel ma Włącz plugin ustawione na ON w swojej własnej konfiguracji
- Niektóre strony niestandardowe (własne landing page CMS) mogą nie wyzwalać standardowych Page Loaded Events. W takim przypadku kontener GTM i tak jest ładowany przez header pagelet.