17. Modul: Kampagnen & Ad-Tracking¶
Das Ad-Tracking-Modul bündelt alle Werbe- und Conversion-Pixel der Website an einer Stelle. Du kannst beliebig viele Kampagnen pro Plattform anlegen — Meta (Facebook/Instagram), Google Ads, Google Analytics 4 und Microsoft Advertising (Bing UET) — und sie gezielt einzelnen Landingpages zuordnen. Pixel werden ausschließlich nach Einwilligung über das Consent-Modul ausgespielt, sodass die Website ohne Zustimmung trackingfrei bleibt.
Das Modul ist nur sichtbar, wenn es in den Modul-Einstellungen aktiviert wurde.
Modul aktivieren¶
- Öffne Einstellungen → Module.
- In der Karte „Content-Module" findest du den Schalter Kampagnen & Ad-Tracking.
- Aktiviere ihn und speichere.
Erst danach erscheint im Hauptmenü unter Module der Eintrag Kampagnen.
Zur Kampagnenliste navigieren¶
Klicke in der Navigation auf Module → Kampagnen.
Die Übersicht zeigt alle gepflegten Kampagnen mit Name, Plattform, Status, Laufzeit und Anzahl zugeordneter Landingpages. Über die Aktions-Spalte gelangst du zum Bearbeiten oder Löschen.
Rollen & Berechtigungen¶
| Rolle | Was kann sie? |
|---|---|
| Administrator | Volle Verwaltung aller Kampagnen inklusive Power-Mode. |
| Super-Admin | Wie Administrator. |
| Kampagnen-Manager | Darf ausschließlich Kampagnen verwalten — kein Zugriff auf Seiten, Medien, Benutzer etc. Ideal für externe Werbeagenturen. |
Der Power-Mode (siehe unten) steht nur Kampagnen-Managern und Super-Admins zur Verfügung.
Neue Kampagne anlegen¶
- Klicke rechts oben auf + Neue Kampagne.
- Fülle die Stammdaten aus.
Stammdaten¶
| Feld | Erklärung |
|---|---|
| Kampagnen-Name | Interne Bezeichnung, z. B. „Sommer-Aktion Meta 2026". |
| Plattform | Meta, Google Ads, GA4, Bing UET oder ChatGPT Ads (OpenAI). |
| Auslieferung | Nur Server, Nur Browser oder Beides. Siehe eigenen Abschnitt unten. |
| IP-Adresse und User-Agent mitsenden | Verbessert die Zuordnung, überträgt aber personenbezogene Daten. Ohne Haken meldet der Server nur die gehashten Angaben. |
| Status | Entwurf, Aktiv, Pausiert oder Beendet. Nur aktive Kampagnen laden Pixel im Frontend. |
| Startzeitpunkt | Optional. Leer = sofort aktiv. |
| Endzeitpunkt | Optional. Leer = offen. Nach Ablauf wird der Pixel nicht mehr geladen. |
| Pixel-/Tag-ID | Plattform-spezifisch (siehe Tabelle unten). |
| Conversion-Tag | Optional, nur für Google Ads oder Meta-Custom-Events. |
| Zugeordnete Landingpages | Pixel werden nur auf den ausgewählten Seiten geladen. Mehrfachauswahl möglich. |
| Interne Notizen | Freitext, nicht im Frontend sichtbar. |
Pixel-/Tag-ID-Formate¶
| Plattform | Format | Beispiel |
|---|---|---|
| Meta | 15- oder 16-stellige Zahl | 1234567890123456 |
| Google Ads | AW-XXXXXXXXX oder mit Conversion-Label AW-XXX/abcDEF |
AW-123456789 |
| GA4 | G-XXXXXXXXXX |
G-ABC1234DEF |
| Bing UET | 9-stellige Tag-ID | 123456789 |
| ChatGPT Ads | 22-stellige Pixel-ID aus dem OpenAI Ads Manager | Bdxn1KE32giTzyzQcFnZS2 |
- Klicke auf Speichern.
Auslieferung: Server, Browser oder beides¶
Der wichtigste Schalter des Moduls, und der einzige mit unmittelbarer datenschutzrechtlicher Wirkung.
| Wahl | Was passiert | Was du dafür brauchst |
|---|---|---|
| Nur Server | Der Browser stellt keinen Request an die Werbeplattform. Gemeldet wird ausschließlich über die Conversions API. | Nichts an der Content-Security-Policy, kein Cookie-Hinweis für ein Fremd-Cookie. Die Zuordnung ist ungenauer, weil die Klick-Kennung der Plattform fehlt. |
| Nur Browser | Klassischer Pixel. | Drittanbieter-Skript und Drittanbieter-Cookie beim Besucher, Einwilligung, CSP-Einträge. |
| Beides | Pixel und Conversions API, dedupliziert über dieselbe Ereignis-ID. | Wie „Nur Browser". Beste Datenlage. |
Bestandskampagnen stehen auf „Beides" — das entspricht dem Verhalten vor diesem Schalter, ein Update ändert also nichts an laufenden Kampagnen. Neu angelegte Kampagnen starten auf „Nur Server".
Achtung bei GA4: „Nur Server" ergibt dort keinen Sinn. Das Measurement Protocol ordnet ein Ereignis über die
client_idaus dem_ga-Cookie zu. Ohne den Browser-Tag gibt es dieses Cookie nicht, und jede Conversion zählt als neuer Nutzer. Für GA4 also „Nur Browser" oder „Beides".
Einwilligung und CSP: beides kommt von selbst¶
Zwei Dinge, um die du dich nicht kümmern musst, sobald eine Kampagne im Browser ausliefert:
Der Einwilligungs-Banner erscheint von selbst. Das Modul meldet dem Kern an,
welche Kategorie es gerade braucht (marketing, bei GA4 analytics), und
benennt dabei die Plattformen der laufenden Kampagnen. Der Banner listet genau
diese. Läuft nur eine ChatGPT-Ads-Kampagne, steht dort „ChatGPT Ads (OpenAI)" und
sonst nichts.
Das war früher anders und die Ursache eines stillen Ausfalls: der Banner hing in den Projekten an Google Analytics. Wer GA nicht nutzte, bekam für einen Meta- oder OpenAI-Pixel nie eine Abfrage, also nie eine Einwilligung, also lud das Skript nie — ohne Fehlermeldung.
Die Content-Security-Policy öffnet sich von selbst. Das Modul meldet die Adressen an, die seine laufenden Kampagnen laden; das Projekt mischt sie ein. Eine pausierte Kampagne öffnet nichts.
Welche Adressen das je Plattform sind, steht in CampaignPlatform::cspSources():
| Plattform | script-src |
connect-src |
|---|---|---|
| Meta | https://connect.facebook.net |
https://www.facebook.com |
| Google Ads / GA4 | https://www.googletagmanager.com |
https://www.google-analytics.com |
| Bing UET | https://bat.bing.com |
https://bat.bing.com |
| ChatGPT Ads | https://bzrcdn.openai.com |
https://bzr.openai.com |
Voraussetzung im Projekt: Die Basis-Vorlage muss
cms_hook('body_end')aufrufen (für den Banner), und der CSP-Listener des Projekts muss dieCspSourceRegistryeinmischen. Beides ist in den ausgelieferten Projekten vorhanden. Fehlt das Erste, bleibt der Banner weg und nichts lädt; fehlt das Zweite, blockt der Browser das Skript lautlos — HTTP 200, korrektes Markup, Verstoß nur in der Konsole.
ChatGPT Ads (OpenAI)¶
Das Token-Feld erwartet den Conversions-API-Key aus dem OpenAI Ads Manager („Manage conversion keys"), die Pixel-ID steht in der Pixel-Übersicht.
OpenAI kennt keine freien Ereignisnamen, sondern dreizehn feste Typen. Das Modul
bildet automatisch ab: Lead → lead_created, Purchase → order_created,
PageView → page_viewed, Registration → registration_completed,
Subscription → subscription_created, Trial → trial_started. Über
event_overrides lässt sich jeder der dreizehn Typen direkt ansteuern; alles
Übrige wird zu custom.
Ortsangaben werden bewusst nicht übertragen: OpenAI erwartet sie im Klartext, das Modul führt sie aber gehasht mit. Ein Hash in einem Klartextfeld verbessert die Zuordnung nicht und wäre trotzdem eine Übermittlung.
Landingpages zuordnen¶
Eine Kampagne ohne Landingpage-Zuordnung lädt nirgendwo Pixel — sie ist sicher und unsichtbar. Erst durch die Mehrfach-Auswahl im Feld „Zugeordnete Landingpages" wird der Pixel auf den ausgewählten Seiten aktiviert.
Tipp: Lege für Marketing-Kampagnen dedizierte Landingpages an (siehe Kapitel Seiten). So bleibt die Auswertung sauber und du vermeidest, dass z. B. ein Conversion-Pixel versehentlich auf der Datenschutzerklärung feuert.
Power-Mode (für Agenturen)¶
Der Power-Mode richtet sich an Werbeagenturen, die plattformspezifische Custom-Events, Trigger-Bedingungen, Enhanced Conversions oder eigene Conversion-Snippets jenseits der Standard-Felder hinterlegen wollen. Eingegeben wird ein JSON-Objekt im Feld „Erweiterte Konfiguration (JSON)". Die Syntax wird beim Speichern validiert — der Inhalt selbst bleibt frei, da jede Plattform andere Strukturen erwartet.
Der Power-Mode ist nur sichtbar, wenn dein Konto die Rolle Kampagnen-Manager (oder Super-Admin) hat.
JSON-Schema je Plattform¶
Meta-Pixel & Conversions API¶
{
"platform": "meta",
"advanced_matching": {
"enabled": true,
"fields": ["email", "phone", "first_name", "last_name", "city", "zip"]
},
"capi": {
"access_token": "EAAxxxxxxxxxxxxxxxxxxxxxxx",
"test_event_code": "TEST12345",
"dataset_id": "1234567890123456"
},
"custom_events": [
{
"name": "Lead",
"trigger": "form_submit",
"selector": "#contact-form",
"value": 50,
"currency": "EUR"
}
],
"exclusions": {
"paths": ["/admin", "/login"],
"user_agents": ["bot", "crawler"]
}
}
📥 Download-Vorlage: meta.json
Google Ads (Enhanced Conversions + Remarketing)¶
{
"platform": "google_ads",
"conversion_id": "AW-123456789",
"conversion_labels": {
"lead": "abc123XYZdef456",
"purchase": "ghi789ABCjkl012"
},
"enhanced_conversions": {
"enabled": true,
"user_data_fields": ["email", "phone_number", "first_name", "last_name"]
},
"remarketing": {
"enabled": true,
"dynamic_remarketing": false
}
}
📥 Download-Vorlage: google_ads.json
Google Analytics 4 (GA4)¶
{
"platform": "ga4",
"measurement_id": "G-XXXXXXXXXX",
"api_secret": "abcdEFGH1234567890ijklMN",
"custom_events": [
{
"name": "generate_lead",
"trigger": "form_submit",
"selector": "#contact-form",
"params": {
"value": 50,
"currency": "EUR"
}
}
],
"consent": {
"ad_storage": "denied",
"analytics_storage": "denied",
"wait_for_update": 500
}
}
📥 Download-Vorlage: ga4.json
Microsoft Advertising (Bing UET)¶
{
"platform": "bing_uet",
"tag_id": "123456789",
"enhanced_conversions": {
"enabled": true,
"user_data_fields": ["email", "phone_number"]
},
"custom_events": [
{
"name": "lead",
"trigger": "form_submit",
"selector": "#contact-form",
"revenue_value": 50,
"currency": "EUR"
}
]
}
📥 Download-Vorlage: bing_uet.json
Wiederkehrende Schlüssel¶
| Schlüssel | Bedeutung |
|---|---|
platform |
Plattform-Identifier (meta, google_ads, ga4, bing_uet). Muss zur ausgewählten Plattform passen. |
custom_events[] |
Liste eigener Events mit Trigger und CSS-Selector. |
custom_events[].trigger |
page_view, form_submit, click, scroll, time_on_page. |
custom_events[].selector |
CSS-Selector des auslösenden Elements (bei click/form_submit). |
consent.* |
Voreinstellungen für den Consent-Mode v2 (Google) oder gleichwertige Plattform-Mechanismen. |
exclusions.paths[] |
Pfade, auf denen der Pixel nie geladen wird (z. B. Backend). |
Hinweis: Phase 1 prüft ausschließlich die JSON-Syntax. Es findet keine Schema-Validierung statt — falsch geschriebene Schlüssel werden stillschweigend ignoriert. Teste eingerichtete Tags daher immer mit dem jeweiligen Browser-Helper (Meta Pixel Helper, Google Tag Assistant, Microsoft UET Tag Helper).
Datenschutz & Consent-Gating¶
Alle Pixel werden ausschließlich nach aktiver Einwilligung über das Consent-Modul geladen. Wichtig:
- Die Plattform muss in der Datenschutzerklärung namentlich aufgeführt sein (Anbieter, Zweck, Rechtsgrundlage, Drittlandsübermittlung).
- Für den Power-Mode gilt: Jede zusätzliche Plattform und jeder zusätzliche Trigger erweitert die Datenschutz-Pflichten. Achte darauf, dass Custom-Events keine personenbezogenen Daten direkt mitsenden (kein Klartext-Mail, keine IDs aus dem Login-Bereich).
- Conversions API / Server-Side-Events (z. B. Meta CAPI, OpenAI) erfordern in der Regel ein zusätzliches DPA mit dem Anbieter.
- Server-Side allein ist keine Einwilligungsfreiheit. „Nur Server" spart das Fremd-Skript und das Fremd-Cookie, also den Zugriff auf das Endgerät nach § 25 TDDDG. Die Übermittlung an die Werbeplattform bleibt eine Verarbeitung personenbezogener Daten und braucht weiterhin eine Rechtsgrundlage — in aller Regel die Einwilligung.
- Die Einwilligung muss nicht aus einem Cookie kommen. Betrifft ein Vorgang ausschließlich angemeldete Nutzer, kann sie als Feld am Benutzerkonto liegen; ein Cookie-Banner erübrigt sich dann. Der
ServerSideConsentGuardrespektiert eine so mitgegebene Entscheidung und überschreibt sie nicht. - Das Attributions-Cookie
cms_attributionwird seit dieser Fassung nur mit Marketing-Consent gesetzt. Projekte ohne Cookie-Consent bekommen es nicht mehr; die Herkunft reist dort über versteckte Formularfelder (utm_hidden_fields()). - Mit
dispatch_conditionslässt sich nach dem Ereignisnamen filtern, etwa{"event_name_not_equals": "Lead"}, um automatische Kontaktformular-Meldungen auszuschließen.
Häufige Fragen¶
Mein Pixel feuert nicht — was tun?
- Ist die Kampagne Aktiv und liegt das heutige Datum im Start/End-Zeitraum?
- Ist die geöffnete Seite den Landingpages der Kampagne zugeordnet?
- Hat der Besucher dem Tracking via Consent-Banner zugestimmt?
- Ist das Modul in Einstellungen → Module überhaupt aktiviert?
Kann ich mehrere Kampagnen pro Plattform aktiv haben?
Ja. Es gibt z. B. häufig parallel eine GA4-Kampagne (immer aktiv) und eine separate Google-Ads-Kampagne (zeitlich limitiert). Beide Pixel feuern unabhängig.
Kann ich den Power-Mode für Admins ausblenden?
Ja, indirekt: Der Power-Mode wird nur Nutzern mit der Rolle Kampagnen-Manager angezeigt. Reine Admins ohne diese Rolle bekommen das Feld nicht zu Gesicht.
Wo finde ich Beispiel-JSON-Vorlagen zum Download?
Direkt in diesem Kapitel verlinkt — siehe Abschnitt Power-Mode oben.