Analytics Tracking: Datenschutzorientierte Ereigniserfassung
Dieser Artikel erklärt, wie wir das Nutzerverhalten tracken, während wir die Privatsphäre respektieren und Bot-Traffic vermeiden.
Das Problem: Nutzerverhalten verstehen
Wir müssen wissen:
-
Welche Seiten Nutzer besuchen
-
Welche Produkte sie sich ansehen
-
Woher der Traffic kommt (Google Ads, organisch, Social Media)
-
Welche Kampagnen Conversions antreiben
Aber wir müssen vermeiden:
-
Bots und Crawler zu tracken
-
Personenbezogene Daten (PII) zu speichern
-
Datenschutzbestimmungen zu verletzen
Die Lösung: Client-Seitiges + Server-Seitiges Tracking
Client-Seitig: JavaScript-Tracking
Besucher-ID: Zufällige ID, gespeichert in einem Cookie (365 Tage)
Sitzungs-ID: Zufällige ID, gespeichert im sessionStorage (bis zum Schließen des Browsers)
Kampagnen-Parameter: Aus der URL extrahiert und im sessionStorage gespeichert
Getrackte Parameter:
-
gclid- Google Click ID (Suchanzeigen) -
gbraid- Google Ads Click ID (Shopping-Anzeigen) -
wbraid- Google Ads Click ID (iOS) -
fbclid- Facebook Click ID -
srsltid- Google organische Suchergebnis-ID -
utm_source,utm_medium,utm_campaign,utm_term,utm_content
Speicherung: Parameter werden in Cookies gespeichert (30 Minuten) für WhatsApp/Telefon-Klick-Attribution
Server-Seitig: Anreicherung
Der Server reichert Ereignisse an mit:
GeoIP-Daten: Land, Region, Stadt von der IP-Adresse
User-Agent-Parsing: Browser, Betriebssystem, Gerätetyp
Zeitstempel: Serverzeit (UTC)
Bot-Erkennung: Filtert bekannte Bot-User-Agents
Ereignistypen
Seitenaufruf: Nutzer besucht eine Seite
Produktansicht: Nutzer sieht Produktseite
Zum Warenkorb hinzufügen: Nutzer fügt Produkt zum Warenkorb hinzu
Zur Kasse: Nutzer startet den Kaufvorgang
Kauf: Nutzer schließt Kauf ab
WhatsApp-Klick: Nutzer klickt auf WhatsApp-Button
Telefon-Klick: Nutzer klickt auf Telefonnummer
Datenfluss
sequenceDiagram
participant User
participant JS as JavaScript
participant API as /api/analytics
participant Firehose as Kinesis Firehose
participant S3
User->>JS: Besucht Seite
JS->>JS: Extrahiert URL-Parameter
(gclid, utm_*, etc.)
JS->>JS: Speichert im sessionStorage
JS->>API: POST Ereignis + Parameter
API->>API: Reichert mit GeoIP an
API->>API: Parst User-Agent
API->>API: Filtert Bots
API->>Firehose: Sendet angereichertes Ereignis
Firehose->>S3: Speichert im Analytics-BucketBot-Erkennung
Wir filtern Bot-Traffic anhand mehrerer Signale:
User-Agent-Muster: Bekannte Bot-Strings (Googlebot, Bingbot, etc.)
Verhaltensmuster: Zu schnell, zu viele Anfragen
Fehlendes JavaScript: Bots führen oft kein JS aus
Ausschluss-Cookie: tv_exclude=true stoppt jegliches Tracking
Datenschutz
Keine PII: Wir speichern niemals Namen, E-Mails, Telefonnummern
Anonymisierte IPs: Letztes Oktett wird vor der Speicherung entfernt
Kein Cross-Site-Tracking: Cookies sind nur First-Party
Opt-out: Nutzer können Ausschluss-Cookie setzen
Datenaufbewahrung: Ereignisse werden nach 90 Tagen gelöscht
Bedingtes Pixel-Laden
Wir laden Tracking-Pixel nur, wenn relevant:
Google Ads Pixel: Nur wenn gclid, gbraid oder wbraid vorhanden
LinkedIn Pixel: Nur wenn msclkid vorhanden
Facebook Pixel: Nur wenn fbclid vorhanden
Vorteil: Schnellere Seitenladezeiten, weniger Tracking-Overhead
Traffic-Quellen-Erkennung
Wir erkennen die Traffic-Quelle anhand von URL-Parametern:
Google Ads: gclid, gbraid, wbraid → utm_source=google_ads
Google Organic: srsltid → utm_source=google_search
Facebook: fbclid → utm_source=facebook
LinkedIn: msclkid → utm_source=linkedin
Direkt: Keine Parameter → utm_source=direct
Conversion-Tracking
Wir tracken Conversions durch den Funnel:
Produktansicht → Zum Warenkorb hinzufügen → Zur Kasse → Kauf
Jeder Schritt enthält:
-
Besucher-ID (für Attribution)
-
Sitzungs-ID (für Sitzungsanalyse)
-
Kampagnen-Parameter (für ROI-Berechnung)
-
Produkt-SKU (für Produktanalyse)
Lead-Touch-Tracking
Wenn Nutzer uns kontaktieren (WhatsApp, Telefon, E-Mail), erfassen wir:
Kontaktmethode: WhatsApp, Telefon, E-Mail
Kampagnen-Parameter: Aus Cookies (30-Minuten-Fenster)
Produktkontext: Auf welcher Produktseite sie waren
Vorteil: Offline-Conversions Online-Kampagnen zuordnen
Rate Limiting
Der Analytics-Endpoint ist rate-limited:
Limit: 100 Anfragen pro 10 Minuten pro IP
Vorteil: Verhindert Missbrauch und Bot-Fluten
Speicherung
Ereignisse werden über Kinesis Firehose in S3 gespeichert:
Format: JSON Lines (ein Ereignis pro Zeile)
Partitionierung: Nach Datum (Jahr/Monat/Tag/Stunde)
Kompression: Gzip
Aufbewahrung: 90 Tage
Abfragen
Ereignisse werden über AWS Athena abgefragt:
Schema: Definiert im Glue Data Catalog
Abfragen: SQL auf S3-Daten
Anwendungsfälle: Kampagnen-ROI, Produktpopularität, Traffic-Quellen
Referenzen
Technische Konzepte
-
Webanalytik - Wikipedia
-
Privacy by Design - Wikipedia
AWS-Dienste
-
Kinesis Firehose - AWS-Dokumentation
-
Athena - AWS-Dokumentation
Verwandte Artikel
- Multi-Server-Architektur - Wo Analytics läuft
Zusammenfassung
Unser Analytics-System trackt Nutzerverhalten, während es die Privatsphäre respektiert:
Client-seitig:
-
✅ Extrahiert Kampagnen-Parameter aus der URL
-
✅ Speichert im sessionStorage (sitzungsgebunden)
-
✅ Speichert in Cookies (30 Min. für Attribution)
-
✅ Sendet Ereignisse an die API
Server-seitig:
-
✅ Reichert mit GeoIP und User-Agent an
-
✅ Filtert Bot-Traffic
-
✅ Sendet an Kinesis Firehose
-
✅ Speichert in S3 (nach Datum partitioniert)
Datenschutz:
-
✅ Keine PII gespeichert
-
✅ Anonymisierte IPs
-
✅ Nur First-Party-Cookies
-
✅ Opt-out verfügbar
-
✅ 90-tägige Aufbewahrung
Bedingtes Laden:
-
✅ Google Ads Pixel nur wenn gclid vorhanden
-
✅ LinkedIn Pixel nur wenn msclkid vorhanden
-
✅ Facebook Pixel nur wenn fbclid vorhanden
Dieser Ansatz vereint Erkenntnisgewinn mit Datenschutz und Performance.