Ein Tag, ein SDK, ein Projekt.
Vier Dinge zu verkabeln, keines davon länger als ein paar Zeilen. Alles meldet in dasselbe Projekt und landet auf demselben Dashboard.
Quellen
Einrichtung
Vier Zeilen Verkabelung, dann meldet es.
Es gibt keine Pipeline aufzusetzen und kein Warehouse anzubinden. Tag und SDK sprechen mit einem Endpunkt, und der Endpunkt schreibt in eine Datenbank.
- 01 web
Tag auf der Website einbinden
Ein Script-Tag auf der Marketing-Seite. Reines TypeScript, unter 3 KB gzip, keine Abhängigkeiten und kein zweiter Request. Vor der Einwilligung schreibt und sendet es nichts.
<script defer src="https://…/t.js" data-key="fr_web_…"></script> - 02 app
SDK in der App initialisieren
Ein Aufruf beim Start. Ab da trägt derselbe Client Produkt-Events, Exceptions, Logs und Feedback, also gibt es eine Sache zu konfigurieren statt vier.
firstrun.init({ key: "fr_app_…", release: "2.7.0", }) - 03 app
Senden, was du zählen willst
Ein typisierter Umschlag mit deinem eigenen Namen und deinen Properties. Exceptions und Log-Zeilen nehmen denselben Weg, deshalb übersteht ein Event, das auf einem Laptop ohne Netz in der Queue lag, den Neustart und kommt später an.
firstrun.track("project.created", { template: "blank", }) - 04 app
Feedback-Widget einsetzen
Ein Reporter, der das laufende Release, die Plattform und die letzte Exception vor dem Öffnen anhängt. Was ankommt, ist ein Ticket und nicht der Anfang eines Gesprächs darüber, auf welchem Build jemand ist.
firstrun.feedback.open()
Aufzeichnung
Wie aus etwas Geschehenem eine Zeile wird.
Die Regeln unten halten Tests fest und nicht die Gewohnheit. Nur deshalb lohnt es sich, sie auf einer Marketing-Seite abzudrucken.
-
Die Zeit des Clients ist die echte Zeit
Der Laptop ist offline, das System beendet den Prozess, die Queue liefert drei Tage später nach. Das Event landet trotzdem an dem Tag, an dem es passiert ist. Nichts wird nach Eingangszeit einsortiert.
-
Ein Umschlag für alles
Ein Produkt-Event, eine Exception und eine Log-Zeile haben dieselbe Form mit einem anderen Typ. Deshalb konfiguriert ein SDK-Aufruf alle drei, und deshalb ist es der Retry-Queue egal, was gerade durchläuft.
-
Das Release reist mit dem Event
Jeder Datensatz trägt die Version, aus der er kam. Verbreitung, Retention und Crash-Rate werden dadurch über dasselbe Feld geschnitten, statt nachträglich aus Zeitstempeln rekonstruiert zu werden.
-
Die Aufnahme scheitert laut
Ein aufgebrauchter Plan oder ein falscher Key stoppt die Aufnahme und sagt das auch. Es wird nicht still gesampelt, und nichts bereits Angekommenes wird gelöscht.
Datenschutz
Absichtlich klein genug, um es zu halten.
Je weniger ein Tag erheben muss, desto weniger Versprechen gibt es zu halten. Dieses erhebt so wenig, dass Selbst-Hosten den Rest davon erledigt.
-
Nichts vor der Einwilligung
Das Web-Tag belegt keinen Speicher und sendet keinen Request, bevor eingewilligt wurde. Ablehnen tut schlicht nichts, statt in einen abgespeckten Modus mit Cookie zu führen.
-
IPs werden mit deinem eigenen Salt gehasht
Eine rohe Adresse wird nie geschrieben. Selbst gehostet liegt das Salt in deiner Umgebung und verlässt sie nie, die Hashes sind für uns also nicht umkehrbar, weil wir es nicht haben.
-
Kein Fingerprinting
Kein Geräte-Fingerprint, keine seitenübergreifende Kennung, kein Session-Replay. Eine Besucher-ID ist ein First-Party-Wert, der auf deine eigene Domain begrenzt ist, und sonst nichts.
-
Keine Dritten, nirgends
Kein CDN, kein Font-Host, kein Tag-Manager. Die Seite, die du gerade liest, holt ihre Schrift aus genau demselben Grund vom eigenen Origin.