Zurück zur Startseite
Leistungen

Full-Stack-Entwicklung, Data Engineering

Branche

B2B-Marktplatz

Jahr

2024

Kampagnen-Attribution ohne Drittanbieter-Skript.

In einem Marketing-Dashboard fehlten 30 bis 40 Prozent, und niemand sah das Loch. Ein B2B-Marktplatz bezahlte Anzeigen auf Google, LinkedIn und Branchenportalen und bewertete sie in Google Analytics. Ad-Blocker löschten ein Drittel aller Besuche, bevor das Skript überhaupt lud. Sechsstellige Budgetentscheidungen stützten sich auf die Besuche, die durchkamen.

DIE HERAUSFORDERUNG

Ein Report ohne Gedächtnis

Die blockierten Besuche waren nur der sichtbare Verlust. Das DSGVO-Consent-Banner senkte die Abdeckung weiter, und was ankam, lag in einem Dashboard, das sich nicht mit dem CRM verbinden ließ: Eine Registrierung war eine Zeile im einen System, eine Session im anderen. Die Tools konnten außerdem den ersten Touchpoint nicht vom letzten unterscheiden. Ein Käufer, der eine LinkedIn-Anzeige klickte, tagelang stöberte und sich Wochen später über ein Branchenportal registrierte, erschien als Portal-Conversion. Die Kampagne, die die Beziehung eröffnet hatte, war weg. Das Marketing verglich Kanäle mit Daten, die vergessen hatten, woher die Leute kamen.

DIE LÖSUNG

Attribution innerhalb der Anwendung

Der erste Vorschlag war ein zweites Tool, Segment, hinter einem sauberen Consent-Flow. Verworfen: Dieselben Browser-Erweiterungen blockieren auch das, und das Banner kostet mehr Abdeckung, als es schützt. Stattdessen misst die Plattform selbst. Eine schlanke JavaScript-Klasse, CTracker, liest c_source, c_medium und c_campaign beim ersten Besuch aus der URL und legt sie in localStorage ab. Keine Cookies, keine externen Requests. Auf dem Server lesen zwei Django-Middlewares, CTrackMiddleware und LeadSourceMiddleware, dieselben Parameter aus Query-String und Session, prüfen sie gegen bekannte Quellen und schreiben LeadSource-Einträge nach PostgreSQL. Registriert sich der Besucher oder loggt sich ein, bindet ein Django-Signal jeden gespeicherten Eintrag an das neue Konto. Der Preis ist Eigenverantwortung: kein Anbieter-Dashboard, keine Sicht über andere Websites hinweg, und das Team pflegt den Code selbst. Dafür zählt jeder Besuch, auch die, die der Blocker gelöscht hätte.

Die Frontend-Klasse. Die Sperre auf dem initial-Slot ist der ganze Trick:

JavaScript
class CTracker {
  constructor () {
    this.storageAvailable = this._testStorage();
    if (!this.storageAvailable) return;

    const params = new URLSearchParams(window.location.search);
    const keys   = ['c_source', 'c_medium', 'c_campaign', 'c_term'];

    keys.forEach(key => {
      const val = params.get(key);
      if (!val) return;

      // Always update the "current" touchpoint
      localStorage.setItem(key, val);

      // Set "initial" once, never overwrite it
      if (!localStorage.getItem(key + '_initial')) {
        localStorage.setItem(key + '_initial', val);
      }
    });
  }

  _testStorage () {
    try {
      localStorage.setItem('__ct', '1');
      localStorage.removeItem('__ct');
      return true;
    } catch { return false; }
  }
}

Ein Besucher, 26 Tage

Die Reise läuft von selbst. Achte auf die beiden Slots: initial wird an Tag 1 geschrieben und ändert sich nie, current folgt jedem markierten Besuch. Schalte den Ad-Blocker aus, um zu sehen, was ein Drittanbieter-Skript erfasst hätte, und mitten in der Reise wieder ein: Alles nach dem Umschalten geht ihm verloren, der First-Party-Zeile nichts.

Besucherreise
  1. Tag 1LinkedIn-Anzeigec_source=linkedin
  2. Tag 3Organische Rückkehrkeine c_-Parameter
  3. Tag 12Google-Anzeigec_source=google
  4. Tag 20Branchenportalc_source=portal

First-Party-Pipeline

initial
linkedin · paid
current
portal · referral
  • Tag 1 · erfasst
  • Tag 3 · erfasst
  • Tag 12 · erfasst
  • Tag 20 · erfasst

An das neue Konto gebunden · Touchpoints in der Kette: 4

Drittanbieter-Skript

letzter Touchpoint
keine Daten
  • Tag 1 · blockiert
  • Tag 3 · blockiert
  • Tag 12 · blockiert
  • Tag 20 · blockiert

keine Daten

Touchpoints gesehen
4
First-Party attribuiert
4
Drittanbieter erfasst
0
Durch Blocker verloren
4

Auf dem Server schreibt die Middleware eine LeadSource pro Session und hängt den Nutzer an, sobald es einen gibt:

Python
class LeadSourceMiddleware:
    """
    Reads c_* attribution params from query string + session,
    validates them, and persists a LeadSource record.
    """
    def __call__(self, request):
        params = self._extract(request)
        if not params:
            return self.get_response(request)

        source, created = LeadSource.objects.get_or_create(
            session_key=request.session.session_key,
            defaults=params,
        )

        # Bind to user when they authenticate
        if request.user.is_authenticated and not source.user:
            source.user = request.user
            source.save(update_fields=['user'])

        return self.get_response(request)
DAS ERGEBNIS

Jede Registrierung trägt ihre Geschichte

Jeder CRM-Eintrag zeigt jetzt, woher ein Kunde zuerst kam, woher zuletzt und jeden markierten Besuch dazwischen, bei der Registrierung an das Konto gebunden. Ad-Blocker spielen keine Rolle mehr, weil nichts Externes lädt. Die DSGVO-Lage wurde einfach: keine Drittanbieter-Cookies, kein Cross-Site-Tracking, kein Consent-Banner für First-Party-Analytics. Das Marketing-Team vergleicht Kanäle auf vollständigen Daten, im CRM, das es ohnehin nutzt, für Tausende Besucher am Tag.

WICHTIGE KENNZAHLEN

40%Anteil der von Ad-Blockern zurückgeholten Besuche
100%First-Party attribuierte Besuche
250 msZusätzliche Latenz pro Request, maximal

FÜR DEIN PROJEKT

  • Wann es passt

    Du kaufst Traffic und bewertest ihn in einem Drittanbieter-Dashboard. Ad-Blocker und Consent-Banner verstecken schon jetzt einen Teil deines Funnels, und eine Session im Dashboard lässt sich nicht mit einer Registrierung in deinem CRM verbinden.

  • Was du prüfen solltest

    Öffne deine Registrierungstabelle. Wenn dort bei der Kontoerstellung keine Quell-Spalten gefüllt werden, endet die Attribution an der Session und beginnt bei jedem Rückbesuch von vorn. Die erste Kampagne ist dann schon verloren.

  • Was es braucht

    Eine kleine Frontend-Klasse, ein Middleware-Paar und eine Tabelle in der Datenbank, die du ohnehin betreibst. Kein neuer Anbieter, kein Consent-Banner für First-Party-Daten, und dein eigenes Team pflegt es.

KUNDENSTIMME

Wir öffnen eine Registrierung im CRM und sehen die Anzeige, die die Person gebracht hat, und den Besuch, der konvertiert hat. Budgetrunden laufen jetzt über diese Liste, nicht über ein Dashboard, dem ein Drittel der Besuche fehlte.

Head of Marketing

B2B-Marktplatz

FAQ

TECHNOLOGIE-STACK

Django
Python
JavaScript

Daniel hat bei der Gründung und Umsetzung der Unternehmen Solvster und VIARES einen entscheidenden Beitrag geleistet. Er war verantwortlich für den gesamten technischen Aufbau der Onlinepräsenz, inklusive der Serversetups, der Entwicklung und Optimierung der Website sowie der Sicherstellung der Funktionalität. Besonders beeindruckt hat mich, wie proaktiv und lösungsorientiert er immer an Verbesserungen gearbeitet hat. Daniel war stets sehr responsiv und zuverlässig - es war eine Freude, mit ihm zusammenzuarbeiten. Seine Expertise und sein Engagement haben maßgeblich zum Erfolg beider Projekte beigetragen!

Dietmar Eglhofer - Geschäftsführer, Solvster & VIARES

Schließe dich Dietmar an und starte dein nächstes Projekt mit Zuversicht.

Schreibe mirSchreibe mir