01

Pour commencer

BetterMeter suit quatre types de sources. Chacune utilise une intégration légère qui envoie les événements au même pipeline respectueux de la vie privée.

Sites web
<script> tag
~4 Ko, sans cookies
Outils CLI
Node SDK
trackCommand()
Serveurs MCP
Node SDK
wrapMcpServer()
API
Node SDK
expressMiddleware()

Toutes les sources passent par le même pipeline : événement -> traitement (analyse du référent, détection de robots, géolocalisation, hachage de confidentialité) -> base de données. Vous consultez le tout dans le tableau de bord, le CLI ou via les outils MCP.

Espace de filtres analytiques

Les principaux hubs analytiques partagent un espace de filtres adaptatif. Périodes, onglets, recherches et facettes contextuelles sont conservés dans l’URL pour des analyses persistantes et partageables. Le graphique d’ensemble suit la période sélectionnée et inclut les dates sans activité.

  • Trafic : recherchez pages, sources et campagnes; segmentez par engagement, attribution IA, canal et volume.
  • Audience : trouvez visiteurs, sessions et actions; segmentez par type, intention, pays et volume d’événements.
  • Agents : inspectez robots, CLI, MCP et API par catégorie et état de performance.
  • Visibilité : filtrez plateformes IA, classements, mentions et domaines référents par signal et autorité.
02

Suivi web

Ajoutez une seule balise script à votre site. Sans cookies, sans configuration CNAME, sans installation complexe. ~4 Ko compressé.

HTML -- add to <head>
<script defer data-site="example.com" src="https://bettermeter.com/api/script"></script>

Optionnel : ajoutez un pixel de suivi no-JS avant la balise de fermeture </body> pour détecter les robots et crawlers qui n'exécutent pas JavaScript :

HTML -- add before </body>
<img src="https://bettermeter.com/api/pixel?s=example.com" alt="" style="position:absolute;width:0;height:0;overflow:hidden" />

Le script de suivi capture automatiquement les pages vues, la navigation SPA (History API) et les retours d'onglet. Pour les événements personnalisés et l'identification des utilisateurs :

JavaScript
// Track custom events
window.bettermeter.track("signup", { plan: "pro" });

// Identify users (optional)
window.bettermeter.identify("account_123");

// Clear the durable identity on sign-out
window.bettermeter.reset();

identify() conserve l'identifiant opaque de ce site dans le stockage local et l'associe aux visites suivantes; appelez reset() à la déconnexion. Ne transmettez pas d'adresse courriel ni d'autre donnée personnelle directe.

Attributs

data-siterequis
string
Votre domaine tel qu'enregistré dans BetterMeter
data-api
string
Point d'accès API personnalisé pour les configurations de proxy (ex. : /api/collect)
data-no-heartbeat
flag
Désactiver le suivi des visiteurs en temps réel pour cette page
data-fingerprint
boolean
Activer explicitement les champs d'empreinte navigateur ; désactivé par défaut
data-behavior
boolean
Activer explicitement l'échantillonnage du défilement et de la souris ; désactivé par défaut
data-attribution
boolean
Activer explicitement la conservation de l'identifiant de clic publicitaire (gclid, fbclid, msclkid et autres) pendant 90 jours ; désactivé par défaut
data-attribution-fields
boolean
Remplir les champs de formulaire masqués correspondants à partir du clic publicitaire conservé ; nécessite data-attribution

Attribution des clics publicitaires

Un clic publicitaire arrive avec un identifiant émis par la plateforme dans l'URL — gclid pour Google, fbclid pour Meta. Il n'apparaît que sur une seule page vue, celle d'arrivée, et c'est le seul jeton que ces plateformes acceptent lorsque vous leur signalez plus tard que le clic a converti. BetterMeter conserve le plus récent pendant 90 jours, la même durée que les témoins de Google et de Meta, et l'inscrit sur le visiteur sous forme de propriétés bm_*.

HTML
<script defer data-site="example.com" data-attribution="true" data-attribution-fields="true" src="https://bettermeter.com/api/script"></script>

Avec data-attribution-fields, tout champ masqué vide dont le nom correspond est rempli. gclid et bm_gclid fonctionnent tous les deux, donc un champ CRM existant n'a pas à être renommé. Les champs visibles et ceux qui contiennent déjà une valeur ne sont jamais modifiés.

HTML -- hidden fields on your form
<input type="hidden" name="gclid">
<input type="hidden" name="fbc">
<input type="hidden" name="utm_source">
<input type="hidden" name="utm_campaign">

Trois méthodes permettent de le piloter manuellement — utile derrière une bannière de consentement, ou pour un formulaire injecté après le chargement de la page.

JavaScript
// Capture after a consent banner is accepted
window.bettermeter.captureAttribution();

// Read the parked click, e.g. to POST it yourself
window.bettermeter.getAttribution();
// { bm_gclid: "Cj0KCQ...", bm_utm_source: "google",
//   bm_landing_page: "/pricing", bm_first_seen: "2026-08-15T11:34:26.422Z", ... }

// Fill a form injected after page load (HubSpot legacy onFormReady)
hbspt.forms.create({
  formId: "...",
  onFormReady: (form) => window.bettermeter.fillAttributionFields(form),
});

Entièrement désactivé sous Do Not Track et Global Privacy Control, et effacé par reset(). Un clic ultérieur remplace intégralement celui conservé plutôt que de fusionner, afin qu'une conversion ne soit jamais attribuée à deux plateformes. Une valeur de plus de 255 caractères est écartée plutôt que tronquée, car un identifiant de clic partiel est rejeté par la plateforme. Les nouveaux formulaires intégrés de HubSpot s'affichent dans une iframe et ne peuvent pas être remplis depuis la page — utilisez plutôt le préremplissage par paramètres d'URL de HubSpot. Sur iOS, Google envoie `gbraid` ou `wbraid` au lieu de `gclid` ; les deux sont captés, mais seule l'API Google Ads les accepte lors d'un téléversement de conversion — l'import manuel de l'interface les rejette comme des GCLID invalides.

Conversions CRM (HubSpot)

Connectez HubSpot et BetterMeter récupère les fiches sur lesquelles vos identifiants de clic ont abouti. Les deux systèmes sont reliés par l'identifiant de clic publicitaire, jamais par une adresse courriel — le traceur inscrit le jeton dans vos champs de formulaire masqués, de sorte que les deux côtés détiennent déjà la même valeur et qu'aucune donnée personnelle n'a à circuler entre eux. La connexion crée aussi les propriétés de contact bm_*, ce qui n'est pas un simple confort : HubSpot écarte silencieusement un champ de formulaire dont la propriété n'existe pas, donc sans elles les champs masqués sont abandonnés à l'envoi, sans erreur nulle part.

Connectez un portail dans Paramètres → Dossiers clients : créez une application privée dans HubSpot, accordez-lui les autorisations de lecture et d’écriture sur les contacts, puis collez son jeton d’accès. BetterMeter le vérifie et crée les propriétés de contact bm_* pour vous.

Terminal
# Or connect from a script (creates the bm_* contact properties for you)
curl -X POST https://bettermeter.com/api/integrations/crm \
  -H "Authorization: Bearer bm_..." -H "Content-Type: application/json" \
  -d '{"siteId":"<site-id>","provider":"hubspot","accessToken":"pat-na1-..."}'

# Then pull conversions
bettermeter crm -s <site-id>
bettermeter crm:sync -c <connection-id>
bettermeter conversions --won

# The ad behind a visit. --utm-content resolves one exact creative;
# without it the answer is campaign-level and says so.
bettermeter ad-creative -s <site-id> --campaign "Summer Sale"
bettermeter ad-creative -s <site-id> --utm-content 120001234567890

L'application privée requiert crm.objects.contacts.read, crm.objects.contacts.write et crm.schemas.contacts.write. Les synchronisations sont incrémentales selon la date de dernière modification HubSpot ; HubSpot refuse de paginer au-delà de 10 000 résultats pour une même requête, donc un grand portail est lu par fenêtres glissantes et une exécution interrompue renvoie truncated: true plutôt que de paraître complète.

Détection de robots côté serveur

La plupart des robots (Googlebot, GPTBot, ClaudeBot, etc.) n'exécutent pas JavaScript, donc le script de suivi ne se déclenche jamais pour eux. Pour détecter le trafic des robots et crawlers, ajoutez une ligne à votre middleware Next.js :

middleware.ts
import { reportBotVisit } from "@bettermeter/node/middleware";

export function middleware(request) {
  reportBotVisit(request, "example.com", { apiKey: "bm_..." });
  // ... rest of your middleware
}

Installer le SDK :

Terminal
npm install @bettermeter/node

Compatible avec l'edge, non bloquant, sans impact sur la latence. Détecte plus de 25 robots connus, y compris les crawlers IA, les moteurs de recherche et les services de surveillance. Les visites de robots apparaissent automatiquement dans votre tableau de bord Crawlers.