Comment ça fonctionne
Sarutobi relie quatre choses : une librairie qui envoie des événements, une ingestion qui les vérifie et les enrichit, des agrégats calculés en tâche de fond, et des écrans qui posent des questions. Cette page suit ce trajet dans l'ordre.
Le trajet d'un événement
- Librairieenvoie les événements du site par lots
- POST /api/collectvalide le lot, vérifie l’origine et le quota, répond 202 : lot accepté
- Événements brutsécrits à l’ingestion, rattachés à leur session et à leur personneTemps réellit directement les visites brutes : visiteurs actifs, pages consultées maintenant
- Agrégatscalculés par une tâche planifiée
- Écrans du dashboardlisent les agrégats pour chaque période
Chaque flèche compte. Un 202 à l'ingestion veut dire « lot accepté », pas « visible dans le dashboard » : les agrégats sont calculés par une tâche planifiée, avec quelques minutes de retard. C'est la source de confusion la plus fréquente, et elle a une conséquence pratique — un chiffre récent qui paraît bas est souvent un chiffre incomplet.
Les écrans se mettent à jour tout seuls
Un flux SSE par site pousse toutes les cinq secondes deux choses : les chiffres réellement instantanés — visiteurs actifs, pages consultées maintenant — et un repère de fraîcheur qui dit si les données ont bougé.
Quand ce repère avance, la page se redemande d'elle-même. Ce qui est diffusé, ce n'est donc pas le contenu de chaque écran mais le fait qu'il a changé — sans quoi il aurait fallu réimplémenter chaque lecture une seconde fois, côté flux, et les deux auraient divergé au premier correctif de définition.
- Une seule connexion par flux, partagée par tous les composants de la page.
- Un repère de fraîcheur dans la barre latérale dit quand les chiffres ont bougé — sans lui, un écran figé et un écran à jour se ressemblent exactement.
- La liste des sites porte un compteur vivant par site, alimenté par une requête groupée et une connexion pour toute la page.
- Vingt secondes minimum entre deux rafraîchissements : un onglet ouvert ne doit pas devenir un générateur de charge.
- Rien ne se rafraîchit quand l'onglet est en arrière-plan ; le retard est rattrapé au retour.
- Un filtre en cours de saisie ou un menu ouvert survivent au rafraîchissement : seuls les composants serveur sont rejoués.
1. Déclarer un site
Un site est l'unité de mesure : un domaine, un fuseau horaire, une clé publique. Il appartient à une organisation, qui porte les membres et leurs rôles. Rien ne traverse jamais la frontière d'une organisation.

2. Installer la librairie
L'écran d'installation donne la clé publique du site — appelée siteId — et l'extrait à coller. Il affiche aussi les rejets des dernières 24 h, ce qui répond à la question qu'on se pose vraiment quand rien n'arrive : est-ce que les événements sont refusés, et pourquoi.

3. Lire la vue d'ensemble
La vue d'ensemble répond à « combien, et par rapport à quand ». Chaque chiffre est comparé à la période précédente de même longueur — sans comparaison, un nombre ne dit rien.

4. Poser une question précise
Trends est le constructeur de questions : un événement, une mesure, un découpage. La question vit dans l'URL, donc elle se partage et se rejoue — et elle peut être enregistrée comme insight, ce qui sauvegarde la définition, pas le résultat.

5. Suivre les personnes
Une visite, une session et une personne sont trois choses distinctes. Une visite se clôt après trente minutes d'inactivité ; une personne peut couvrir plusieurs appareils dès qu'elle a été identifiée par identify().
reset() coupe proprement la chaîne à la déconnexion. Le navigateur suivant repart avec une nouvelle identité anonyme et une nouvelle session.
6. Voir ce qui casse
Les erreurs JavaScript non gérées remontent groupées par signature, avec leur volume et leur dernière occurrence. Les messages sont expurgés avant stockage : un jeton ou une adresse qui traînerait dans une stack n'y arrive pas.

7. Brancher un agent
Un jeton d'agent permet à un programme — Claude Code, un job de CI — de lire ces mêmes chiffres par le serveur MCP, sans ouvrir le dashboard. Le jeton porte une identité et une seule organisation, et son rôle est relu à chaque appel.

Le détail de la connexion vit sur la page du serveur MCP.
Ce qu'il faut retenir
- Un
202signifie « accepté », pas « visible ». - Le temps réel lit les visites brutes ; les vues agrégées lisent les rollups.
- Les mesures non additives ne s'additionnent pas d'un bucket à l'autre.
- Visite, session et personne sont trois notions différentes.
- Les données mesurées sont écrites par des tiers : ce sont des données, pas des ordres.
