No description
  • PHP 59.2%
  • JavaScript 22.3%
  • Twig 17.3%
  • SCSS 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Christian Säum | Web-SEO-Consulting 8a6bdaf7e0
All checks were successful
CI / build-zip (push) Successful in 9s
CI / phpstan (push) Successful in 38s
CI / cs-check (push) Successful in 20s
Merge fix/ecommerce-reset-clobbers-purchase-event: fix purchase never tracked in Matomo (v1.5.11)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N3GxdDaptEQhdqrUrJ6Fbh
2026-09-13 20:57:33 +02:00
.forgejo/workflows ci: remove Codeberg mirror job 2026-08-04 14:19:31 +02:00
.idea Tree Menu im EventBuilder reagiert nun richtig auf das Feld was ich anwähle 2026-05-04 21:49:48 +02:00
matomo-container-backups docs(matomo): add container backup and installation guide 2026-09-13 17:33:02 +02:00
src fix(datalayer): only reset ecommerce before events that carry ecommerce data 2026-09-13 20:57:29 +02:00
tests Übernahme ins GitLab 2026-05-02 21:39:49 +02:00
.gitattributes Bool Werte in Switch Select umgestellt 2026-05-03 13:41:04 +02:00
.gitignore feat: v1.2.0 – DSGVO user_data Event, Admin-UI Bugfixes & Build-Assets 2026-05-03 20:16:28 +02:00
.php-cs-fixer.dist.php chore(ci): GitLab-CI auf Forgejo Actions umstellen 2026-06-12 10:45:22 +02:00
AGENTS.md fix(ci): ZIP-Ordnername = Repo-Name (Shopware-Plugin-Verzeichnis) 2026-06-12 12:47:26 +02:00
CICD-Actions.md fix(ci): ZIP-Ordnername = Repo-Name (Shopware-Plugin-Verzeichnis) 2026-06-12 12:47:26 +02:00
CLAUDE.md Bool Werte in Switch Select umgestellt 2026-05-03 13:41:04 +02:00
composer.json fix(datalayer): only reset ecommerce before events that carry ecommerce data 2026-09-13 20:57:29 +02:00
Event-Testmatrix.md Add event test matrix as markdown 2026-05-27 14:05:09 +02:00
LICENSE chore(license): add GPL-3.0-or-later license and copyright notice 2026-09-02 21:14:42 +02:00
Matomo-BOT-Tracker.md fix(matomo): capture sales channel ID before it's lost at kernel.terminate 2026-08-04 17:15:30 +02:00
Matomo-Installation.md docs(matomo): document consent-integration prerequisite and v1.5.10 fixes 2026-09-13 19:10:40 +02:00
noch-zu-machen.md fix(shopware): use native CategoryBreadcrumbBuilder for item_category 2026-06-10 20:42:51 +02:00
phpstan.neon fix(ci): phpstan mit aufgelöstem Shopware-Framework als echter Gate 2026-06-12 11:55:28 +02:00
phpunit.xml Bool Werte in Switch Select umgestellt 2026-05-03 13:41:04 +02:00
Projekt.md Projektdaten und verlauf dateien mit ins Repo übernehmen 2026-06-10 22:11:05 +02:00
README.md chore(license): add GPL-3.0-or-later license and copyright notice 2026-09-02 21:14:42 +02:00
STATUS.md docs(matomo): add container backup and installation guide 2026-09-13 17:33:02 +02:00
Variable-Reference-add_payment_info.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-add_shipping_info.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-add_to_cart.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-add_to_wishlist.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-begin_checkout.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-common.md docs: document affiliate/coupon usage and correct variable references 2026-06-11 22:35:54 +02:00
Variable-Reference-generate_lead.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-login.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-purchase.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-remove_from_cart.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-search.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-select_item.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-select_promotion.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-sign_up.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-user_data.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-view_cart.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-view_item.md docs: document affiliate/coupon usage and correct variable references 2026-06-11 22:35:54 +02:00
Variable-Reference-view_item_list.md docs: document affiliate/coupon usage and correct variable references 2026-06-11 22:35:54 +02:00
Variable-Reference-view_promotion.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
Variable-Reference-view_search_results.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
was-noch-zu-tun-ist.md feat(events)!: GA4-Events vervollständigen, Migrationen auf Install-Stand konsolidieren 2026-06-12 10:18:27 +02:00
was-wir-haben.md docs(config): clarify wscConsentIntegration setting (DE/EN/FR) 2026-06-18 22:36:54 +02:00

WSC DataLayer Plugin für Shopware 6

Shopware 6 Plugin für Google Tag Manager (GTM), Google Analytics 4 (GA4) und Matomo Tag Manager Integration mit hierarchischer Event- und Feld-Konfiguration.

Features

  • 🎯 Hierarchische Feld-Verwaltung: Organisiere DataLayer-Felder wie Kategorien mit Baum-Struktur
  • 🏷️ Google Tag Manager (GTM) Integration mit Server-Side Support
  • 📊 Matomo Tag Manager (MTM) Integration
  • 🔒 DSGVO-konform: Integrierter Hash-Filter für personenbezogene Daten
  • ⚙️ Flexible Konfiguration: Platzhalter wie {customer.email} oder {item.price} für dynamische Feldwerte
  • 🔄 Shopware Native Events: Nutzt Shopware 6.7.7.0+ GA4-Events
  • 🎨 Pro Event konfigurierbar: Jedes Event einzeln anpassbar
  • 📝 Default-Felder: Vorkonfigurierte Shopware-Standard-Felder

Installation

# Plugin ins custom/plugins Verzeichnis kopieren
cd custom/plugins
git clone <repository-url> WSCPluginSWDatalayerGA4Matomo

# Plugin installieren und aktivieren
bin/console plugin:refresh
bin/console plugin:install --activate WSCPluginSWDatalayerGA4Matomo

# Frontend neu kompilieren
bin/build-storefront.sh

# Administration neu kompilieren
./bin/build-administration.sh

# Cache leeren
bin/console cache:clear

Konfiguration

Plugin-Einstellungen

Navigiere zu: Einstellungen → System → Plugins → WSC DataLayer

1. DataLayer Settings

  • Enable DataLayer: Master-Schalter für gesamte Funktionalität
  • Google DataLayer: Aktiviert window.dataLayer für GTM/GA4
  • Matomo DataLayer: Aktiviert window._mtm für Matomo Tag Manager
  • Debug Mode: Zeigt Debug-Ausgaben in der Browser-Konsole

2. Google Tag Manager

  • Enable GTM: Google Tag Manager aktivieren
  • GTM Container ID: z.B. GTM-XXXXXXX
  • Server-Side GTM: Optional für Server-Side Tracking
  • Server-Side URL: URL deines Server-Side GTM Containers

3. Matomo Tag Manager

  • Enable MTM: Matomo Tag Manager aktivieren
  • Matomo Server URL: z.B. https://matomo.yourdomain.com/
  • Container ID: z.B. container_abc123
  • Cookie Consent Plugin: Wähle dein Cookie-Consent-Plugin
  • Consent Category: Kategorie für Tracking-Zustimmung
  • Consent Wait Time: Wartezeit auf Consent in Millisekunden (Standard: 500ms)

Event-Konfiguration

Navigiere zu: Einstellungen → WSC DataLayer Events

Hier siehst du alle verfügbaren Events:

  • view_item, add_to_cart, remove_from_cart
  • begin_checkout, add_payment_info, purchase
  • login, sign_up
  • search, view_item_list
  • uvm.

Für jedes Event kannst du:

  1. Eigenen Event-Namen definieren
  2. Felder hierarchisch organisieren
  3. Google/Matomo einzeln aktivieren/deaktivieren
  4. Custom Fields hinzufügen

Hierarchische Feld-Verwaltung

Baum-Struktur

Events organisieren ihre Felder in einer Baum-Struktur ähnlich wie Kategorien:

ecommerce
├── currency
├── value
└── items (Array)
    ├── item_id
    ├── item_name
    ├── price
    └── quantity

Feld-Editor

Wenn du ein Event bearbeitest, siehst du:

  • Links (450px): Feld-Baum mit allen Feldern
  • Rechts: Feld-Editor für ausgewähltes Feld

Feld-Eigenschaften:

  • Name: Feldname im DataLayer (z.B. email, price)
  • Typ:
    • shopware: Von Shopware bereitgestellter Wert
    • static: Statischer Wert
  • dynamic: Dynamischer Wert mit Platzhaltern
    • calculated: Berechneter Wert
  • Wert: Fester Wert oder Platzhalter in {path}-Syntax, z.B. {customer.email}
  • Beschreibung: Interne Notiz
  • Aktiviert: Feld im DataLayer ausgeben
  • Als Event feuern: Feld als separates Event feuern (nur Root-Level)

Default-Felder vs. Custom Fields

🔒 Default-Felder (Shopware-Standard):

  • Automatisch beim Plugin-Installation erstellt
  • Gekennzeichnet mit Schloss-Icon 🔒
  • Können nur aktiviert/deaktiviert werden
  • Name, Typ und Wert sind nicht änderbar

✏️ Custom Fields:

  • Vom Benutzer erstellt
  • Vollständig editierbar
  • Können gelöscht werden
  • Hierarchisch organisierbar

Platzhalter und Hashing

Übersicht

Feldwerte werden nicht als Twig gerendert. Verwende Platzhalter in {path}-Syntax und steuere Hashing über das Feld Hash-Algorithmus im Admin.

Verfügbare Algorithmen:

  • sha256 (Standard)
  • sha512
  • sha1
  • md5

Verwendung

Basis-Syntax

{customer.email}
{customer.firstName}
{customer.defaultBillingAddress.phoneNumber}
{item.price}
{context.currency.isoCode}

Hashing

Wähle im Feld-Editor SHA-256 oder SHA-512. Der Wert wird vor dem Hashing automatisch getrimmt und kleingeschrieben.

Best Practices für DSGVO

Google Enhanced Conversions / Facebook CAPI:

Gemäß Google/Facebook-Richtlinien sollten personenbezogene Daten gehasht UND normalisiert werden:

email: {customer.email} mit Hash-Algorithmus SHA-256
first_name: {customer.firstName} mit Hash-Algorithmus SHA-256
last_name: {customer.lastName} mit Hash-Algorithmus SHA-256
phone_number: {customer.defaultBillingAddress.phoneNumber} mit Hash-Algorithmus SHA-256
city: {customer.defaultBillingAddress.city} mit Hash-Algorithmus SHA-256
postal_code: {customer.defaultBillingAddress.zipcode} mit Hash-Algorithmus SHA-256
country: {customer.defaultBillingAddress.country.iso} mit Hash-Algorithmus SHA-256

Beispiel: Login Event

user_data.email: {customer.email}, Hash-Algorithmus SHA-256
user_data.phone_number: {customer.defaultBillingAddress.phoneNumber}, Hash-Algorithmus SHA-256
user_data.city: {customer.defaultBillingAddress.city}, Hash-Algorithmus SHA-256

Resultierende DataLayer:

{
  event: 'login',
  method: 'email',
  user_data: {
    email: 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3',  // SHA-256 von "test@example.com"
    first_name: '96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a',
    last_name: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08',
    phone_number: '2c6ee24b09816a6f14f95d1698b24ead40bcc53a39b7e2d2cd5c8e87e45e88cd',
    city: '4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce',
    postal_code: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    country: '3f39d5c348e5b79d06e842c114e6cc571583bbf44e4b0ebfda1a01ec05745d43'
  }
}

Default-Werte für Login/Sign-Up Events

Das Plugin erstellt automatisch user_data Felder mit Feld-basiertem Hashing für login und sign_up Events:

  • ✅ email: {customer.email}, Hash-Algorithmus SHA-256
  • ✅ first_name: {customer.firstName}, Hash-Algorithmus SHA-256
  • ✅ last_name: {customer.lastName}, Hash-Algorithmus SHA-256
  • ✅ phone_number: {customer.defaultBillingAddress.phoneNumber}, Hash-Algorithmus SHA-256
  • ✅ city: {customer.defaultBillingAddress.city}, Hash-Algorithmus SHA-256
  • ✅ postal_code: {customer.defaultBillingAddress.zipcode}, Hash-Algorithmus SHA-256
  • ✅ country: {customer.defaultBillingAddress.country.iso}, Hash-Algorithmus SHA-256

Diese Felder können:

  • ✅ Aktiviert/Deaktiviert werden
  • ❌ Nicht in Name/Typ/Wert geändert werden (Shopware-Standard)

Für andere Felder:

  • Du kannst eigene Custom Fields erstellen
  • Hash-Algorithmus nach Bedarf setzen oder entfernen
  • Verschiedene Algorithmen verwenden

Verfügbare Platzhalter

Je nach Event stehen dir verschiedene Variablen zur Verfügung:

E-Commerce Events

{currency}              # EUR, USD, etc.
{value}                 # Gesamtwert
{tax}                   # Steuern
{shipping}              # Versandkosten
{coupon}                # Gutscheincode
{transaction_id}        # Bestellnummer
{affiliation}           # Shop-Name

# In items-Array
{item.id}               # Produkt-ID
{item.label}            # Produktname
{item.manufacturer.name}# Marke
{item.category}         # Kategorie
{item.price}            # Preis
{item.quantity}         # Menge

User Events (login, sign_up)

{customer.email}
{customer.firstName}
{customer.lastName}
{customer.customerNumber}
{customer.defaultBillingAddress.phoneNumber}
{customer.defaultBillingAddress.street}
{customer.defaultBillingAddress.city}
{customer.defaultBillingAddress.zipcode}
{customer.defaultBillingAddress.country.iso}
{customer.defaultBillingAddress.country.name}

Search Event

{search_term}           # Suchbegriff

Shopware Native Events

Shopware 6.7.7.0+ bietet native GA4-Events:

Automatisch von Shopware gepusht:

  • ✅ add_to_cart (Produkt in Warenkorb)
  • ✅ remove_from_cart (Produkt aus Warenkorb)
  • ✅ view_item (Produktseite)
  • ✅ view_cart (Warenkorb anzeigen)
  • ✅ begin_checkout (Checkout starten)
  • ✅ add_shipping_info (Versandart wählen)
  • ✅ add_payment_info (Zahlungsart wählen)
  • ✅ purchase (Bestellung abschließen)
  • ✅ add_to_wishlist (Zur Wunschliste)
  • ✅ remove_from_wishlist (Von Wunschliste entfernen)

Zusätzlich vom Plugin:

  • 🔸 view_item_list (Kategorie/Listing)
  • 🔸 view_search_results (Suchfunktion)
  • 🔸 login (Benutzer-Login)
  • 🔸 sign_up (Registrierung)
  • 🔸 select_item (Produktklick im Listing)
  • 🔸 select_promotion (Promotion-Klick)
  • 🔸 view_promotion (Promotion-View)

Debugging

Browser-Konsole

Aktiviere Debug Mode in den Plugin-Einstellungen.

Ausgabe:

[WSC DataLayer] GTM loaded: GTM-XXXXXXX
[WSC DataLayer] Matomo Tag Manager loaded: container_abc123
[WSC DataLayer] Event pushed: view_item_list
{
  event: 'view_item_list',
  ecommerce: {
    currency: 'EUR',
    value: 29.99,
    items: [...]
  }
}

Google Tag Manager Preview

  1. GTM Container öffnen
  2. Preview Klicken
  3. Shop-URL eingeben
  4. Events im Tag Assistant prüfen

DataLayer-Inspektion

Browser-Konsole:

// Google DataLayer
console.log(window.dataLayer);

// Matomo DataLayer
console.log(window._mtm);

// Letztes Event
console.log(window.dataLayer[window.dataLayer.length - 1]);

Migration von älteren Versionen

Von globalem Hash-Switch zu Feld-basiertem Hashing

Alt (bis v1.x):

  • Globaler Switch: "Benutzerdaten hashen (SHA-256)"
  • Alle User-Daten automatisch gehasht

Neu (ab v2.x):

  • Hash-Algorithmus pro Feld konfigurierbar
  • Default-Felder bereits mit SHA-256 konfiguriert
  • Flexibler: Nur gewünschte Felder hashen

Keine Aktion erforderlich: Default-Felder für login/sign_up sind bereits mit SHA-256 vorkonfiguriert.

Support & Entwicklung

Logs

Fehler prüfen:

# Shopware Logs
tail -f var/log/dev.log
tail -f var/log/prod.log

# Plugin-spezifische Logs
grep "WSC\|DataLayer" var/log/dev.log

Cache leeren

Nach Änderungen an Feldern:

bin/console cache:clear

Frontend neu kompilieren

Nach Template-Änderungen:

bin/build-storefront.sh

Administration neu kompilieren

Nach Admin-Änderungen:

./bin/build-administration.sh
bin/console cache:clear

Lizenz

Copyright (C) 2026 Christian Säum – web-seo-consulting.eu

Dieses Projekt steht unter der GNU General Public License, Version 3 oder (nach deiner Wahl) einer späteren Version (GPL-3.0-or-later). Der vollständige Lizenztext steht in der Datei LICENSE.

Du darfst die Software nutzen, weitergeben und – auch kommerziell – verkaufen. Gibst du eine veränderte Fassung weiter, muss deren Quellcode ebenfalls unter der GPL-3.0-or-later verfügbar sein. Der Copyright-Hinweis und die Nennung des ursprünglichen Autors dürfen nicht entfernt werden.

Support

Bei Fragen oder Problemen:


Version: 2.0.0 Shopware Kompatibilität: 6.7.7.0+ PHP: 8.1+