Zum Inhalt springen
Elyes FerchichiWebdesign Bremen
Eigenes ProduktWeb-Infrastruktur, Analytics · Bremen, im Einsatz auf rund 30 Seiten

Eigenes Analytics-System – DSGVO-konform messen ohne Google

Statt Google Analytics nutze ich ein eigenes System: ein schlanker Tracker, der nur nach Einwilligung misst, ein Cloudflare Worker als Backend und ein Dashboard, in dem jeder Kunde nur seine eigene Website sieht. Dazu gehört ein Formular-System, das Anfragen sofort per Telegram zustellt.

Zeitraum
Seit 2026, laufend weiterentwickelt
Status
Live, auf allen meinen Seiten im Einsatz
Art
Eigenes Produkt
Einsatz
Rund 30 Seiten
Backend
Cloudflare Worker, D1, KV
Mandanten
Ein Login je Kunde, eigene Daten
Prüfungen
66 automatisierte Filter-Checks

Eigenes Produkt: von mir entwickelt und im Einsatz, kein Kundenauftrag.

Analytics-Dashboard mit Übersicht, Besucherzahlen und Leads, Desktop- und Mobilansicht (Beispieldaten)
Im Rahmen scrollen, um die ganze Seite zu sehenelyesferchichi.com/analytics
Analytics-Dashboard mit Übersicht, Besucherzahlen und Leads, Desktop- und Mobilansicht (Beispieldaten) – Handyansicht
Mobilansicht

Ausgangslage

Google Analytics ist für kleine Websites in Deutschland ein Problem: Datenübermittlung in die USA, komplexe Consent-Einrichtung, und am Ende versteht der Betreiber die Berichte nicht. Ich wollte wissen, wie viele Besucher meine Konzeptseiten haben und vor allem, ob jemand anruft, schreibt oder eine Route öffnet. Das sind die Zahlen, die für einen Handwerker oder ein Café zählen.

Gleichzeitig hatte ich ein zweites Problem: Kontaktformulare liefen über einen externen Dienst mit einem Limit von 50 Nachrichten im Monat, und einzelne E-Mails kamen nicht an. Für eine Website, die Kunden bringen soll, ist eine verlorene Anfrage das Schlimmste, was passieren kann.

Beides habe ich mit einem eigenen System gelöst, das auf dem kostenlosen Cloudflare-Plan läuft und mir gehört. Keine Abo-Kosten, keine Datenweitergabe, volle Kontrolle über den Code.

Ziele

6 Ziele, an denen sich das Projekt messen lässt
  • Messen nur nach ausdrücklicher Einwilligung, ohne Cookies von Drittanbietern.
  • Kontaktabsichten automatisch erkennen: Anruf, E-Mail, WhatsApp, Route, Formular.
  • Ein Dashboard, das ein Betreiber ohne Vorwissen versteht.
  • Mehrere Kunden auf einem System, jeder sieht nur seine eigene Website.
  • Auf dem kostenlosen Cloudflare-Plan laufen, ohne an Limits zu stoßen.
  • Formulare zuverlässig zustellen: sofort aufs Handy, mit Archiv.

Lösung

Was gebaut wurde – Baustein für Baustein
Schild mit Stern

Tracker mit Einwilligung

Ein kleines Skript zeigt einen Consent-Dialog im Look der jeweiligen Seite. Erst nach Zustimmung werden Seitenaufrufe, Klicks und Scrolltiefe erfasst. Lokale Vorschauen werden nie gezählt.

Smartphone mit Layout-Blöcken

Leads automatisch erkannt

Telefon-, Mail- und WhatsApp-Links, Routen zu Google oder Apple Maps und Formular-Absendungen werden als Lead erkannt, ohne dass die Seite etwas markieren muss. Ein Attribut reicht, um Buttons ohne Link zu kennzeichnen.

Paket mit Einkaufstasche

Shop-Funnel

Für Bestellsysteme gibt es eine kleine Schnittstelle: Produkt gesehen, in den Warenkorb, Kasse, gekauft. Das Dashboard zeigt, wo Besucher abspringen.

Balkendiagramm mit Pfeil nach oben

Dashboard mit Kreuzfiltern

Übersicht, Besucher, Seiten, Verhalten, Leads, Shop, Kampagnen, Events und Profile. Jeder Filter ist ein Klick und liegt in der URL, sodass sich Ansichten als Link teilen lassen.

Vorhängeschloss

Ein Login je Kunde

Kunden melden sich mit eigenen Zugangsdaten an und sehen ausschließlich ihre Website. Die Trennung erzwingt der Server, nicht das Frontend.

Blitz

Live-Meldungen und Tageszusammenfassung

Auf Wunsch meldet das System neue Besuche per Telegram und schickt einmal am Tag eine Zusammenfassung. Pro Website im Dashboard schaltbar.

Umschlag mit Benachrichtigung

Formulare direkt per Telegram

Alle Formulare meiner Seiten senden an einen Endpunkt des Workers. Die Anfrage landet sofort auf dem Handy und liegt ein Jahr im Archiv. Schutz: Honeypot, Ratenbegrenzung pro IP und pro Besucher, optional Turnstile.

Klemmbrett mit Haken

Free-Plan-Auslegung

Pro Seitenaufruf wird nichts in den Key-Value-Speicher geschrieben. Ereignisse liegen in der D1-Datenbank, Antworten kommen aus dem Cache. So bleibt das System unter den kostenlosen Limits.

Design

Der Consent-Dialog ist der einzige sichtbare Teil des Systems auf einer Kundenseite. Deshalb passt er sich über CSS-Variablen an jede Seite an: Farben, Rundungen, Schatten. Der Text ist kurz und in Sie-Form. Ablehnen ist genauso leicht wie Zustimmen.

Das Dashboard folgt einem klaren Prinzip: oben die Zahlen, die zählen (Besucher, Leads, Anfragen), darunter die Details. Diagramme sind reduziert, Farben haben Bedeutung. Wer einen Filter setzt, sieht überall ein Badge, das ihn daran erinnert.

Ich habe bewusst auf ein Framework verzichtet. Das Dashboard ist eine einzelne HTML-Datei mit Chart.js, die auch auf dem Handy funktioniert.

Technik

9 Bausteine – und warum genau diese
Vanilla-JavaScript-Tracker

Ein Skript ohne Abhängigkeiten. Sendet Leads per sendBeacon, damit ein Klick auf tel: oder mailto: das Ereignis nicht verliert.

Cloudflare Worker

Nimmt Ereignisse entgegen, liefert Dashboard-Daten, prüft Logins. Läuft weltweit am Rand des Netzes, ohne eigenen Server.

D1 (SQLite)

Tabellen für Ereignisse, Klicks, Profile, Live-Sitzungen, anonyme Tageszähler und Nutzer. Abfragen in SQL, keine Schreib-Limits wie bei KV.

KV nur für Sitzungen und Kontakte

Login-Tokens, Formular-Archiv und Rate-Limits. Alles, was selten geschrieben wird.

Cache API

Dashboard-Antworten werden 60 Sekunden zwischengespeichert, damit ein offenes Dashboard die Datenbank nicht belastet.

Cron alle 5 Minuten

Verarbeitet Live-Meldungen und Tageszusammenfassungen. Ohne aktive Meldungen endet der Lauf sofort.

PBKDF2 mit 100 000 Iterationen

Passwörter liegen nur als Hash mit Salt vor. Sessions sind zufällige, serverseitig widerrufbare Tokens mit 12 Stunden Laufzeit.

Rate-Limiting und Brute-Force-Schutz

Login auf 5 Versuche pro Minute und IP begrenzt, generische Fehlermeldung. Formulare: 5 pro Minute je IP, 6 pro Stunde je Besucher.

Chart.js 4

Diagramme im Dashboard, ohne weitere Abhängigkeiten.

Antippen zeigt, warum ich mich dafür entschieden habe.

SEO

5
  • Der Tracker läuft asynchron nach dem Laden und blockiert das Rendern nicht.
  • Kampagnen-Parameter (UTM) werden getrennt erfasst, die Seiten-URL bleibt sauber.
  • Eine Seite zählt immer als eine Seite: index.html, Query und Hash werden normalisiert.
  • Das Dashboard selbst ist nicht für Suchmaschinen gedacht und steht hinter einem Login.
  • Wer messen will, welche Seiten Anfragen bringen, hat damit die Grundlage für SEO-Entscheidungen.

Barrierefreiheit

5
  • Consent-Dialog als beschrifteter Bereich ausgezeichnet, Schaltflächen nativ und per Tastatur bedienbar.
  • Ablehnen und Zustimmen sind gleichwertige Schaltflächen mit ausreichendem Kontrast.
  • Kennzahlen im Dashboard stehen als Text, nicht nur in Diagrammen.
  • Spam-Schutz über ein Honeypot-Feld statt Captcha-Rätsel, das echte Besucher lösen müssten.
  • Dialog-Übergänge respektieren prefers-reduced-motion.

Datenschutz

5
  • Messung nur nach Einwilligung nach TTDSG und DSGVO; ohne Einwilligung nur anonyme Tageszähler ohne Personenbezug.
  • Keine Datenübermittlung an Google oder andere Drittanbieter. Der Code gehört mir und ist einsehbar.
  • Kunden sehen serverseitig erzwungen nur ihre eigene Website.
  • Formular-Archiv wird nach einem Jahr automatisch gelöscht.
  • Passwörter nie im Klartext; Sessions widerrufbar. Die Datenschutzerklärung beschreibt das System.

Performance

KV-Writes pro Seitenaufruf
0Alle Ereignisse in D1, Auslegung für den Cloudflare Free-Plan
Antwort-Cache
60 SekundenFür Übersicht, Daten und Profile
Tracker-Laden
defer, nach dem RendernKein Einfluss auf den ersten sichtbaren Inhalt
Cron-Lauf
alle 5 MinutenEndet sofort, wenn keine Meldungen aktiv sind

Ablauf

6 Schritte von der Idee bis online
  1. Tracker

    Consent-Dialog und Ereignis-Erfassung als eigenständiges Skript gebaut und auf allen Seiten eingebunden.

  2. Worker und Datenbank

    Cloudflare Worker mit D1-Schema für Ereignisse, Klicks, Profile und Nutzer.

  3. Dashboard

    Übersicht, Besucher, Seiten, Verhalten, Leads, Shop, Kampagnen, Events, Profile, Einstellungen.

  4. Mehrmandanten-Login

    Zugänge je Kunde, Passwort-Hashing, Brute-Force-Schutz, serverseitige Trennung.

  5. Free-Plan-Umbau

    Alle Schreibvorgänge pro Seitenaufruf von KV nach D1 verlagert, Cache API und Cron ergänzt.

  6. Formulare

    Endpunkt für Kontaktformulare mit Telegram-Zustellung, Archiv und Schutzmechanismen. Alle Formulare umgestellt.

Ergebnis

Was am Ende belegbar dasteht
  • Im Einsatz auf rund 30 Seiten: meine Hauptseite, alle Konzeptseiten und Prototypen.
  • Auf dem Cloudflare Free-Plan ausgelegt: 0 KV-Writes pro Seitenaufruf, Antworten aus dem Cache.
  • 66 automatisierte Filter-Checks für das Dashboard, dazu ein UI-Check mit headless Chrome.
  • Formular-System seit 13.09.2026 live; 11 Formulare getestet, jede Anfrage kommt per Telegram an.
  • Leads werden auf allen Seiten ohne zusätzliche Markierung erkannt: Anruf, E-Mail, WhatsApp, Route, Formular.

Learnings

Was ich mitnehme
  1. Die interessante Zahl ist nicht der Besucher, sondern der Lead. Ein Dashboard, das das in den Mittelpunkt stellt, ist für Betreiber sofort verständlich.

  2. Kostenlose Pläne haben Limits an unerwarteten Stellen. Bevor man baut, sollte man wissen, was pro Seitenaufruf passiert.

  3. Formulare gehören in die eigene Hand. Ein externer Dienst mit Limit ist für eine Website, die Anfragen bringen soll, ein Risiko.

  4. Automatisierte Prüfungen lohnen sich bei Filtern besonders: Kombinationen, die man von Hand nie testet, laufen jeden Tag durch.

Analytics-Dashboard, Ansicht Besucher: Balkendiagramm der Verweildauer je Sitzung, Heatmap der besten Zeiten nach Wochentag und Uhrzeit sowie anonyme Zähler für Seiten, Quellen und Länder
Besucher: Verweildauer, beste Zeiten als Wochentag-mal-Uhrzeit-Heatmap und die anonymen Zähler der Besucher ohne Einwilligung.
Analytics-Dashboard, Ansicht Seiten und Quellen: Tabellen mit Top-Seiten, Einstiegsseiten und Anteilen in Prozent, darunter die verweisenden Domains
Seiten und Quellen: Welche Seiten gelesen werden, wo Sitzungen beginnen und woher die Besucher kommen. Jede Zeile lässt sich als Filter anklicken.
Analytics-Dashboard, Ansicht Verhalten: häufigste Navigationspfade als Kette von Seiten mit Häufigkeit, darunter meistgeklickte Elemente, Klick-Typen und Scroll-Tiefe
Verhalten: Häufigste Wege durch die Website, meistgeklickte Buttons und Links sowie die Scroll-Tiefe je Seite.
Analytics-Dashboard, Ansicht Leads: Kennzahlen zu Leads gesamt, Lead-Rate und Besuchern mit Lead, Balkendiagramm der Leads je Typ und Liste der häufigsten Aktionen
Leads: Anrufe, Routen, Reservierungen, Bestellungen, WhatsApp, E-Mails und Formulare werden als Kontakt-Absicht gezählt und dem Besucher dauerhaft zugeordnet. Export als CSV.
Analytics-Dashboard, Ansicht Shop: Kennzahlen zu Käufen, Umsatz, durchschnittlichem Bestellwert und Kaufabschluss, Bestell-Funnel von Produkt angesehen bis Gekauft sowie Top-Produkte
Shop: Der Weg bis zur Kasse als Funnel mit Abbruchquoten je Schritt, dazu Umsatz, Bestellwert und die meistgekauften Produkte.
Analytics-Dashboard, Ansicht Kampagnen: Tabellen der UTM-Quellen und UTM-Kampagnen mit Aufrufen sowie ein Generator für neue UTM-Links
Kampagnen: Welche Quellen und Kampagnen Besucher bringen. Der integrierte Generator erzeugt fertige UTM-Links für Instagram-Bio, Flyer oder Newsletter.
Analytics-Dashboard, Ansicht Profile: Tabelle wiedererkannter Besucher mit Name, Land, erstem und letztem Besuch, Sitzungen, Aufrufen, Dauer und Lead-Anzahl, gefiltert auf Profile mit Lead
Profile (nur für den Betreiber sichtbar): Wiedererkannte Besucher mit Einwilligung, eigene Namen und Notizen, Filter auf Besucher mit Lead. Hier mit Beispieldaten.
Analytics-Dashboard, Ansicht Einstellungen: Alert-Schwellwerte, Ausschluss eigener Besuche, Kontodaten mit Passwort ändern, Design hell oder dunkel sowie eine Datenschutz-Legende
Einstellungen: Schwellwerte für Hinweise, eigene Besuche ausblenden, Passwort und Design. Die Legende erklärt, welche Zahlen mit Einwilligung und welche nur anonym erhoben werden.
Startseite von elyesferchichi.com mit dem Einwilligungs-Dialog des Trackers: Erklärung ohne Namen und Kontaktdaten, Hinweise Keine Werbung und Keine Drittanbieter, Buttons Ablehnen und Gerne, akzeptieren
Der Einwilligungs-Dialog des Trackers: Ohne Zustimmung werden nur anonyme Zähler erhoben, Ablehnen ist genauso leicht wie Akzeptieren.

Fragen zum Projekt

Häufige Fragen

Ist das System eine Alternative zu Google Analytics?

Für kleine und mittlere Websites ja. Es misst Besucher, Seiten, Verhalten und vor allem Kontaktabsichten. Es ersetzt keine Werbe-Plattform und baut keine Nutzerprofile über Websites hinweg.

Bekomme ich als Kunde Zugang zum Dashboard?

Ja. Jede Website, die ich baue, kann angebunden werden. Sie bekommen eigene Zugangsdaten und sehen ausschließlich Ihre Website. Das gehört zur Website-Wartung.

Was passiert, wenn ein Besucher den Consent-Dialog ablehnt?

Dann wird nichts Personenbezogenes gespeichert. Es bleibt nur ein anonymer Tageszähler je Lead-Typ, ohne Sitzung und ohne Besucher-ID.

Warum Telegram für Formulare?

Weil eine Anfrage in Sekunden auf dem Handy sein muss. E-Mail geht verloren oder landet im Spam. Das Archiv im Worker sichert jede Nachricht zusätzlich für ein Jahr.

Kann ich das auch auf meiner bestehenden Website nutzen?

Grundsätzlich ja, wenn ich ein Skript einbinden darf. Sprechen Sie mich über Kontakt an, dann prüfe ich die Seite.

Ähnliches Projekt?

Sie brauchen so etwas für Ihren Betrieb?

Schreiben Sie mir, was Sie vorhaben. Ich sage Ihnen ehrlich, was sinnvoll ist, und nenne einen Festpreis.