Capita spesso: il pannello di analytics segna mille visite in una giornata, mentre l'elaborazione dei log del server ne riporta cinquemila. Nessuno dei due numeri è «sbagliato». Misurano cose diverse, in punti diversi del percorso di una richiesta, e capire questa differenza è il primo passo per fidarsi dei propri dati.
Due punti di osservazione
Quando un browser apre una pagina succedono, in ordine, tre cose:
- il browser invia una richiesta HTTP al server;
- il server risponde con l'HTML, e quasi sempre scrive una riga nel proprio access log;
- il browser interpreta la pagina, scarica risorse ed esegue gli script, tra cui quello di analytics, che invia un segnale («hit») a un servizio di raccolta.
I log osservano il punto 2, gli analytics JavaScript il punto 3. Tutto ciò che succede tra i due, o che non arriva mai al punto 3, crea la divergenza.
Cosa vedono i log
Una riga tipica di un access log in formato combinato contiene l'IP, la data, il metodo e il percorso richiesti, il codice di stato, la dimensione della risposta, il referrer e lo user agent:
203.0.113.7 - - [12/Mar/2025:10:15:32 +0100] "GET /guida-backup/ HTTP/2.0" 200 18234 "-" "Mozilla/5.0 ..."
Da questi dati puoi ricavare:
- tutte le richieste, comprese quelle di bot, crawler, strumenti di monitoraggio e client senza JavaScript;
- errori: pagine 404, redirect 301 in catena, errori 500 che l'utente vede ma che lo script di analytics non registra perché la pagina non si carica;
- risorse non HTML: download di PDF, immagini, feed RSS, chiamate alle API.
Il limite è che i log non sanno nulla di ciò che accade dopo il caricamento: quanto l'utente scorre, se clicca un pulsante che non genera una nuova richiesta, se resta sulla pagina un secondo o dieci minuti.
Cosa vede lo script JavaScript
Lo script lato client registra solo le visite di browser che eseguono JavaScript e non bloccano il servizio di raccolta. In compenso vede ciò che i log ignorano:
- interazioni senza ricaricamento, come apertura di menu, riproduzione di un video, invio di moduli gestiti via JavaScript;
- dimensione dello schermo e caratteristiche del dispositivo;
- navigazione nelle single page application, dove il server vede una sola richiesta iniziale;
- tempo di permanenza e profondità di scorrimento, se configurati.
Perché i numeri non coincidono
| Causa | Effetto sui log | Effetto sugli analytics JS |
|---|---|---|
| Bot e crawler | Contati | Quasi sempre esclusi |
| Ad blocker e filtri privacy | Contati | Persi |
| Pagine servite dalla cache del browser o da una CDN | Spesso non registrate dall'origine | Contate |
| Utente che chiude la pagina prima che lo script parta | Contato | Perso |
| Navigazione interna in una SPA | Una sola richiesta | Più pagine viste |
Il caso della CDN merita attenzione: se il sito è servito da una rete di distribuzione, le richieste che trovano la pagina in cache non arrivano al tuo server, e i log utili sono quelli della CDN, non quelli dell'origine.
Come usarli insieme
Il modo più sano è assegnare a ciascuna fonte le domande che sa trattare meglio.
Ai log chiedi: - quali URL restituiscono errori e con quale frequenza; - quali crawler visitano il sito e quanto spesso, utile per il SEO tecnico; - quante volte vengono scaricati file non HTML; - se ci sono picchi anomali che suggeriscono abusi o scansioni.
Agli analytics JS chiedi: - come si comportano le persone sulla pagina; - quali percorsi portano a una conversione; - quali campagne generano visite che interagiscono davvero.
Nel mio lavoro trovo utile un controllo periodico: scelgo una pagina con traffico stabile e confronto le pagine viste umane stimate dai log, dopo aver filtrato bot noti e richieste di risorse, con quelle registrate dallo script. Se il rapporto resta stabile nel tempo, gli analytics sono coerenti. Se cambia all'improvviso, qualcosa si è rotto: uno script rimosso per errore, un consenso che blocca la raccolta, un nuovo bot che si spaccia per browser.
Filtrare i log in modo ragionevole
Per avvicinare i log a una stima di visite umane:
- escludi le richieste a immagini, fogli di stile, script e font;
- escludi gli user agent che si dichiarano bot, crawler o spider;
- escludi i codici di stato diversi da 200 quando conti le pagine viste;
- raggruppa le richieste ravvicinate dallo stesso IP e user agent.
Il risultato resterà una stima, ma una stima indipendente dagli ad blocker, quindi un buon termine di paragone.
In sintesi
- Log del server e analytics JavaScript osservano due momenti diversi della stessa visita.
- I log vedono tutte le richieste, bot ed errori inclusi, ma non le interazioni dopo il caricamento.
- Lo script vede il comportamento sulla pagina, ma perde chi blocca JavaScript o il servizio di raccolta.
- Confrontare periodicamente le due fonti su pagine stabili aiuta a scoprire problemi di tracciamento.