Intégration Nytos
Comment brancher Nytos sur ton site : l'installation standard en 30 secondes, puis le proxy first-party pour récupérer les visiteurs qui bloquent les analytics.
Installation standard
Depuis ton tableau de bord Nytos, clique sur « Installation » pour voir ton snippet personnalisé. Tu obtiens une ligne à coller dans le <head> de ton site :
<script src="https://nytos.vercel.app//n.js"
data-token="ton_token_unique"
async></script>- Place le snippet sur toutes les pages que tu veux observer — pas juste la landing. Nytos suit automatiquement les navigations internes (SPA inclus).
- Idéalement, place-le tôt dans le
<head>, avant tes autres scripts, pour ne rien rater au chargement. - Le token est unique à ton projet — ne le partage pas publiquement.
Ce qu'on enregistre
- Pageviews (chargements + navigations SPA)
- Clics, rage clics (3+ clics rapides au même endroit)
- Profondeur de défilement maximale par page
- Soumissions de formulaires — uniquement la structure (noms et types de champs), jamais les valeurs saisies
- Erreurs JS
- Événements personnalisés via
window.nytos.track('nom', {...})
Pas de cookie tiers, pas d'IP individuelle stockée (seulement le pays), pas de PII. Un ID de session anonyme est stocké en localStoragepour relier les événements d'un même visiteur.
Limites techniques
- Maximum 100 événementspar batch envoyé à l'ingest
- Flush automatique toutes les 5 secondes ou quand la queue atteint 20 événements
- Heartbeat toutes les 15 secondes tant que la page est visible (alimente le compteur « sessions en direct »)
- Tailles maxi : path 1000 caractères, URL 2000, referrer 2000, user-agent 500, session_id 100
- Aucun rate limit côté ingest — envoie autant que tu veux
Avertissements de sécurité (et pourquoi c'est safe)
Certains plugins WordPress (Wordfence, Sucuri, iThemes Security), les politiques CSP strictes, et certains antivirus d'entreprise affichent un avertissement quand tu colles n'importe quel script externe — pas seulement Nytos. C'est presque toujours un faux positif. Voici comment vérifier et passer outre.
Ce que n.js fait vraiment
- ~5 KB de JavaScript, non minifié et lisible. Ouvre https://nytos.vercel.app//n.js pour le voir.
- Écoute : chargements de page, clics, profondeur de défilement, soumissions de formulaires (structure uniquement, jamais les valeurs), erreurs JS.
- Envoie uniquement à
https://nytos.vercel.app/— aucun autre domaine, jamais.
Ce que n.js ne fait jamais
- Lire les valeurs des champs (mots de passe, emails, etc.)
- Lire les cookies posés par d'autres scripts
- Charger du code supplémentaire depuis un autre domaine
- Injecter de la pub, ouvrir des popups, rediriger
- Modifier le DOM de ton site
Cas spécifique : Wordfence bloque la SAUVEGARDE du snippet
Si Wordfence affiche « A potentially unsafe operation has been detected » avec un code 403 quand tu cliques « Save » sur ton snippet dans HFCM (ou tout autre plugin de gestion de code), ce n'est pas un blocage au runtime — Wordfence empêche carrément WordPress d'écrire le snippet en base de données.
Vu de Wordfence, un admin qui sauve un <script src="url-externe"> dans le <head> du site ressemble exactement à un hacker qui injecte du malware. Faux positif classique.
Solution rapide (sur l'écran de blocage lui-même) :
- Coche la case « I am certain this is a false positive »
- Clique « Allowlist This Action »
- Retourne dans HFCM et re-clique sur Save
Solution durable (évite de devoir allowlist à chaque édition) : Wordfence → Firewall → Manage WAF → désactive temporairement la règle « Malicious URL block » pendant que tu installes/modifies le snippet, puis réactive-la.
Whitelister Nytos dans ton plugin de sécurité
- Wordfence : Wordfence → Tools → Diagnostics → Allowlist → ajoute
https://nytos.vercel.app/ - Sucuri : Settings → Hardening → Allowed Hosts → ajoute
nytos.io - iThemes Security : en général pas de blocage par défaut. Si tu vois un warning, désactive temporairement « Content Directory Protection » pour ton thème.
- CSP strict : dans ton header
Content-Security-Policy, ajoutenytos.ioàscript-srcetconnect-src.
Alternative : self-host le snippet
Si ton équipe sécurité refuse tout script externe par principe, télécharge n.jset sers-le depuis ton propre domaine. Tu peux l'auditer ligne par ligne avant le déploiement.
# 1. Télécharge le snippet une fois curl -fSL https://nytos.vercel.app//n.js -o public/nytos.js # 2. Audite-le (ouvre dans ton éditeur) # 3. Sers-le depuis ton domaine <script src="/nytos.js" data-token="ton_token" async></script>
À noter :si tu self-hostes, tu n'auras pas les améliorations futures automatiquement. Re-télécharge la nouvelle version quand on te prévient (ou ajoute un cron de sync). Pour la solution complète automatisée, voir « Proxy first-party » ci-dessous.
Proxy first-party (bypass des bloqueurs)
Qui peut faire ça ?
Cette config nécessite que tu puisses ajouter des routes serveurà ton site. C'est une opération de développeur, pas du « copier-coller dans l'admin ».
- ✅ Tu peux : Next.js, Nuxt, SvelteKit, Express, Hono, Fastify, Cloudflare Workers, PHP custom, Rails, Django… toute stack où tu contrôles le backend.
- ❌ Tu peux pas : Shopify, WordPress.com, Wix, Webflow, Squarespace, Webador… les plateformes hébergées sans accès serveur.
Sur plateforme hébergée :l'installation standard (le snippet <script> dans le <head>) capture déjà ~85-90% des visiteurs grâce au path /api/n. C'est le meilleur taux atteignable sans accès serveur. Si la capture des derniers ~10-15% est critique, Cloudflare Worker en frontal est une alternative semi-no-code — contacte-nous pour le détail.
Les bloqueurs publicitaires (uBlock, AdGuard, Brave Shields, Safari Content Blockers, Pi-hole, NextDNS) interceptent environ 20-30% des requêtes analytics. Pour récupérer ces visiteurs, héberge un proxy first-party sur ton propre domaine. Côté navigateur, toutes les requêtes restent same-origin — les bloqueurs ne peuvent rien faire sans casser le site.
Architecture
Visiteur ↓ GET tonsite.com/nyt/n.js (ton domaine — first-party) ↓ POST tonsite.com/nyt/api/n (ton domaine — first-party) ↓ Ton serveur (Next.js) ↓ fetch https://nytos.vercel.app//api/n (server-to-server, invisible aux bloqueurs) ↓ Nytos
Étape 1 — Copie le snippet
Télécharge n.js dans le dossier public de ton app :
curl -fSL https://nytos.vercel.app//n.js -o public/nyt/n.js
Ajoute un script de sync à ton package.json pour le re-télécharger plus tard :
"scripts": {
"sync-nytos": "curl -fSL https://nytos.vercel.app//n.js -o public/nyt/n.js"
}Étape 2 — Proxy des événements
Crée app/nyt/api/n/route.ts :
import { NextRequest, NextResponse } from 'next/server'
const NYTOS_URL = 'https://nytos.vercel.app//api/n'
export async function OPTIONS() {
return new NextResponse(null, { status: 204 })
}
export async function POST(req: NextRequest) {
const body = await req.text()
const userAgent = req.headers.get('user-agent') ?? ''
const country = req.headers.get('x-vercel-ip-country') ?? ''
const upstream = await fetch(NYTOS_URL, {
method: 'POST',
headers: {
'content-type': 'text/plain',
'user-agent': userAgent,
// Forward la détection pays Vercel — sinon Nytos voit la région de ton serveur
...(country && { 'x-vercel-ip-country': country }),
},
body,
})
const responseBody = await upstream.text()
return new NextResponse(responseBody, {
status: upstream.status,
headers: {
'content-type':
upstream.headers.get('content-type') ?? 'application/json',
},
})
}Étape 3 — Proxy du heartbeat
Crée app/nyt/api/n/heartbeat/route.tsavec le même code, en changeant juste l'URL upstream :
const NYTOS_URL = 'https://nytos.vercel.app//api/n/heartbeat'
Étape 4 — Mettre à jour le snippet embarqué
Dans le <head>de tes pages, change l'URL du script :
<!-- Avant (peut être bloqué) --> <script src="https://nytos.vercel.app//n.js" data-token="..." async></script> <!-- Après (first-party, jamais bloqué) --> <script src="/nyt/n.js" data-token="..." async></script>
Le snippet calcule automatiquement son URL d'ingestion à partir de script.src. Pas d'autre modification.
Coût & performance
- ~10-20 invocations serverless / minute / visiteur actif (heartbeat 15s + flush 5s). Négligeable en trafic faible, prévois-le sur du gros trafic.
/nyt/n.jsest servi statiquement — pas d'invocation, cache CDN agressif.- Aucun secret nécessaire côté proxy. Le
data-tokenreste dans le body de la requête.
Note RGPD
Le proxy first-party contourne les bloqueurs côté navigateur, pas le droit européen. Si tu opères en UE, la mention de Nytos dans ta politique de confidentialité reste nécessaire et le consentement utilisateur peut s'appliquer selon ton cas d'usage.
Tu construis un écosystème ?
Si tu spawn des sites ou des SaaS pour tes utilisateurs et tu veux attacher Nytos automatiquement à chaque création, on a une API partenaire pour ça.
Questions ? hello@nytos.io