zylior
← Blog

Attribution first-party : suivre tes visiteurs sans cookies tiers

Tu lances une campagne, tu vois 400 visiteurs dans Google Analytics, 12 inscriptions… et tu es incapable de dire lesquels viennent de quelle source. Bienvenue dans l'attribution post-cookies tiers, où 30 à 50 % de ton trafic est devenu invisible. La bonne nouvelle : tu n'as pas besoin de GA ni de pixels tiers. Un pixel servi par ton propre domaine suffit à reconstruire la chaîne visite → inscription → revenu, et il survit à tout ce qui casse les trackers classiques.

Pourquoi les solutions classiques s'effondrent

Les pixels tiers (Meta Pixel, le `gtag.js` de Google, Hotjar…) posent un cookie ou lisent un identifiant depuis un domaine différent du tien. C'est exactement ce que les navigateurs ont décidé de tuer. Trois forces convergent et tu les subis déjà :

Le point commun de ces trois cassures : elles visent le tiers. Si l'identifiant vient de ton domaine et ne sert qu'à toi, la plupart de ces règles ne s'appliquent pas de la même façon.

Le principe : un pixel first-party + un visitor_id anonyme

L'idée tient en trois pièces. Tu sers un endpoint de collecte sur ton propre domaine (idéalement un sous-domaine comme `t.tonapp.com`, pas un domaine de tracking externe). À la première visite, tu génères un `visitor_id` aléatoire et tu le stockes dans un cookie first-party, HttpOnly, Secure. À chaque page vue, le navigateur renvoie ce cookie à ton serveur, qui logge l'événement. Le détail qui change tout : le cookie est posé par une réponse HTTP `Set-Cookie` côté serveur, pas par `document.cookie` en JavaScript. C'est cette nuance qui contourne le plafond de 7 jours d'ITP — la limite vise les cookies posés en JS, pas ceux posés par le serveur en first-party. Et `HttpOnly` les rend illisibles par n'importe quel script, donc inexploitables pour du vol via XSS.

# Réponse de ton endpoint /t/collect servi sur t.tonapp.com
HTTP/1.1 204 No Content
Set-Cookie: vid=8f3c1a9e-...; Max-Age=63072000; Path=/;
  Domain=.tonapp.com; HttpOnly; Secure; SameSite=Lax

// pixel.js côté client (~10 lignes) :
// fetch("https://t.tonapp.com/t/collect", {
//   method: "POST", credentials: "include", keepalive: true,
//   headers: { "Content-Type": "application/json" },
//   body: JSON.stringify({ path: location.pathname,
//     ref: document.referrer, utm: location.search, ts: Date.now() }) });

La fusion : du visitor_id anonyme à l'identité prouvée

Tant que le visiteur est anonyme, tu accumules des événements rattachés à un `visitor_id` opaque. La magie opère au moment de l'inscription : l'utilisateur prouve son email (lien de confirmation ou OTP), et tu fais le stitching — tu relies le `visitor_id` du cookie au compte fraîchement créé. À cet instant, toute l'histoire anonyme d'avant (première visite, source, pages vues) se rattache rétroactivement à une identité réelle.

  1. Au moment du signup, lis le cookie `vid` côté serveur dans la même requête.
  2. Écris une ligne `identity(visitor_id, user_id, email_verified_at)` — l'email prouvé, pas juste saisi.
  3. Recolle tous les événements anonymes portant ce `visitor_id` au `user_id`. Tu obtiens le chemin complet : Twitter → /pricing → /signup → email confirmé.
  4. Bonus : si le même email se reconnecte depuis un autre appareil, fusionne deux `visitor_id` sous un seul `user_id`.
Ne fusionne JAMAIS sur un email simplement tapé dans un champ. Attends la preuve (confirmation/OTP). Sinon un visiteur qui entre `concurrent@gmail.com` pollue l'attribution d'un vrai compte — et tu viens d'introduire une faille d'énumération de comptes. La preuve d'email est la frontière entre anonyme et identifié.

Ce que tu gagnes vs Google Analytics et pixels tiers

Ce n'est pas un permis de tout tracker sans consentement. First-party réduit le risque technique et certains besoins de bannière selon la finalité, mais le RGPD raisonne par finalité et par jurisprudence (CNIL incluse). Si tu fais du profilage marketing, il te faut une base légale. Garde le pixel mesure-interne séparé de tout enrichissement publicitaire.

Les pièges qui cassent le setup en prod

Commence petit : un endpoint, un cookie `Set-Cookie` HttpOnly servi sur ton sous-domaine, une table `events(visitor_id, path, ref, ts)` et une table `identity(visitor_id, user_id)` peuplée quand l'email est prouvé. Tu auras en une après-midi une attribution qui survit à Safari, aux bloqueurs et au consentement — et qui se branche directement sur ton MRR. Quand ça tourne, ajoute le multi-device et le décompte des sources. Le reste, c'est du SQL.

La newsletter

En t’inscrivant, tu acceptes de recevoir la newsletter Zylior. Désinscription en 1 clic dans chaque email.