StartseiteDokumentationGoogle Tag Manager

    Google Tag Manager

    Nahtlose GTM-Integration mit GA4-Events für Shopware 6

    Überblick

    BronnGoogleTagManager integriert Google Tag Manager und Google Consent Mode v2 nahtlos in Shopware 6. Das Plugin liefert sechs GA4-Enhanced-E-Commerce-Events (page_view, view_item, view_item_list, add_to_cart, begin_checkout, purchase), Hard-Blocking via Consent Mode v2 und eine automatische Brücke zum Shopware-Standard-Cookie-Banner.

    Was das Plugin in Version 1.2.2 mitbringt:

  1. Theme-resistente Auslieferung des GTM-Snippets via KernelResponseSubscriber (funktioniert auch bei stark angepassten Custom-Themes, die `base.html.twig`-Block-Overrides schlucken)
  2. Inline-Tracking ohne externes JavaScript-Bundle — Plugin funktioniert direkt nach ZIP-Upload, ohne dass auf dem Server `bin/build-storefront.sh` ausgeführt werden muss
  3. Click-Source-Tracking via sessionStorage: vererbt `item_list_id`, `item_list_name` und `index` aus der Listing-Quelle an die nachfolgenden `view_item`- und `add_to_cart`-Events
  4. Property-Mapping mit Cascading-Fallback für Kategorie (`seoCategory` → aktive Navigation → `categories`-Collection), Marke und Variante
  5. Cookie-Banner-Bridge mit drei parallelen Akzeptanz-Triggern
  6. Keine Datenbankmigrationen, kein Admin-Modul, keine Twig-Block-Overrides am Layout. Konfiguration ausschließlich über die Shopware-Plugin-Einstellungen.

    Aktuelle Version: 1.2.2

    Kompatibel mit Shopware 6.7+.

    Systemvoraussetzungen

  7. Shopware 6.7 oder höher (verifiziert auf 6.7.9.1)
  8. PHP 8.1 oder höher
  9. Google Tag Manager Account mit Container-ID (Format: `GTM-XXXXXXX`)
  10. Optional: Cookie-Banner — funktioniert mit dem Shopware-Standard-Cookie-Banner ohne weitere Konfiguration
  11. Installation

    Empfohlener Weg (per ZIP-Upload im Admin):

  12. 1.Aktuelles ZIP unter BronnGoogleTagManager-1.2.2.zip herunterladen
  13. 2.Im Shopware-Admin: Erweiterungen > Eigene Erweiterungen > Erweiterung hochladen — ZIP wählen
  14. 3.Plugin installieren und aktivieren
  15. 4.Im Admin Caches > Cache leeren klicken
  16. Kein bin/build-storefront.sh, kein bin/build-administration.sh, kein theme:compile von der CLI erforderlich — das Plugin nutzt Inline-Tracking + Response-Subscriber und ist damit unmittelbar einsatzbereit.

    Update von einer früheren Version:

    Neues ZIP über die bestehende Installation hochladen, im Admin auf Aktualisieren klicken, anschließend Cache leeren. Snippets werden inkrementell ergänzt — vorhandene Übersetzungen bleiben erhalten.

    Konfiguration

    Die Plugin-Konfiguration liegt unter Erweiterungen > Meine Erweiterungen > Bronn Google Tag Manager > Konfiguration. Alle Schalter sind Sales-Channel-spezifisch.

    Allgemein:

  17. **GTM Container-ID** (`gtmContainerId`, Typ: `text`): Container-ID im Format `GTM-XXXXXXX`. Wenn leer, rendert das Plugin keinerlei Snippet.
  18. **Google Consent Mode v2 aktivieren** (`enableConsentMode`, Typ: `bool`, Standard: `true`): Setzt einen Default-Consent-Status mit allen Werten auf `denied` (außer `security_storage: granted`) vor dem GTM-Snippet. Notwendig für DSGVO-konformes Hard-Blocking. Gleichzeitig wird die Cookie-Banner-Bridge aktiviert, die bei Banner-Akzeptanz `gtag('consent', 'update', granted)` aufruft.
  19. Event-Schalter (alle Standard `true`):

  20. **page_view tracken** (`trackPageView`): Löst bei jedem Seitenaufruf ein `page_view`-Event aus.
  21. **view_item tracken** (`trackViewItem`): Löst auf der Produktdetailseite ein `view_item`-Event mit Marke, Kategorie, Variante und Preis aus.
  22. **view_item_list tracken** (`trackViewItemList`): Löst auf allen Listings (Kategorien, Suche, Cross-Selling, CMS-Listings) ein `view_item_list`-Event mit allen sichtbaren Produkten aus.
  23. **add_to_cart tracken** (`trackAddToCart`): Löst beim Hinzufügen zum Warenkorb ein `add_to_cart`-Event aus, inklusive vererbtem `item_list_id`/`item_list_name`/`index` falls aus einem Listing geklickt.
  24. **begin_checkout tracken** (`trackBeginCheckout`): Löst beim Checkout-Start ein `begin_checkout`-Event mit allen Cart-Items aus.
  25. **purchase tracken** (`trackPurchase`): Löst nach erfolgreicher Bestellung ein `purchase`-Event mit Transaktionsdaten und allen Produktpositionen aus.
  26. GA4 Enhanced-E-Commerce-Events

    Alle Events werden GA4-konform über den dataLayer mit ecommerce-Objekt ausgelöst:

    | Event | Trigger | Daten |

    |---|---|---|

    | page_view | Jeder Seitenaufruf | Standard-GA4 |

    | view_item_list | Listing/Suche/Cross-Selling/CMS-Listing | currency, items[] mit item_id, item_name, item_brand, item_list_id, item_list_name, index, price |

    | view_item | Produktdetailseite | currency, value, items[] mit item_id, item_name, item_brand, item_category, item_category2, item_variant, price, quantity (zusätzlich item_list_* falls aus Listing kommend) |

    | add_to_cart | Klick auf Warenkorb-Button (Inline-Submit-Handler) | currency, value, items[] mit item_id, item_name, item_brand, item_category, item_category2, item_variant, price, quantity (zusätzlich item_list_* falls aus Listing kommend) |

    | begin_checkout | Bestätigungsseite (Checkout-Start) | currency, value, items[] mit allen Cart-Positionen |

    | purchase | Bestellabschlussseite | transaction_id, value, currency, items[] mit allen Produktpositionen |

    Alle Geldwerte werden defensiv per number_format(2, '.', '') ausgegeben — kein Tausendertrenner-Parse-Error im Inline-Block, auch wenn ein Drittanbieter-Decorator die unitPrice manipuliert.

    Click-Source-Tracking:

    Klickt der Nutzer eine Produktkarte aus einem Listing an, schreibt das Plugin {item_id, item_list_id, item_list_name, index, ts} in sessionStorage['bronn_gtm_last_list']. Beim nachfolgenden view_item/add_to_cart werden diese Werte automatisch ans Item gehängt — bis 30 Minuten nach dem Listing-Klick.

    Technische Architektur

    KernelResponseSubscriber (src/Subscriber/KernelResponseSubscriber.php):

    Lauscht auf Symfony\Component\HttpKernel\KernelEvents::RESPONSE. Bei jedem Storefront-HTML-Response (Main-Request, Content-Type text/html, Sales-Channel-Context vorhanden) injiziert der Subscriber per preg_replace:

  27. vor `</head>` den Consent-Default-Block, das GTM-Container-Snippet und die Cookie-Banner-Bridge
  28. nach dem öffnenden `<body...>` den noscript-Fallback
  29. Dieser Ansatz ist theme-resistent: Selbst Custom-Themes, die base_head und base_head_meta_charset ohne {{ parent() }} überschreiben, können den Subscriber nicht umgehen. Der Subscriber arbeitet nach dem Twig-Rendering direkt am fertigen HTML-Output.

    StorefrontSubscriber (src/Subscriber/StorefrontSubscriber.php):

    Reagiert auf StorefrontRenderEvent und stellt Sales-Channel-spezifische Template-Variablen bereit (bronnGtmContainerId, bronnGtmTrackPageView, bronnGtmTrackViewItem, bronnGtmTrackViewItemList, bronnGtmTrackAddToCart, bronnGtmTrackBeginCheckout, bronnGtmTrackPurchase, bronnGtmEnableConsentMode).

    Page-Twig-Overrides (für Inline-Events):

  30. `page/content/product-detail.html.twig`: rendert `view_item`-Event und Inline-`add_to_cart`-Submit-Handler
  31. `component/product/listing.html.twig`: rendert `view_item_list`-Event, registriert Click-Source-Tracker und einen Form-Submit-Handler für Listing-Quick-Buy
  32. `page/checkout/confirm/index.html.twig`: rendert `begin_checkout`-Event
  33. `page/checkout/finish/index.html.twig`: rendert `purchase`-Event mit Transaktionsdaten
  34. `component/buy-widget/buy-widget.html.twig`: setzt data-Attribute auf das Kauf-Widget
  35. Die Page-Twig-Overrides werden vom Theme in der Praxis selten überschrieben — sie sind unkritisch. Globale Inject-Snippets (Head/Body) laufen über den Subscriber.

    JS-Plugins (src/Resources/app/storefront/src/plugin/):

    gtm-add-to-cart.plugin.js und gtm-list-click.plugin.js sind als optionaler Bonus enthalten — sie laufen nur, wenn bin/build-storefront.sh auf dem Server gelaufen ist. Wenn das Inline-Tracking bereits gegriffen hat, treten die JS-Plugins über die bronnGtmInlineTracked-Markierung zurück; kein Doppel-Tracking.

    Snippets:

  36. Namespace: `bronn-google-tag-manager`
  37. Sprachen: DE (`de_DE`) + EN (`en_GB`)
  38. Snippet-Import inkrementell beim Install und Update — bestehende Übersetzungen werden nicht überschrieben.
  39. Kein CSRF-Token, keine eigenen Datenbanktabellen, keine Migrationen, kein Admin-Modul.

    DSGVO & Datenschutz

    Das Plugin selbst setzt keine eigenen Cookies. Mit aktiviertem Google Consent Mode v2 und der Cookie-Banner-Bridge (beides Standard ab v1.2.2) ist DSGVO-konformes Hard-Blocking out-of-the-box gewährleistet:

  40. 1.Beim ersten Seitenaufruf werden ad_storage, ad_user_data, ad_personalization, analytics_storage, functionality_storage und personalization_storage auf denied gesetzt — GTM blockiert ALLE Pixel-Tags.
  41. 2.ads_data_redaction: true und url_passthrough: true schicken zusätzlich anonymisierte Pings, falls einzelne Tags trotzdem feuern.
  42. 3.Klickt der Nutzer im Cookie-Banner auf "Akzeptieren", ruft die Bridge gtag('consent', 'update', granted) auf — erst danach feuert GTM die Marketing-Tags.
  43. 4.Returning-User mit bereits gesetztem cookie-preference-Cookie bekommen automatisch beim Page-Load den granted-Status.
  44. Die Verantwortung für die korrekte Konfiguration der Tags im GTM-Container (z.B. "Wait for Consent" pro Tag) liegt weiterhin beim Shop-Betreiber. Das Plugin liefert die Infrastruktur — die GTM-Tag-Logik bleibt im GTM.

    Kompatibilität & Theme-Verhalten

  45. Shopware **6.7.x** (verifiziert auf 6.7.9.1)
  46. Theme-resistent: Funktioniert auch bei Custom-Themes, die `base_head`-Block-Overrides aus Plugins schlucken (z.B. `zenit-platform-atmos` und ähnliche). Die globalen Snippets werden via Response-Subscriber injiziert, nicht via Twig-Inheritance.
  47. Multi-Sales-Channel-fähig — alle Schalter und die Container-ID sind Sales-Channel-spezifisch.
  48. Funktioniert ohne `bin/build-storefront.sh` und ohne `bin/build-administration.sh`. Der Inline-Tracking-Pfad ist unabhängig vom Storefront-JS-Bundle.
  49. Kompatibel mit dem Shopware-Standard-Cookie-Banner ohne weitere Konfiguration. Bei externen CMPs (Cookiebot, Usercentrics, Consentmanager) ist die Bridge auf den Standard-Banner zugeschnitten — bei Bedarf kann ein eigener `gtag('consent', 'update', ...)`-Aufruf aus der CMP gefeuert werden.
  50. Fehlerbehebung

    Im DataLayer kommt nichts an:

    Im Browser DevTools-Console eingeben: window.dataLayer — sollte mindestens gtm.start und page_view zeigen. Wenn leer: Plugin nicht aktiv oder Container-ID nicht gesetzt.

    add_to_cart triggert nicht:

  51. 1.Aktualisierung im Admin getriggert? (Erweiterungen > Aktualisieren)
  52. 2.Cache geleert? (Caches > Cache leeren)
  53. 3.In der Konsole: nach Klick auf den Warenkorb-Button window.dataLayer.filter(e => e.event === 'add_to_cart') — sollte das Event enthalten.
  54. Consent-Mode bleibt auf denied trotz Cookie-Akzeptanz:

  55. 1.In Console: google_tag_data.ics.entries — wenn default: false und update: undefined, dann ist die Bridge nicht durchgelaufen.
  56. 2.Prüfen ob window.__bronnGtmConsentGranted === true nach Akzeptanz-Klick — wenn nicht, hat der Cookie-Banner-Klick nicht den erwarteten Selektor getroffen.
  57. 3.Für Custom-Cookie-Banner: einen eigenen gtag('consent', 'update', {...})-Aufruf aus dem Banner-Akzeptanz-Handler triggern.
  58. Kategorien sind im view_item leer:

    Das Plugin nutzt einen Cascading-Fallback (seoCategory → aktive Navigation → categories-Collection). Wenn alle drei leer sind, hat das Produkt weder eine SEO-Kategorie noch eine aktive Navigation — item_category bleibt korrekt leer (das ist GA4-konform).

    FAQ

    Bereit für professionelles B2B?

    Statt 30.000–80.000 € Individualentwicklung: fertige, getestete Plugins — einsatzbereit in Stunden.

    • Alle 12 Plugins im vollen Funktionsumfang
    • Persönliche Einführung durch den Entwickler
    • Individuelle Beratung für deinen Use Case

    Keine Kreditkarte nötig · Unverbindlich · Antwort innerhalb von 24h