Zum Inhalt

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

  1. Öffne Einstellungen → Module.
  2. In der Karte „Content-Module" findest du den Schalter Kampagnen & Ad-Tracking.
  3. 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

  1. Klicke rechts oben auf + Neue Kampagne.
  2. 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
  1. 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_id aus 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 die CspSourceRegistry einmischen. 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

{
    "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).


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 ServerSideConsentGuard respektiert eine so mitgegebene Entscheidung und überschreibt sie nicht.
  • Das Attributions-Cookie cms_attribution wird 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_conditions lä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?

  1. Ist die Kampagne Aktiv und liegt das heutige Datum im Start/End-Zeitraum?
  2. Ist die geöffnete Seite den Landingpages der Kampagne zugeordnet?
  3. Hat der Besucher dem Tracking via Consent-Banner zugestimmt?
  4. 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.