Statistiken (Alpha)
Eine Zeile in deinen Seiten liefert dir ihre Besuche, ohne Cookies, und auf Wunsch einen Feedback-Button. Statistiken ist in der Alpha-Phase und nur in der Web-App verfügbar.
Website einbinden
Öffne in der Web-App Statistiken, füge die Domain hinzu und setze die angezeigte Zeile in den <head> jeder Seite. Subdomains zählen zu ihrer Domain. Seiten auf localhost werden nicht gezählt.
<script defer src="https://zenhook.dev/z.js" data-site="zs_your_site_key"></script>Soll das ein KI-Agent erledigen, nutze in der Einrichtung der Website die Funktion zum Kopieren der Anweisungen für deine KI: Sie schreibt dem Agenten die Zeile, die Ereignisse und die Prüfung auf.
Mit nur einem Token erledigt ein Agent alles von Anfang bis Ende: Dieser Aufruf fügt die Website hinzu und gibt ihren Schlüssel zurück, danach schreibt er die Zeile, die Ereignisse und das Ziel unten.
curl -X POST -H "Authorization: Bearer $ZENHOOK_TOKEN" -H "Content-Type: application/json" \
-d '{"domain":"example.com"}' "https://zenhook.dev/api/sites"Eigene Ereignisse
Seitenaufrufe werden ohne Code erfasst, auch die Navigation in Single-Page-Apps. Erfasse die Aktionen, die zählen, dort, wo sie passieren:
window.zenhook?.track("signup", { plan: "pro" })Ziele
Ein Ziel ist das, was auf der Website als Erfolg zählt: ein Ereignis, das sie sendet (signup), oder eine erreichte Seite (/thanks, oder /blog/* für alles darunter). Mit einem Ziel zeigt die Seite der Website ihre Conversions und ihre Rate, und jede Liste bekommt eine Conversion-Spalte, sodass du siehst, welche Quelle, welches Land oder welches Gerät die Leute bringt, die es tun. Ein Ziel wird aus den bereits gespeicherten Besuchen gezählt, seine Vergangenheit ist also da, sobald du es hinzufügst. In der App schlägt die Seite der Website Ziele aus dem vor, was sie bereits sendet; ein Agent fügt eines mit einem Aufruf hinzu, mit der Domain oder der ID der Website:
curl -X POST -H "Authorization: Bearer $ZENHOOK_TOKEN" -H "Content-Type: application/json" \
-d '{"kind":"event","match":"signup"}' "https://zenhook.dev/api/sites/example.com/goals"GET auf dieselbe Adresse listet die Ziele und Vorschläge aus den letzten 30 Tagen der Website auf; DELETE /api/sites/example.com/goals/:id beendet die Zählung eines Ziels. Bis zu 10 Ziele pro Website. Füge dann goal=:id zur Statistikabfrage hinzu: totals bekommt conversions und jede Zeile ihre conversions.
Feedback
Aktiviere Feedback für die Website und frage dann dort und dann, wo es zählt. Von deiner eigenen Oberfläche aus sendet ein Aufruf die Antwort: dein Design, dein Moment, nichts von uns auf der Seite. Jede Antwort kommt als Ereignis New feedback in deinem Channel Feedback an, mit der Reaktion, der Seite, dem Gerät und der E-Mail, falls jemand sie hinterlassen hat, und benachrichtigt dich wie jedes Ereignis.
// A reaction in one tap is enough; a message and an email are optional.
const { ok, error } = await window.zenhook.sendFeedback({
reaction: "up",
message: "The export took three clicks too many.",
email: "[email protected]",
});Das Skript ist nicht nötig: Dieselbe Anfrage lässt sich auch von Hand schreiben.
// The same request without the script, from a page of your site only.
await fetch("https://zenhook.dev/api/f", {
method: "POST",
body: JSON.stringify({ site: "zs_your_site_key", reaction: "up", message: "...", url: location.href }),
});Ein Server (das Backend einer App, ein Bot, ein Spielserver) hat keine Seite: Er sendet an die Webhook-URL deines Channels Feedback, wie jedes Zenhook-Ereignis. Die Adresse steht in den Einstellungen des Channels. Mit diesem Titel und deiner Domain als Quelle landet es im Feedback der Website, neben dem, was deine Seiten senden:
curl -X POST "$ZENHOOK_FEEDBACK_URL" -H "Content-Type: application/json" \
-d '{"title":"New feedback","message":"The export took three clicks too many.","source":"example.com","actor":{"email":"[email protected]"},"fields":[{"label":"Reaction","value":"down"}]}'Der Vertrag, von einer Seite aus. reaction ist die Antwort mit einem Tippen, "up" oder "down", angezeigt als Daumen am Anfang der Zeile; message hat höchstens 4.000 Zeichen, und eines von beiden reicht; email ist optional; url ist die vollständige Adresse der Seite. Die Antwort ist 200 mit { "ok": true }, oder { "error": "..." } mit der Ursache: 400 ein Feld ist falsch oder fehlt, 403 Feedback ist für die Website aus oder die Anfrage kommt nicht von einer ihrer Seiten, 404 keine Website hat diesen Schlüssel, 429 zu viele. Zum Testen sende von einer Seite auf localhost: Es landet als Test markiert in deinem Channel Feedback und antwortet { "ok": true, "test": true }.
Was es sicher macht. Der Website-Schlüssel in einer Seite ist absichtlich öffentlich, er ist also nicht das, was dich schützt. Der Origin des Browsers muss die eigene Domain der Website sein, und den kann eine andere Website in den Browsern ihrer Besucher nicht fälschen. Ein Skript außerhalb eines Browsers kann es, deshalb sind die Mengen begrenzt: Eine Adresse sendet 10 Nachrichten in 10 Minuten und 20 am Tag, eine Website nimmt 200 am Tag an, und ein anhaltender Strom erreicht dein Handy als eine Zusammenfassung pro Stunde. Die Webhook-URL des Channels ist ein Geheimnis: Bewahre sie auf deinem Server auf, in ZENHOOK_FEEDBACK_URL.
Unser eigener Button ist ein Wort mehr in der Zeile: data-feedback setzt ihn unten rechts. Jedes Element mit data-zenhook-feedback, oder window.zenhook.feedback(), öffnet dasselbe Fenster ohne den Button. Das Fenster übernimmt die Sprache der Seite (ihr html lang; data-lang am Skript setzt eine andere) und ihr Design; data-theme="light" oder "dark" erzwingt eines:
<script defer src="https://zenhook.dev/z.js" data-site="zs_your_site_key" data-feedback></script>
<!-- or, from your own button, with no button of ours: -->
<button data-zenhook-feedback>Feedback</button>Zahlen abfragen
Die Seite Statistiken zeigt den Zeitraum auf einen Blick. Der Assistent beantwortet Fragen dazu („Welche Seiten haben diese Woche Registrierungen gebracht?“). Skripte und KI-Agenten nutzen die API mit einem Token aus Einstellungen, API-Tokens:
curl -H "Authorization: Bearer $ZENHOOK_TOKEN" \
"https://zenhook.dev/api/sites/stats?site=example.com&period=7d&dimensions=page,referrer"{
"site": "example.com",
"from": "2026-09-22T18:00:00.000Z",
"to": "2026-09-29T18:00:00.000Z",
"totals": { "visitors": 412, "pageviews": 1290, "events": 37 },
"series": [{ "at": "2026-09-23T00:00:00.000Z", "visitors": 58, "pageviews": 170 }],
"breakdowns": {
"page": [{ "value": "/", "visitors": 300, "count": 520 }],
"referrer": [{ "value": "google.com", "visitors": 120, "count": 180 }]
}
}site ist eine Domain oder eine Website-ID. period ist 24h, 7d, 30d oder 90d, oder gib die Daten from und to an. dimensions: page, referrer, country, device, browser, os, event, utm_source, utm_campaign, utm_content, campaign (Quelle / Anzeige, etwa meta / spring-video). Filter: page (/pricing, /blog/* für alles darunter, mehrere mit Kommas, ! davor für alles außer: !/app/*), referrer (direct für keine), country, device, event, utm_source, utm_campaign, utm_content (die Besucher, die darüber kamen, mit jeder Seite, die sie gesehen haben). limit: 1 bis 50 Zeilen pro Liste. goal: die ID eines Ziels, für Conversions insgesamt und pro Zeile. Eine Quelle ist der Ort, an dem der Tag eines Besuchers auf der Website begann: Die Seiten nach der ersten zählen nie als direkt. Eine Kampagne wird aus den utm_-Tags der Seite gelesen, auf der ein Besucher gelandet ist, oder aus der Klick-ID einer Anzeige (Google, Microsoft, TikTok, X, LinkedIn, Reddit, Snapchat, Pinterest), wenn der Link keine Tags hat; die ID selbst wird nie gespeichert.
PDF-Bericht
Die Seite der Website hat einen Button PDF-Bericht: die Zahlen des angezeigten Zeitraums mit ihrer Veränderung gegenüber dem Zeitraum davor, die Besucher pro Tag und jede Liste mit ihrem Anteil, zum Senden an jemanden, der Zenhook nie öffnet. Ein Skript oder ein Agent bekommt dieselbe Datei mit einem Token, für einen gleitenden Zeitraum oder einen Kalendermonat:
curl -H "Authorization: Bearer $ZENHOOK_TOKEN" -o report.pdf \
"https://zenhook.dev/api/sites/report?site=example.com&from=2026-10-01&to=2026-11-01&tz=Europe/Paris"period (24h, 7d, 30d, 90d) oder from und to, tz für die Tage, goal=:id für seine Conversions, lang=en, fr, pt oder de (standardmäßig die Sprache des Kontos).
Datenschutz
Kein Cookie und nichts im Browser, es sei denn, der Besucher widerspricht. Ein Besucher ist ein Hash aus Adresse und Browser mit einem Salt, das sich jeden Tag ändert und nie mit den Daten gespeichert wird, sodass eine Person nicht von einem Tag zum nächsten verfolgt werden kann. Bots werden nicht gezählt. Teile eines Pfads, die wie ein Token, eine ID oder eine E-Mail aussehen, werden als :id oder :email gespeichert, und der Query-String wird nie gespeichert. Besuche werden 13 Monate aufbewahrt. Browser, die Global Privacy Control oder Do Not Track senden, werden nicht gezählt, und ein Link mit data-zenhook-optout (oder zenhook.optOut()) beendet die Zählung eines Besuchers, der widerspricht. Die Einrichtung der Website liefert den Absatz für ihre Datenschutzseite.