GA4 Measurement Protocol: Serverseitige CRM-Offline-Conversion-Integration
Teil 4 von 5 der Reihe Vom Pixel zum Server: Tracking, das hält

Inhalt
Das GA4 Measurement Protocol ergänzt die Webmessung um serverseitige Ereignisse, beispielsweise einen später im CRM bestätigten Kauf. Damit kann ein Abschluss erfasst werden, obwohl zum Abschlusszeitpunkt kein Browserereignis entsteht. Eine ursprüngliche Kampagne wird dadurch jedoch nicht automatisch oder fehlerfrei zugeordnet.
Für eine belastbare Integration sind drei Fragen getrennt zu beantworten: Welcher Browser beziehungsweise welches bekannte Konto gehört zum Ereignis? Wann ist der Kauf tatsächlich erfolgt? Und welche Auswertung soll das Ereignis unterstützen? Ereignisannahme, Sitzungszuordnung und Werbeexport haben unterschiedliche Voraussetzungen.

1. Kennungen übernehmen, keine Verbindung erfinden
- client_id: Für einen Web-Datenstrom identifiziert diese Kennung die Browserinstanz. Zur Verbindung mit vorhandenen Webereignissen muss der tatsächlich erfasste Wert verwendet werden. Eine aus einer CRM-Nummer erfundene, ähnlich formatierte Kennung stellt diese Verbindung nicht her. Die Kennung ist pseudonym und nicht automatisch anonym.
- session_id: Dieser positive numerische Ereignisparameter bezeichnet die konkrete Sitzung. Beim Google-Tag lässt sich der Wert über
gtag('get', 'G-XXXXXXXXXX', 'session_id', callback)abrufen; für die Browserkennung entsprechend mitclient_id. Ein selbst gebauter Parser für interne Cookie-Feldpositionen ist dafür nicht erforderlich. Fehlende oder noch nicht verfügbare Werte müssen im Erfassungsablauf berücksichtigt werden. - user_id: Eine optionale, konsistente Kontokennung kann bekannte angemeldete Nutzungen verbinden. Eine beliebige Lead-Nummer ist nicht automatisch eine geräteübergreifende Personenkennung. E-Mail-Adressen, Telefonnummern und andere direkt identifizierende Inhalte gehören nicht in diese gewöhnlichen Kennungs- oder Ereignisfelder.
Die Kennungen werden nur im zulässigen Erfassungskontext übernommen und zweckgebunden gespeichert. Ein fehlender Wert ist eine Datenlücke, keine Aufforderung zum Erfinden einer Identität. App-Datenströme verwenden andere Felder, insbesondere firebase_app_id und app_instance_id; das folgende Beispiel betrifft ausschließlich einen Web-Datenstrom.
2. Kaufzeit und Sitzungsfenster auseinanderhalten
| Ziel | Relevante Bedingung | Folge |
|---|---|---|
| Einen vergangenen Kauf zeitlich korrekt erfassen | Ereignisalter bis zu 72 Stunden; timestamp_micros als Zahl in Mikrosekunden | Maßgeblich ist der tatsächliche Kaufzeitpunkt, nicht das Alter des Leads. |
| Attribute einer vorhandenen Sitzung übernehmen | session_id; Versand spätestens 24 Stunden nach Sitzungsbeginn; gesetzte Ereigniszeit innerhalb der Sitzung | Eine alte Session-ID allein erhält keine Kampagnenzuordnung. |
| Werbeexport | Zusätzliche eigene Voraussetzungen, unter anderem Anfrage spätestens 63 Tage nach dem letzten Sitzungstag | Weder das 72-Stunden-Fenster noch session_id allein garantieren Werbezuordnung. |
Beispiel: Ein Lead entsteht am Montag, der Kauf am Freitag. Eine zeitnahe Freitagsmeldung ist kein vier Tage verspäteter Kauf. Das Ereignis darf aber nicht auf Montag zurückdatiert werden, nur um die alte Sitzung zu treffen. Ein zulässiger Kauf kann außerhalb des Fensters für die ursprüngliche Sitzungszuordnung liegen.
Google unterscheidet außerdem die Validierung: Bei RELAXED oder fehlender Einstellung werden Ereignisse mit einem Alter über 72 Stunden laut Dokumentation auf einen Zeitpunkt 72 Stunden vor dem Eingang verschoben. Mit ENFORCE_RECOMMENDATIONS werden solche Ereignisse abgewiesen. Ein Debug-Test an einer exakten Sekundengrenze beweist daher weder allgemeine Produktionsablehnung noch eine garantierte Grenztoleranz. Eine Versandwarteschlange sollte ausreichenden zeitlichen Abstand zur Grenze einplanen und überalterte Datensätze gezielt behandeln, statt den Kaufzeitpunkt zu verändern.
Die allgemeine Versanddokumentation nennt zusätzlich 48 Stunden für Ereignisse, die mit Clientereignissen gemeinsam verarbeitet werden sollen. Für Sitzungsattribute gilt die spezifischere 24-Stunden-Vorgabe. Diese unterschiedlichen Anwendungsfälle dürfen nicht zu einem einzigen pauschalen Attributionsfenster zusammengezogen werden.
3. Ein Kauf-Payload ohne erfundene Sitzung
Die folgende HTTPS-Anfrage zeigt einen Kauf, der unmittelbar bei seinem tatsächlichen Eintritt gesendet wird. Deshalb fehlt timestamp_micros: GA4 verwendet dann den Anfragezeitpunkt. Bei verzögertem Versand ist der echte Ereigniszeitpunkt als numerischer Unix-Zeitstempel in Mikrosekunden zu ergänzen. Statische Jahreszahlen aus einem Beispiel sind dafür ungeeignet. Die Beispielkennung, Transaktionsnummer und Zugangsdaten müssen durch reale, zulässig verwendbare Werte ersetzt werden.
POST /mp/collect?measurement_id=G-XXXXXXXXXX&api_secret=SERVER_SIDE_SECRET
Host: www.google-analytics.com
Content-Type: application/json
{
"client_id": "1234567890.1700000000",
"consent": {
"ad_user_data": "DENIED",
"ad_personalization": "DENIED"
},
"events": [
{
"name": "purchase",
"params": {
"transaction_id": "CRM_INV_EXAMPLE_001",
"value": 1499.0,
"currency": "EUR",
"items": [
{
"item_id": "SKU_ENTERPRISE_PLAN",
"item_name": "Enterprise Service License",
"price": 1499.0,
"quantity": 1
}
]
}
}
]
}Eine alte session_id und eine erfundene Engagementdauer fehlen bewusst. Für passende Sitzungs- und Echtzeitauswertungen sind die zutreffende Sitzung und tatsächlich gemessene engagement_time_msec relevant; pauschale 100 Millisekunden würden eine Messgröße erfinden. Das Beispiel garantiert deshalb keine vollständige Darstellung in Realtime oder in Sitzungsmetriken.
transaction_id muss pro Bestellung eindeutig, nicht leer und frei von direkt identifizierenden Kundendaten sein. Dieselbe Bestellung behält bei einer Wiederholung dieselbe ID. GA4 kann damit Kaufduplikate in Web-Datenströmen reduzieren; ein eigenes Versandjournal und Schutz vor parallelen Doppelversendungen bleiben erforderlich. Wert und Währung müssen zum fachlichen Kaufmodell passen; hier entspricht der Wert einer Position zu 1.499 EUR ohne zusätzlich eingerechnete Versandkosten oder Steuern.
Das api_secret bleibt ausschließlich auf dem Server und gehört nicht in Browsercode oder vollständige URL-Protokolle. Der alternative Host region1.google-analytics.com ermöglicht die Datenerfassung in der EU; die Hostwahl allein ist keine pauschale Aussage über alle weiteren Verarbeitungsorte.
4. Berechtigung und Widerruf vor dem Versand prüfen
Serverseitige Übertragung ersetzt keine Rechtsgrundlage und umgeht keine Einwilligungsentscheidung. Ein nachweisbarer Erhebungszustand ist wichtig. Bei einwilligungsbasierter Verarbeitung muss zusätzlich ein späterer Widerruf vor dem Versand berücksichtigt werden; ein historisch positives Feld ist keine dauerhafte Versandfreigabe. Zweck, Aufbewahrung und fehlende Nachweise benötigen klare Regeln.
Die gezeigten consent-Felder setzen Werbedatenverwendung und personalisierte Werbung auf DENIED. Das ist kein Ersatz für die Zulässigkeitsprüfung der Analytics-Übertragung selbst. non_personalized_ads ist veraltet; die aktuelle Schnittstelle verwendet consent.ad_personalization. Ohne explizite Consent-Felder kann GA4 Einstellungen aus zugehörigen Onlineinteraktionen übernehmen; für eine kontrollierte CRM-Pipeline muss die beabsichtigte Behandlung feststehen.
5. Validierung und tatsächliche Verarbeitung getrennt prüfen
/debug/mp/collect prüft die Nutzlast und liefert validationMessages; die dort gesendeten Ereignisse erscheinen nicht in Berichten. Für Entwicklung empfiehlt Google ENFORCE_RECOMMENDATIONS. Eine leere Fehlerliste beweist weder korrekte Zugangsdaten noch erfolgreiche Verarbeitung in der gewünschten Property. Die Produktivantwort 2xx bestätigt den HTTP-Eingang, nicht Umsatzverbuchung oder Kampagnenzuordnung.
Ein sinnvoller Prüfablauf umfasst Nutzlasttests mit künstlichen Daten, einen kontrollierten Test in einer separaten Property und den späteren Abgleich von Transaktionszahlen und Beträgen. Das Versandjournal unterscheidet mindestens vorbereitet, transportiert und fachlich abgeglichen. Verbindungsfehler, unklare Zustellzustände und abgelaufene Ereignisse benötigen eigene Behandlung; endlose blinde Wiederholungen sind kein Erfolgsnachweis.
Fragen und Antworten
Ist ein Verkaufszyklus über 72 Stunden grundsätzlich ungeeignet?
Nein. Das Alter des Kaufereignisses ist vom Alter des ursprünglichen Leads zu unterscheiden. Grenzen für Sitzungszuordnung, Werbeexport und andere Verwendungen sind zusätzlich zu prüfen.
Liefert ein BigQuery-Join vollständige Attribution?
Nein. Die Verknüpfung von CRM und exportierten Webereignissen ermöglicht eine eigene historische Auswertung, soweit passende Kennungen, Zeiträume und zulässig gespeicherte Daten vorliegen. Fehlende Messungen, mehrere Geräte, Dubletten und das gewählte Attributionsmodell bleiben relevant. Ein Warehouse-Ergebnis schreibt keine historische GA4-Sitzung um.
Welche Zeit soll eine Warteschlange senden?
Den tatsächlichen Ereigniszeitpunkt. Senderuhren müssen synchronisiert sein. Zukünftige Zeiten oder eine Verschiebung alter Käufe auf jetzt verändern die Messung. Überalterte Ereignisse können für eine getrennte Warehouse-Auswertung erhalten bleiben, statt unkontrolliert in GA4 nachgemeldet zu werden.
Quellen
- GA4 Measurement Protocol
- Measurement Protocol reference
- Sending events and timestamp validation
- Use cases and attribution windows
- Validation and its limits
- Implementation verification
- Google tag get API
- Purchase deduplication
- User-ID requirements
- Ecommerce purchase values
- GDPR Article 7: withdrawal of consent
Vom Pixel zum Server: Tracking, das hält
- Die Evolution des Web-Trackings: Von Logfiles zur serverseitigen Zukunft
- GA4 & Server-Side GTM: Die “Migrate from JavaScript Managed Client ID” Funktion in GA4 erklärt
- Server-Side GTM auf GCP Cloud Run: Architektur, Auto-Scaling und Kostenoptimierung
- GA4 Measurement Protocol: Serverseitige CRM-Offline-Conversion-Integration
- Meta Conversions API: Maximierung der Event Match Quality (EMQ) und Deduplizierung