Vai al contenuto

Il “Contenuto Fantasma”: Perché Google ignora quello che carichi al Click.

Se gestisci un sito moderno come magari un e-commerce con schede prodotto che si aprono in modale (una finestra a parte caricata dinamicamente), un blog con tab che si attivano a richiesta, o una Single Page Application (SPA) complessa fermati un istante. C’è un’alta probabilità che Google non stia indicizzando una parte cruciale del tuo contenuto.

Questo è uno dei problemi architetturali più sottovalutati e, paradossalmente, più diffusi nel 2025 e dibatturi anche nel 2026. Il vero corto circuito informativo è che Google lo dichiara esplicitamente nella sua documentazione ufficiale, ma molti sviluppatori e SEO specialist continuano a ignorarlo, vittime di quello che in psicologia cognitiva si chiama “bias di conferma”: se io lo vedo sul mio schermo, allora esiste.

In questo articolo dissezioniamo la Fake News #3 L’illusione del “Buffet Servito”, analizzando il comportamento di Googlebot a livello di codice per capire perché, agli occhi del motore di ricerca, il tuo sito potrebbe essere “vuoto a metà”.

Il Problema: Contenuti che esistono solo “su richiesta”

Immagina un sito di abbigliamento. L’utente clicca su “Dettagli” in una scheda prodotto e un JavaScript carica dinamicamente le specifiche tecniche (materiale, peso, istruzioni di lavaggio). L’utente vede tutto. L’esperienza è fluida. Ma Google? Google non vede nulla di tutto questo.

Oppure prendiamo un blog con una sezione a schede (Tabs). Il contenuto principale è visibile, ma quando clicchi sulla tab “FAQ” o “Prodotti Correlati”, viene iniettato nuovo HTML tramite JavaScript. Ancora una volta: per l’utente è tutto lì. Per Google, quel contenuto non è mai arrivato.

Perché succede? Perché c’è una regola d’oro nell’architettura dei crawler che viene spesso dimenticata: Googlebot non è un utente. Googlebot non ha le mani.

Come Funziona Googlebot Davvero (La Documentazione)

Per comprendere l’errore, dobbiamo guardare sotto il cofano del WRS (Web Rendering Service) di Google. Secondo la guida ufficiale Understand JavaScript SEO Basics (aggiornata a Dicembre 2025) e gli studi di reverse-engineering come quelli di Vercel & MERJ, il processo avviene in tre fasi distinte:

  1. Crawl (La richiesta): Googlebot effettua una richiesta HTTP GET e legge l’HTML “grezzo” che il server restituisce.
  2. Render (L’esecuzione): Google mette la pagina in una coda (la famosa Render Queue). Quando le risorse sono disponibili (possono passare secondi o ore), esegue il JavaScript utilizzando una versione headless di Chromium (il motore di Chrome, ma senza interfaccia grafica).
  3. Index (L’archiviazione): Google usa l’HTML renderizzato (il DOM statico che emerge dopo l’esecuzione automatica del JS) per indicizzare la pagina.

Il punto critico (Didattico)

Qui nasce l’equivoco. Molti pensano che “Renderizzare” significhi “Simulare un utente che naviga”. Falso. Il rendering di Googlebot esegue il JavaScript che parte al caricamento della pagina (onload, onmount). Google non esegue click, non fa scroll infiniti, non fa hover col mouse e non interagisce con l’interfaccia.

È scritto nero su bianco nella documentazione: “If content is not visible in the rendered HTML, Google won’t be able to index it.” (Se il contenuto non è visibile nell’HTML renderizzato, Google non sarà in grado di indicizzarlo.)

Analisi del Codice: Quando il Rendering fallisce

Vediamo tre scenari reali, analizzati a livello di codice, dove il contenuto diventa invisibile (Fantasma).

1. Il contenuto caricato al Click (Anti-Pattern)

Questo è l’errore più comune. Il contenuto viene chiamato via API solo quando l’utente compie un’azione esplicita.

// ❌ QUESTO CODICE È INVISIBILE PER LA SEO
// L'evento 'click' è il trigger necessario
document.getElementById('btn-dettagli').addEventListener('click', function() {
  fetch('/api/dettagli-prodotto/' + productId)
    .then(res => res.json())
    .then(data => {
      // Questo HTML viene iniettato solo se qualcuno clicca
      document.getElementById('pannello-dettagli').innerHTML = data.html;
    });
});

L’analisi: Quando Googlebot renderizza la pagina, carica il DOM ed esegue gli script iniziali. Tuttavia, poiché Googlebot non clicca sul pulsante #btn-dettagli, la funzione fetch non parte mai. Il div di destinazione rimane vuoto. Per Google, i dettagli del prodotto non esistono.

2. Lazy-Loading Aggressivo

Se usi un lazy-loading che carica il contenuto solo quando l’elemento entra nel viewport, c’è un rischio concreto. Googlebot ridimensiona il viewport (spesso simulando un dispositivo mobile molto alto), ma non fa uno scroll “umano”. Se il contenuto è troppo in basso o richiede uno scroll specifico per attivare il trigger JS, potrebbe rimanere escluso dal rendering.

3. Shadow DOM non proiettato

Se utilizzi Web Components con Shadow DOM in modalità “closed” o senza usare correttamente gli <slot>, il contenuto rimane incapsulato in una “bolla” che il crawler potrebbe non penetrare o associare correttamente al documento principale.

Cosa cerca un Tool di Analisi Tecnico (Come SEO Radar)

Qui entra in gioco la differenza tra un tool SEO generico e uno strumento di diagnostica tecnica. Fare questa verifica manualmente per ogni pagina è impossibile. Un tool moderno deve replicare lo stack tecnologico del crawler:

  1. Fetch via cURL: Scarica l’HTML grezzo (Server-Side) per vedere cosa arriva prima del JS.
  2. Rendering via Playwright/Puppeteer: Simula un browser headless che esegue il JS, attende il network idle, ma non clicca.
  3. Confronto Differenziale: Sovrappone i due stati.

Ecco l’output che dovresti cercare in un’analisi tecnica:

Stato A: HTML Grezzo (Server Response)

<div id="tab-contents"></div>

Qui il contenuto non c’è ancora.

Stato B: DOM Renderizzato (Googlebot View) Se il codice è scritto bene, dopo l’esecuzione automatica del JS, il tool deve vedere questo:

<div id="tab-contents">
  <div class="tab">Contenuto Tab 1</div> </div>

Il tool ti dirà: “✓ Contenuto iniettato via JS rilevato. Indicizzabile.”

Stato C: DOM Renderizzato Incompleto (Il problema) Se l’API è lenta o il contenuto dipende da un click che il bot non ha fatto:

<div id="tab-contents">
  </div>

In questo caso, il tool deve lanciare un allarme: “⚠️ Contenuto assente nel DOM renderizzato. Rischio deindicizzazione.”

La Soluzione: Come scrivere codice “Google-Friendly”

Non devi rinunciare a JavaScript. Devi solo cambiare il momento in cui il contenuto viene caricato. Google suggerisce due strade principali:

1. Server-Side Rendering (SSR) o Static Generation (SSG)

La soluzione aurea. Il server invia l’HTML già completo. Il contenuto delle tab o dei modali è già nel codice sorgente, magari nascosto via CSS (display: none), ma presente semanticamente.

2. Client-Side Rendering all’inizializzazione

Se devi usare il rendering lato client, assicurati che il fetch dei dati avvenga al montaggio del componente, non all’evento click.

// ✅ CORRETTO: Il contenuto si carica automaticamente (Google lo vede)
useEffect(() => {
  // Parte subito, senza bisogno di click
  fetch(`/api/prodotto/${productId}`)
    .then(res => res.json())
    .then(data => setDettagli(data));
}, [productId]);

Nel primo caso, Googlebot esegue la pagina, attende il fetch e vede il contenuto. Nel secondo caso (l’anti-pattern visto prima), il contenuto resta per sempre in un limbo digitale.

Checklist Operativa: Cosa Fare Adesso

Se sospetti che il tuo sito abbia contenuti “nascosti”, ecco il piano d’azione pratico:

  1. Audit con il “Controllo URL”: Usa la Google Search Console. Inserisci un URL, clicca su “Testa URL Pubblicato” e poi su “Visualizza Pagina Testata” -> “HTML”. Cerca nel codice il testo che temi non venga visto (es. “Istruzioni lavaggio”). Se non c’è nel codice HTML della GSC, Google non lo vede.
  2. Identifica le Priorità: Se mancano le recensioni, è grave ma passabile. Se manca la descrizione del prodotto o i link ai prodotti correlati, è un’emergenza SEO.
  3. Risolvi i contenuti critici:
    • Prodotti principali? Sposta i dettagli in SSR.
    • FAQ nascoste? Pre-caricale nel DOM iniziale (anche se nascoste visivamente).
    • Navigazione interna? Assicurati che i link siano veri <a href> e non eventi onclick.

Conclusione: L’importanza di vedere l’invisibile

Nel 2025, affidarsi alla sola ispezione visiva (“Il sito è bello, funziona”) è un suicidio SEO. Googlebot è un software cieco alle interazioni umane. Se il tuo contenuto è nascosto dietro un click, un hover o uno scroll, statisticamente è molto probabile che Google non lo stia indicizzando.

La soluzione non è tornare all’HTML statico del 1999. È usare JavaScript con intelligenza architetturale: carica i contenuti critici subito e verifica sempre il DOM Renderizzato, non quello visivo.

In SEO Radar Italia, il nostro obiettivo non è darti un bollino verde facile. È mostrarti esattamente queste discrepanze tecniche tra HTML Grezzo e Renderizzato. Perché il tuo posizionamento dipende da ciò che Google vede davvero, non da ciò che speri che veda.

Fonti Ufficiali e Approfondimenti Accademici

Google Search Central: “Understand JavaScript SEO Basics” (Dec 2025) La guida definitiva su come Google processa (e non processa) gli eventi JS. Link alla documentazione ufficiale

Vercel & MERJ Research: “Javascript SEO: How Google Crawls, Renders & Indexes JS” (2024) Uno studio empirico su oltre 100.000 fetch che conferma: il 100% delle pagine viene renderizzato, ma il contenuto post-click viene sistematicamente ignorato. Link allo studio Vercel

Google Search Central: “URL Inspection Tool” Come usare lo strumento ufficiale per vedere lo screenshot e l’HTML renderizzato da Googlebot. Guida allo Strumento Controllo URL