Tutorials

Ein praktischer Leitfaden zu serverseitiges Tracking

Taras Shynkarenko
Taras Shynkarenko
•Aktualisiert: •8 Min. Lesezeit
Ein praktischer Leitfaden zu serverseitiges TrackingEin praktischer Leitfaden zu serverseitiges Tracking

TL;DR, Kurzantwort

8 Min. Lesezeit

Mit benutzerdefinierten Ereignissen können Sie die tatsächliche Blog-Leserzahl anhand des Artikelfortschritts und der begrenzten aktiven Zeit messen und anschließend serverseitige Registrierungen genau verfolgen – weit über die grundlegenden Seitenaufrufmetriken hinaus.

Nützlich wird es, wenn das Ereignis auf Ihrem Server passiert oder der Client unzuverlässig misst: Wer Lesezeit serverseitig tracken will, kombiniert Artikelfortschritt im Browser mit der tatsächlichen Kontoerstellung.

Die serverseitige Analyseverfolgung ist nützlich, wenn das Ereignis auf Ihrem Server auftritt oder wenn die clientseitige Verfolgung unzuverlässig ist. Zwei gängige Beispiele sind Blog-Leserzahlen und Registrierungen. Ein Browser kann den Artikelfortschritt und die aktive sichtbare Zeit abschätzen; Der Server kann Ihnen sagen, ob tatsächlich ein Konto erstellt wurde.

Das beste Setup vereint beides, ohne unnötige persönliche Daten zu sammeln.

Messung des echten Blog-Lesens

Ein Seitenaufruf ist eine schwache Inhaltsmetrik. Leser springen sofort ab, lassen den Tab geöffnet oder scrollen nach unten, ohne zu lesen. Eine bessere „Lese“-Event vereint:

  • Mindestaktive Zeit basierend auf der Wortanzahl.
  • Scrolltiefe innerhalb des Artikelcontainers.
  • Sichtbarkeitsstatus, sodass Hintergrundregisterkarten nicht gezählt werden.
  • Ein einmaliges Ereignis, sodass Aktualisierungen keine doppelten Lesevorgänge verursachen.

Beispielsweise könnte ein Artikel mit 1.200 Wörtern mindestens 5 Minuten aktive Zeit bei etwa 220 bis 250 Wörtern pro Minute plus 80 Prozent Scrollen des Artikels erfordern. Betrachten Sie diese Zahl nicht als universell. Technische Dokumente, rechtliche Inhalte und Vergleichsbeiträge werden unterschiedlich schnell gelesen.

Seitenaufruf vs. Lese-Ereignis
Seitenaufruf
  • Zählt einen sofortigen Absprung
  • Zählt einen im Hintergrund geöffneten Tab
  • Zählt einen schnellen Scroll bis zum Ende
Artikel-Lese-Ereignis
  • Erfordert eine Mindest-Aktivzeit basierend auf der Wortzahl
  • Erfordert 80 Prozent Scrolltiefe im Artikel-Container
  • Pausiert, wenn der Tab nicht sichtbar ist
  • Feuert nur einmal pro Seitenaufruf
Ein Seitenaufruf zählt fast alles. Ein Lese-Ereignis muss es sich verdienen.

Beispiel für ein clientseitiges Ereignis

const article = document.querySelector('[data-article]');
const words = Number(article?.dataset.words || 0);
const estimatedSeconds = Math.round((words / 230) * 60);
const minSeconds = Math.min(420, Math.max(30, estimatedSeconds * 0.6));
const maxCreditSeconds = Math.min(900, Math.max(90, estimatedSeconds * 1.5));
let activeSeconds = 0;
let articleVisible = false;
let reachedDepth = false;
let sent = false;
 
const depthMarker = document.createElement('span');
depthMarker.setAttribute('aria-hidden', 'true');
depthMarker.style.cssText = 'position:absolute;top:75%;left:0;width:1px;height:1px;';
if (article) {
  article.style.position ||= 'relative';
  article.appendChild(depthMarker);
}
 
function maybeSendRead() {
  if (sent || !article || !reachedDepth || activeSeconds < minSeconds) return;
  sent = true;
  navigator.sendBeacon(
    '/analytics/article-read',
    JSON.stringify({
      slug: article.dataset.slug,
      wordCount: words,
      activeSeconds,
    })
  );
}
 
const observer = new IntersectionObserver(
  (entries) => {
    for (const entry of entries) {
      if (entry.target === article) articleVisible = entry.isIntersecting;
      if (entry.target === depthMarker && entry.isIntersecting) reachedDepth = true;
    }
    maybeSendRead();
  },
  { threshold: 0 }
);
 
if (article) {
  observer.observe(article);
  observer.observe(depthMarker);
}
 
setInterval(() => {
  if (sent || !articleVisible || document.visibilityState !== 'visible') return;
  activeSeconds = Math.min(activeSeconds + 1, maxCreditSeconds);
  maybeSendRead();
}, 1000);

Dadurch wird vermieden, dass ein schnelles Scrollen nach unten als Lesevorgang gezählt wird. Außerdem wird die Gutschrift für die aktive Zeit begrenzt, es wird pausiert, wenn die Seite ausgeblendet wird, und es wird eine Tiefenmarkierung auf Artikelebene verwendet, anstatt die Scrolltiefe anhand des gesamten Dokuments zu messen.

Ein neuer Mitarbeiter unterschreibt Unterlagen an einem Schreibtisch, was den Moment widerspiegelt, in dem ein Server eine Registrierung bestätigt.

Serverseitige Registrierungsverfolgung

Registrierungen sollten nachverfolgt werden, nachdem der Server den Erfolg bestätigt hat, und nicht, wenn der Benutzer auf „Senden“ klickt. Bei clientseitigen Formularen werden zu viele Formulare übermittelt, da die Validierung fehlschlagen kann, doppelte Anforderungen auftreten können und Bots Formulare auslösen können.

Ein serverseitiges Ereignis sollte nur sichere Felder enthalten:

  • Ereignisname: registration_completed.
  • Zeitstempel.
  • Anonyme Besucher- oder Sitzungsreferenz, sofern verfügbar und rechtmäßig.
  • Plan- oder Anmeldepfad.
  • UTM-Quelle bei der Landung erfasst.
  • Kontotyp oder Arbeitsbereichsgröße.

Vermeiden Sie E-Mail-, Namens-, IP-Adressen, rohe Benutzer-IDs, Passwortstatus oder Freitextfelder in Analysen. Wenn Sie Ereignisse intern mit Konten verknüpfen müssen, speichern Sie diese Zuordnung in Ihrer Produktdatenbank und nicht in einem Analyseereignis eines Drittanbieters.

Deduplizierung

Verwenden Sie einen Idempotenzschlüssel für Serverereignisse. Ein Registrierungsereignis sollte einmal pro Kontoerstellung ausgelöst werden, auch wenn der Benutzer die Erfolgsseite aktualisiert oder einen Webhook erneut versucht.

await analytics.track({
  event: 'registration_completed',
  idempotencyKey: `registration:${account.id}`,
  properties: {
    plan: account.plan,
    source: attribution.source,
    campaign: attribution.campaign,
  },
});

Datenschutz-Checkliste

  • Verfolgen Sie Lesevorgänge auf sensiblen Seiten nicht, es sei denn, dies ist erforderlich.
  • Halten Sie Artikelereignisse nach Möglichkeit aggregiert.
  • Entfernen Sie Abfrageparameter, bevor Sie Pfade speichern.
  • Senden Sie keine personenbezogenen Daten in Event-Eigenschaften.
  • Dokumentieren Sie die Aufbewahrung von Rohereignissen.
  • Respektieren Sie die Zustimmungsanforderungen für clientseitige Speicherung oder Identifikatoren.

Serverseitiges Tracking ist nicht automatisch datenschutzfreundlich. Besser ist es, wenn es verifizierte Geschäftsereignisse mit minimierter Nutzlast aufzeichnet. Verwenden Sie den Browser für Signale, die nur der Browser kennen kann, und verwenden Sie den Server für Fakten, die nur der Server bestätigen kann.

Datenqualitätsprüfungen

Vergleichen Sie Artikelleseereignisse mit Seitenaufrufen. Wenn jeder Seitenaufruf zu einem Lesevorgang wird, ist der Schwellenwert zu niedrig oder das Ereignis wird beim Laden ausgelöst. Wenn bei langen Artikeln mit starkem Engagement fast keine Lesevorgänge auftreten, ist die Scroll-Berechnung falsch: Sie verwendet das gesamte Dokument anstelle des Artikelcontainers.

Gleichen Sie für Registrierungen Analyseereignisse mit der Anwendungsdatenbank ab. Eine tägliche Zählung von registration_completed sollte mit der Kontoerstellung innerhalb des erwarteten Wiederholungs- und Löschverhaltens übereinstimmen. Ist dies nicht der Fall, beheben Sie das Serverereignis, bevor Sie es für die Marketingzuordnung verwenden.

Einwilligung und Transparenz

Wenn das Tracking nur aggregierte Ereignisse und keine Gerätespeicherung verwendet, ist die Belastung für den Datenschutz geringer. Wenn Sie Identifikatoren festlegen, Leseereignisse mit Konten verknüpfen oder die Daten zur Personalisierung verwenden, aktualisieren Sie die Einwilligungs- und Datenschutzhinweise entsprechend. Serverseitig bedeutet nicht unsichtbar; Benutzer verdienen immer noch eine ehrliche Erklärung.

Flowsery
Flowsery

Kostenlos testen

Echtzeit-Dashboard

Zielverfolgung

Cookie-freies Tracking

Zuverlässigkeitsdetails, die wichtig sind

Bevorzugen Sie beim Senden von Leseereignissen vom Browser Übermittlungsmethoden, die für das Entladen von Seiten konzipiert sind. Mit dem Beacon API kann der Browser eine kleine asynchrone Anfrage senden, ohne die Navigation zu blockieren. Dies ist nützlich für Analyseereignisse, die gegen Ende eines Besuchs ausgelöst werden (MDN Beacon API). Halten Sie die Nutzdaten klein und unempfindlich, da Beacons kein Ort für große Debug-Objekte sind.

Gestalten Sie bei Registrierungsereignissen das serverseitige Ereignis wie eine Finanztransaktion:

  • Lösen Sie es erst aus, nachdem das Konto oder der Registrierungsdatensatz festgeschrieben wurde.
  • Fügen Sie einen Idempotenzschlüssel basierend auf dem internen Datensatz hinzu.
  • Versuchen Sie es sicher noch einmal, wenn der Analyseendpunkt vorübergehend nicht verfügbar ist.
  • Speichern Sie ein kurzes Prüfprotokoll des Lieferstatus.
  • Anzahlen mit der Produktdatenbank abgleichen.

Wenn es auf die Attribution ankommt, erfassen Sie UTMs zum Zeitpunkt der Landung und speichern Sie sie in einem First-Party-Attributionsdatensatz mit einer klaren Aufbewahrungsfrist. Wenn die Registrierung erfolgreich ist, fügen Sie sichere Kampagnenfelder wie Quelle, Medium, Kampagne und Zielseite hinzu. Hängen Sie nicht den vollständigen Browserverlauf des Besuchers an.

Seien Sie bei der Lesezeitanalyse vorsichtig, wenn Tabs geöffnet bleiben. Zählen Sie die aktive sichtbare Zeit, pausieren Sie, wenn die Seite ausgeblendet ist, und berücksichtigen Sie ein maximales Credit-Fenster, damit ein Tab in der Mittagspause nicht zu einer „40-Minuten-Lesung“ wird. Verwenden Sie für sehr kurze Beiträge einen Mindestschwellenwert; Vermeiden Sie bei langen Beiträgen das Erfordernis eines 100-prozentigen Scrollens, da die Leser möglicherweise vor der endgültigen Biografie des Autors oder dem Abschnitt mit verwandten Beiträgen einen Mehrwert erhalten.

Das beste Signal ist nicht nur die „verbrachte Zeit“. Es ist Zeit plus sinnvoller Fortschritt plus Folgeaktion wie Newsletter-Anmeldung, Besuch einer Produktseite oder Registrierung.

Die Registrierung wie eine Finanztransaktion behandeln
1
Auf den Commit warten. Das Ereignis erst auslösen, nachdem der Account- oder Registrierungsdatensatz gespeichert wurde.
2
Idempotenzschlüssel hinzufügen. Ihn auf dem internen Datensatz basieren, damit Wiederholungen nicht doppelt zählen.
3
Sicher wiederholen. Ist der Analytics-Endpunkt vorübergehend nicht erreichbar, ohne doppelte Zählung erneut versuchen.
4
Zustellung protokollieren. Ein kurzes Audit-Log des Zustellstatus speichern.
5
Abgleichen. Die Zahlen mit der Produktdatenbank vergleichen.
Fünf Prüfungen machen aus einem Registrierungs-Ereignis eine Zahl, der das Marketing vertrauen kann.

Ein Qualitätsprüfer geht eine Checkliste auf einem Klemmbrett durch, passend zu den hier beschriebenen Lese- und Registrierungs-QA-Prüfungen.

Lese- und Registrierungs-QA

Behandeln Sie das Lesen von Artikeln als ein Signal für die Qualität des Inhalts und nicht als Beweis dafür, dass jedes Wort von einer identifizierbaren Person gelesen wurde. Bestätigen Sie Folgendes:

  • Eine Hintergrundregisterkarte sammelt keine Zeit.
  • Ein schnelles Scrollen löst keinen Lesevorgang aus.
  • Lange Artikel begrenzen das aktive Zeitguthaben.
  • Das Ereignis wird einmal pro Seitenaufruf ausgelöst.
  • Für sensible Artikelkategorien wird nur die aggregierte Berichterstattung verwendet.
  • Registrierungsereignisse stimmen mit bestätigten Konten überein, nicht mit Schaltflächenklicks.

Halten Sie das Browsersignal und die Serverfakten getrennt. Der Browser kann sinnvolle Lektüre einschätzen. Der Server kann die Registrierung bestätigen. Es ist nützlich, sie sorgfältig zu kombinieren. Wenn man vorgibt, dass eines davon perfekt ist, entstehen verrauschte Analysen.

Häufig gestellte Fragen

Warum unter- und überzählt ein Seitenaufruf gleichzeitig?

Ein Seitenaufruf feuert, sobald die Seite lädt, und zählt damit einen Absprung, einen im Hintergrund geöffneten Tab und einen schnellen Scroll bis zum Ende genauso wie ein echtes Lesen. Die Kombination mit einer Mindest-Aktivzeit, der Scrolltiefe und dem Sichtbarkeitsstatus trennt echtes Lesen von diesen Fällen. Ein einmaliges Ereignis obendrauf verhindert, dass Neuladen die Zahl zusätzlich aufbläht.

Welchen Wörter-pro-Minute-Wert sollte ich für die Aktivzeit-Schwelle verwenden?

Der Beitrag nutzt als Ausgangspunkt etwa 220 bis 250 Wörter pro Minute, was bei einem 1.200-Wörter-Artikel eine Mindest-Aktivzeit von rund 5 Minuten ergibt. Das ist ein Ausgangswert, kein universeller Maßstab. Technische Dokumentation, juristische Inhalte und Vergleichsartikel werden unterschiedlich schnell gelesen, also den Wert je Inhaltstyp anpassen.

Warum die Scrolltiefe gegen den Artikel-Container messen statt gegen das ganze Dokument?

Eine Messung gegen das ganze Dokument verzerrt die Zahl, sobald Header, Footer oder verwandte Beiträge die Seitenlänge verändern. Das clientseitige Beispiel verankert eine 80-Prozent-Tiefenmarke direkt im Artikel-Element mit einem IntersectionObserver, sodass die Berechnung den Artikel misst und nicht das umgebende Layout. Das ist auch die Lösung, wenn bei langen, gut gelesenen Artikeln kaum Lese-Ereignisse auftauchen.

Sollte 100 Prozent Scrolltiefe die Schwelle für ein Lese-Ereignis sein?

Eine 100-Prozent-Anforderung kann Leser übersehen, die den Nutzen bereits vor der Autoren-Bio oder dem Block mit verwandten Beiträgen am Ende erhalten haben. Das Beispiel nutzt stattdessen 80 Prozent Scrolltiefe im Artikel-Container. Bei langen Inhalten hält der Verzicht auf die 100-Prozent-Marke die Kennzahl näher an dem, was "gelesen" tatsächlich bedeutet.

Wie verhindere ich, dass ein Hintergrund-Tab die Aktivzeit aufbläht?

document.visibilityState zusammen mit einem IntersectionObserver prüfen, der beobachtet, ob der Artikel selbst sichtbar ist. Das Ein-Sekunden-Intervall im Beispiel erhöht activeSeconds nur, wenn der Artikel sichtbar ist und der Sichtbarkeitsstatus des Tabs "visible" lautet, sodass ein im Hintergrund geöffneter Tab sofort aufhört, Zeit zu sammeln.

Was ist eine sinnvolle Obergrenze für die Aktivzeit-Gutschrift bei langen Artikeln?

Der Beitrag deckelt die angerechnete Aktivzeit, damit ein über die Mittagspause offen gelassener Tab nicht als 40-minütige Lektüre gilt. Die Beispielimplementierung begrenzt activeSeconds mit Math.min gegen eine maxCreditSeconds-Obergrenze, die aus der geschätzten Lesezeit des Artikels abgeleitet wird. Lange Artikel bekommen weiterhin ein großzügiges Fenster, nur kein unbegrenztes.

Warum sollten Registrierungs-Ereignisse bei Serverbestätigung feuern statt beim Formular-Submit?

Clientseitige Formular-Submits überzählen, weil Validierung fehlschlagen kann, doppelte Anfragen vorkommen und Bots Formulare auslösen können, ohne einen Account anzulegen. Ein serverbestätigtes Ereignis feuert erst, wenn der Account tatsächlich existiert, also genau das, was Analytics eigentlich abbilden soll. Deshalb behandelt der Beitrag das Ereignis wie eine Finanztransaktion, zuerst gespeichert, dann verfolgt.

Flowsery
Flowsery

Kostenlos testen

Echtzeit-Dashboard

Zielverfolgung

Cookie-freies Tracking

Welche Felder sind bei einem registration_completed-Ereignis sicher?

Beim Eventnamen, Zeitstempel, einer anonymen Besucher- oder Sitzungsreferenz soweit vorhanden und zulässig, Plan oder Signup-Pfad, der bei der Landung erfassten UTM-Quelle und dem Account-Typ oder der Workspace-Größenklasse bleiben. E-Mail, Name, IP-Adresse, rohe User-ID, Passwortstatus und Freitextfelder weglassen. Wer Ereignisse intern mit Accounts verknüpfen muss, sollte diese Zuordnung in der Produktdatenbank halten, nicht im Analytics-Ereignis.

Wie verhindert der Idempotenzschlüssel doppelte Registrierungs-Ereignisse?

Der Schlüssel wird aus der Account-ID selbst gebildet, etwa registration:${account.id}, sodass die Analytics-Plattform einen wiederholten Versand als dasselbe Ereignis erkennt statt als neues. Das schützt davor, dass ein Nutzer die Erfolgsseite neu lädt oder ein Webhook nach einem Timeout erneut auslöst. Das Ereignis feuert trotzdem genau einmal pro Account-Erstellung, egal wie oft der Auslöser läuft.

Wie prüfe ich, ob das Registrierungs-Tracking wirklich korrekt ist?

Die tägliche Anzahl der registration_completed-Ereignisse mit den tatsächlich angelegten Accounts in der Anwendungsdatenbank abgleichen. Beide Zahlen sollten innerhalb des erwarteten Retry- und Löschverhaltens übereinstimmen. Weichen sie voneinander ab, zuerst das serverseitige Ereignis reparieren, bevor die Zahlen für Marketing-Attribution genutzt werden.

War dieser Artikel hilfreich?

Teilen Sie uns Ihre Meinung mit!

Sieh uns öfter bei Google

Ein Klick macht Flowsery zu einer bevorzugten Quelle. Unsere Artikel stehen dann weiter oben in deinen Top-Meldungen, im KI-Modus und in den KI-Übersichten.

Bevor Sie gehen...

Flowsery

Flowsery

Umsatzorientierte Analysen für Ihre Website

Verfolgen Sie jeden Besucher, jede Quelle und jede Conversion in Echtzeit. Einfach, leistungsstark und komplett ohne Cookies.

Echtzeit-Dashboard

Zielverfolgung

Cookie-freies Tracking

Verwandte Artikel