> Rispondi in italiano e scrivi in italiano anche gli eventuali commenti nel codice.
# Compito: rendere il mio sito leggibile per i motori di ricerca IA
Agisci come un ingegnere specializzato in SEO tecnica e in GEO (ottimizzazione per i motori generativi: ChatGPT Search, Claude, Perplexity, Google AI Overviews, Copilot).
## Contesto
- Sito analizzato: http://harborcyclery.example/
- Data dell'analisi: 24/09/2026
- Punteggio attuale di visibilità per l'IA: 36/100 (voto F)
- Parità persona/IA: un visitatore vede 160 parole, mentre un crawler di IA ne riceve 0 (0%).
- Titolo attuale: "Harbor Cyclery"
- Dati strutturati presenti: nessuno
## Punteggio per area
- Accesso dei crawler di IA: 83/100
- Contenuto visibile all'IA: 15/100
- Struttura e semantica: 25/100
- Dati strutturati: 14/100
- Contenuti che danno risposte: 5/100
- Aspetti tecnici: 71/100
## Con chi sono in concorrenza
Davanti alla stessa domanda, un'IA sceglie tra questi siti. I numeri vengono da un'analisi reale fatta con gli stessi criteri:
- bristolbikeworks.example: 79/100, 588 parole leggibili
- quaysidecycles.example: 55/100, 231 parole leggibili
- harborcyclery.example (il mio sito): 36/100, 0 parole leggibili
## Cosa ti chiedo di fare
Risolvi i problemi elencati qui sotto **nell'ordine in cui compaiono** (sono ordinati per impatto reale sulla possibilità che un'IA mi citi o no).
Per ogni problema:
1. Trova nel mio progetto il file o il template da cui ha origine.
2. Applica la modifica adattandola al mio stack reale (non copiare gli esempi alla lettera: usali come riferimento).
3. Spiegami in una frase cosa hai cambiato e perché.
4. Dimmi come verificare che abbia funzionato.
Lavora per fasi, non tutto insieme: prima i problemi bloccanti. Alla fine di ogni fase, riassumi cosa hai cambiato e l'esito delle verifiche, e aspetta la mia conferma prima di passare alla successiva.
Non sono riuscito a rilevare la tecnologia del sito dall'esterno. Prima di modificare qualsiasi cosa, controllala nel progetto (package.json, file di configurazione) e dimmela; se non hai accesso al codice, chiedimela e aspetta la mia risposta.
Attenzione: l'HTML servito dal sito è quasi vuoto, e molti punti dell'elenco (H1, titoli, link, HTML semantico, meta tag) possono esserne una conseguenza. Quando il contenuto arriverà renderizzato dal server, ricontrolla l'HTML servito e correggi solo ciò che non funziona ancora. Se l'elenco include la soluzione temporanea con <noscript>, saltala: con l'HTML renderizzato non serve.
Se qualcosa richiede una decisione di business (prezzi, testi commerciali, recapiti reali), non inventarla: chiedimelo.
## Bloccanti (finché non sono risolti, il resto non conta)
### 1. L'IA vede solo lo 0% del tuo sito
**Gravità:** Critica
**Cosa succede:** Una persona legge 160 parole sullo schermo; un crawler di IA ne riceve 0. La differenza è contenuto generato nel browser.
**Perché è importante:** Quando un modello decide chi citare, confronta i contenuti che è riuscito a leggere. Se gli manca metà della tua pagina, gareggi con metà dei tuoi argomenti.
**Cosa bisogna fare:**
Sposta il contenuto principale sul rendering lato server: testi, prezzi, schede prodotto, FAQ e link di navigazione. Lascia al client solo le parti interattive (carrelli, filtri, mappe).
### 2. Solo 0 parole arrivano all'IA
**Gravità:** Critica
**Cosa succede:** L'HTML restituito dal server contiene 0 parole di testo reale, contro le 160 che una persona vede sullo schermo.
**Perché è importante:** I modelli hanno bisogno di testo per ricavarne una risposta e citarti. Con meno di 300 parole hanno poco su cui lavorare.
**Cosa bisogna fare:**
Renderizza il contenuto sul server (SSR/SSG) o pre-renderizza l'HTML: l'IA deve ricevere il testo già scritto nella risposta, non un contenitore vuoto.
### 3. C'è contenuto che l'IA non arriva mai a leggere
**Gravità:** Critica
**Cosa succede:** Questi testi si vedono sullo schermo ma non sono nell'HTML che riceve un crawler:
• Bike repair in Portland
• Full service in 24 hours.
• We collect your bike from home and bring it back ready to ride.
• Gear and brake adjustment, wheel truing, lubrication and a bolt check.
• New 11 or 12-speed chain, with a check of cassette wear.
• Bleed on both brakes, new pads and lever adjustment.
• We assemble it and set it up for your size.
• Over 3,000 bikes serviced since 2016.
**Perché è importante:** GPTBot, ClaudeBot e PerplexityBot leggono l'HTML così come arriva. Non aspettano che il tuo JavaScript venga eseguito. Per loro, tutto quello che vedi sopra è letteralmente invisibile.
**Cosa bisogna fare:**
Servi quel contenuto dal server. A seconda del tuo stack:
• Next.js: usa i Server Components o getStaticProps/generateStaticParams invece di useEffect + fetch.
• Nuxt: ssr: true e useAsyncData invece di onMounted.
• SPA React/Vue pura: aggiungi il pre-rendering (vite-plugin-prerender, react-snap) o passa all'SSR.
• CMS con widget JS: sostituisci il widget con HTML statico o inserisci il testo direttamente nel contenuto.
Verifica il risultato con: curl -s http://harborcyclery.example/ | grep -i "un pezzo del testo"
<details><summary>Frammento rilevato sul sito</summary>
```
Bike repair in Portland
---
Full service in 24 hours.
---
We collect your bike from home and bring it back ready to ride.
---
Gear and brake adjustment, wheel truing, lubrication and a bolt check.
---
New 11 or 12-speed chain, with a check of cassette wear.
```
</details>
## Importanti
### 1. Manca l'intestazione H1
**Gravità:** Alta
**Cosa succede:** L'HTML grezzo non contiene nessun <h1>.
**Perché è importante:** L'H1 dice al modello qual è l'argomento principale. Senza (o con più di uno), la pagina perde il focus e il modello non sa cosa sta riassumendo.
**Cosa bisogna fare:**
Aggiungi un solo <h1> con l'argomento principale della pagina, scritto come lo direbbe un cliente.
### 2. La pagina non ha intestazioni
**Gravità:** Alta
**Cosa succede:** Nell'HTML servito non c'è nessuna intestazione H1–H6.
**Perché è importante:** Le intestazioni sono i punti in cui un modello taglia la pagina in frammenti citabili. Senza, il tuo contenuto è un muro di testo e viene citato tutto intero o per niente.
**Cosa bisogna fare:**
Struttura il contenuto con un H1 e diversi H2/H3, ognuno formulato come la domanda a cui risponde quella sezione.
### 3. Non hai dati strutturati
**Gravità:** Alta
**Cosa succede:** L'HTML non contiene nessun <script type="application/ld+json"> con schema.org.
**Perché è importante:** Il JSON-LD è la carta d'identità che un modello legge senza ambiguità: nome, servizi, prezzi, orari, valutazioni. Senza, l'IA deve tirare a indovinare partendo dal testo, sbaglia più spesso, oppure ti ignora e cita chi le ha semplificato il lavoro.
**Cosa bisogna fare:**
Aggiungi nel <head> un blocco come questo, adattando i valori alla tua attività:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "IL TUO MARCHIO",
"url": "http://harborcyclery.example",
"logo": "http://harborcyclery.example/logo.png",
"description": "Cosa fai, per chi e dove, in una frase.",
"sameAs": ["https://www.linkedin.com/company/…", "https://www.instagram.com/…"],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "hello@harborcyclery.example",
"availableLanguage": ["en"]
}
}
</script>
### 4. Il sito non usa HTTPS
**Gravità:** Alta
**Cosa succede:** http://harborcyclery.example/ è servito senza cifratura.
**Perché è importante:** Senza HTTPS perdi posizioni nei motori di ricerca classici, e diversi crawler scartano direttamente il dominio come fonte affidabile.
**Cosa bisogna fare:**
Installa un certificato TLS (Let's Encrypt è gratis), reindirizza tutto il traffico HTTP su HTTPS con un 301 e attiva HSTS.
## Miglioramenti aggiuntivi
### 1. Nessuna sitemap.xml
**Gravità:** Media
**Cosa succede:** http://harborcyclery.example/sitemap.xml non risponde e il robots.txt non ne dichiara nessuna.
**Perché è importante:** Senza sitemap, un crawler trova solo ciò che è linkato dalla home page. Le pagine più profonde, proprio quelle che rispondono a domande specifiche, non vengono mai indicizzate.
**Cosa bisogna fare:**
Genera una sitemap.xml con tutti gli URL pubblici e il loro <lastmod> reale, pubblicala su http://harborcyclery.example/sitemap.xml e dichiarala nel robots.txt con la riga:
Sitemap: http://harborcyclery.example/sitemap.xml
### 2. Nessun contenuto alternativo senza JavaScript
**Gravità:** Media
**Cosa succede:** La pagina dipende da JS e non ha un <noscript> con il contenuto essenziale.
**Perché è importante:** Mentre sistemi il rendering lato server, un <noscript> fatto bene dà all'IA almeno il testo principale invece di niente.
**Cosa bisogna fare:**
Come toppa temporanea, metti dentro <noscript> il titolo, i due o tre paragrafi chiave e i link principali. La vera correzione resta servire l'HTML già renderizzato.
### 3. Il titolo non è ottimizzato
**Gravità:** Media
**Cosa succede:** Il <title> è lungo 14 caratteri: «Harbor Cyclery».
**Perché è importante:** Il titolo è la prima cosa che un modello legge per capire di cosa parla la pagina e se risponde alla domanda dell'utente.
**Cosa bisogna fare:**
Scrivi un titolo di 50–60 caratteri nella forma «Cosa offri | Marchio», con le parole che userebbe un tuo cliente per fare la domanda a un'IA.
<details><summary>Frammento rilevato sul sito</summary>
```
Harbor Cyclery
```
</details>
### 4. Manca la meta description
**Gravità:** Media
**Cosa succede:** L'HTML non contiene <meta name="description">.
**Perché è importante:** Molti sistemi di IA usano la descrizione come riassunto di riferimento della pagina, prima ancora di leggerne il contenuto.
**Cosa bisogna fare:**
Aggiungi una descrizione di 140–160 caratteri che dica in una frase cosa fai, per chi e dove:
<meta name="description" content="…">
### 5. La pagina non usa HTML semantico
**Gravità:** Media
**Cosa succede:** Non ci sono <main>, <article>, <nav> né <header>: è tutto <div>.
**Perché è importante:** I tag semantici dicono all'estrattore quale parte è contenuto e quale è menu o piè di pagina. Senza, il tuo testo si mescola con la navigazione e il modello ti cita peggio.
**Cosa bisogna fare:**
Racchiudi il contenuto principale in <main>, ogni blocco autonomo in <article>, il menu in <nav> e il piè di pagina in <footer>. Si tratta solo di sostituire dei div con tag che hanno un significato, senza toccare gli stili.
### 6. Nessun link nell'HTML servito
**Gravità:** Media
**Cosa succede:** Il documento non contiene nessun <a href>.
**Perché è importante:** Se la navigazione è generata con JavaScript, un crawler di IA non trova il resto del tuo sito: indicizza solo questa pagina isolata.
**Cosa bisogna fare:**
Servi il menu come veri link <a href> nell'HTML, non come pulsanti con onClick.
### 7. L'IA non sa chi sei
**Gravità:** Media
**Cosa succede:** Non c'è nessuno schema di tipo Organization, LocalBusiness o Person.
**Perché è importante:** Le IA consigliano entità, non URL sparsi. Se non dichiari nome, ambito di attività e recapiti, non ti collegano né al tuo settore né alla tua città.
**Cosa bisogna fare:**
Aggiungi un blocco Organization (o LocalBusiness se ricevi i clienti in una sede fisica) con name, url, logo, description, sameAs (i tuoi profili social) e, se serve, address e areaServed.
### 8. I tuoi sottotitoli non rispondono alle domande che fa la gente
**Gravità:** Media
**Cosa succede:** La pagina non ha sottotitoli H2/H3.
**Perché è importante:** Le IA cercano il pezzo di testo che risponde alla lettera alla domanda dell'utente. Un H2 che dice «I nostri servizi» non corrisponde a niente; «Quanto costa ristrutturare un bagno a Bologna?» corrisponde a una domanda reale.
**Cosa bisogna fare:**
Riscrivi almeno 3 sottotitoli come la domanda esatta che ti farebbe un cliente e rispondi nel primo paragrafo subito sotto, in 2–3 frasi. Esempio: «## Quanto dura la ristrutturazione di un bagno?» seguito da «Dalle due alle tre settimane per un bagno standard di 5 m²…».
### 9. Manca una risposta diretta nelle prime righe
**Gravità:** Media
**Cosa succede:** La pagina inizia senza un paragrafo che riassuma di cosa parla.
**Perché è importante:** Un modello di solito cita le prime 40–60 parole che rispondono alla domanda. Se apri con riempitivi di marketing, non gli resta niente da estrarre.
**Cosa bisogna fare:**
Apri la pagina con un paragrafo di 40–70 parole che risponda alla lettera: cos'è, per chi è, quanto costa o quanto ci vuole. I fronzoli dopo.
### 10. Non hai un blocco di domande frequenti
**Gravità:** Media
**Cosa succede:** Non è stata rilevata nessuna sezione di domande frequenti.
**Perché è importante:** Una FAQ marcata è il formato domanda-risposta che i motori di ricerca IA usano direttamente: ogni coppia è una risposta pronta da servire, con il tuo marchio accanto.
**Cosa bisogna fare:**
Aggiungi 5–8 domande reali dei clienti con la loro risposta (2–4 frasi ciascuna) e marcale così:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Quanto costa il servizio?",
"acceptedAnswer": {"@type": "Answer", "text": "Da 300 € per un progetto standard…"}
}]
}
</script>
Usa le domande che ti arrivano già via email o WhatsApp: sono proprio quelle che la gente scrive all'IA.
### 11. Nessun file llms.txt
**Gravità:** Bassa
**Cosa succede:** http://harborcyclery.example/llms.txt non esiste.
**Perché è importante:** llms.txt è uno standard emergente (non tutti i motori lo usano ancora) per dire a un modello quali pagine del tuo sito contano e in che ordine leggerle. Ci vogliono dieci minuti e sarai già pronto quando si diffonderà.
**Cosa bisogna fare:**
Crea http://harborcyclery.example/llms.txt in Markdown:
# harborcyclery.example
> Una frase che dica cosa fa la tua attività e a chi si rivolge.
## Pagine principali
- [Servizi](http://harborcyclery.example/services): cosa offri, esattamente.
- [Prezzi](http://harborcyclery.example/pricing): tariffe e piani.
- [Contatti](http://harborcyclery.example/contact): come lavorare con te.
### 12. Mancano metadati Open Graph
**Gravità:** Bassa
**Cosa succede:** Tag mancanti: og:title, og:description, og:image.
**Perché è importante:** Diversi assistenti usano Open Graph come riassunto veloce quando mostrano il tuo link dentro una risposta.
**Cosa bisogna fare:**
Aggiungi nel <head>:
<meta property="og:title" content="…">
<meta property="og:description" content="…">
<meta property="og:image" content="http://harborcyclery.example/cover.jpg">
<meta property="og:url" content="http://harborcyclery.example/">
<meta property="og:type" content="website">
### 13. Manca la scheda di anteprima per i tuoi link
**Gravità:** Bassa
**Cosa succede:** Non è stato trovato nessun <meta name="twitter:card">.
**Perché è importante:** Quando qualcuno incolla il tuo link su X, Slack, WhatsApp o Discord, senza scheda compare come una riga di testo grigio che nessuno clicca. Con un'immagine occupa dieci volte lo spazio e viene condiviso molto di più.
**Cosa bisogna fare:**
Aggiungi nel <head>:
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="…">
<meta name="twitter:description" content="…">
<meta name="twitter:image" content="http://harborcyclery.example/twitter-image.png">
L'immagine deve essere di 1200×630 px. Con Next.js puoi generarla dal codice con un file opengraph-image.tsx e uno twitter-image.tsx, così non diventa mai obsoleta.
### 14. Manca l'URL canonico
**Gravità:** Bassa
**Cosa succede:** La pagina non dichiara nessun <link rel="canonical">.
**Perché è importante:** Senza canonical, lo stesso contenuto servito su più URL (con e senza www, con parametri, in http e https) conta come pagine diverse e la tua autorevolezza si divide tra tutte.
**Cosa bisogna fare:**
Aggiungi nel <head>: <link rel="canonical" href="http://harborcyclery.example/">
### 15. Pochi contenuti in elenchi o tabelle
**Gravità:** Bassa
**Cosa succede:** La pagina ha solo 0 voci di elenco e 0 tabelle.
**Perché è importante:** Elenchi e tabelle sono il formato che un modello copia con più fedeltà, perché arrivano già divisi in unità confrontabili (prezzi, passaggi, caratteristiche).
**Cosa bisogna fare:**
Trasforma in elenchi i passaggi del tuo processo e ciò che include ogni servizio, e in tabella il confronto tra piani o prezzi. Si tratta solo di riformattare quello che hai già scritto.
### 16. Il contenuto non offre dati concreti
**Gravità:** Bassa
**Cosa succede:** In tutta la pagina ci sono solo 0 cifre con un'unità di misura.
**Perché è importante:** Le IA preferiscono citare affermazioni verificabili. «Siamo leader del settore» non si può citare; «consegniamo in 48 ore e l'installazione costa 149 €» sì, e il dato si porta dietro il tuo marchio.
**Cosa bisogna fare:**
Aggiungi numeri reali: prezzi di partenza, tempi di consegna, anni di esperienza, numero di progetti, percentuali di risparmio. Un dato per sezione.
### 17. Il contenuto sembra datato
**Gravità:** Bassa
**Cosa succede:** Non ci sono date né riferimenti all'anno in corso.
**Perché è importante:** Tra due fonti che dicono la stessa cosa, i motori di ricerca IA citano quella che dimostra di essere recente. Una pagina senza riferimenti temporali viene considerata vecchia.
**Cosa bisogna fare:**
Rivedi e aggiorna il contenuto, mostra sulla pagina la data dell'ultima revisione e aggiorna "dateModified" nel JSON-LD. Se i tuoi dati cambiano poco, scrivi comunque «Aggiornato al 2026» dove è vero, e mai se non l'hai rivisto. Pagina analizzata: /
### 18. L'HTML viene inviato senza compressione
**Gravità:** Bassa
**Cosa succede:** La risposta non include l'header Content-Encoding.
**Perché è importante:** La compressione riduce l'HTML del 70–80%. Meno byte significa meno tempo di download per pagina, e più pagine del tuo sito scansionate con lo stesso budget.
**Cosa bisogna fare:**
Attiva gzip o brotli sul tuo server (Nginx: gzip on; Apache: mod_deflate) oppure mettiti dietro una CDN che lo faccia per te.
## Contenuto che oggi l'IA non riesce a leggere
Questi testi si vedono nel browser ma NON sono nell'HTML restituito dal server. Assicurati che, alla fine, compaiano tutti nell'HTML iniziale:
- "Bike repair in Portland"
- "Full service in 24 hours."
- "We collect your bike from home and bring it back ready to ride."
- "Gear and brake adjustment, wheel truing, lubrication and a bolt check."
- "New 11 or 12-speed chain, with a check of cassette wear."
- "Bleed on both brakes, new pads and lever adjustment."
- "We assemble it and set it up for your size."
- "Over 3,000 bikes serviced since 2016."
- "A fixed quote before we touch anything."
- "Six-month guarantee on every repair."
## Come creare l'immagine che si vede quando il link viene condiviso
Il tuo link ha bisogno di un'immagine di 1200×630 px per Open Graph (Facebook, LinkedIn, WhatsApp, Slack) e di una per la Twitter Card (X). Può essere lo stesso file.
**Se il progetto usa Next.js (App Router), generale dal codice**, così non diventano mai obsolete. Crea `app/opengraph-image.tsx`:
```tsx
import { ImageResponse } from "next/og";
export const alt = "Harbor Cyclery";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
export default function Image() {
return new ImageResponse(
(
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
justifyContent: "center",
padding: "80px",
// Un gradiente in diagonale dà profondità senza bisogno di immagini.
background: "linear-gradient(135deg, #0b1020 0%, #1b1038 60%, #2a1458 100%)",
color: "#ffffff",
fontFamily: "sans-serif",
}}
>
<div style={{ fontSize: 26, opacity: 0.75 }}>harborcyclery.example</div>
<div style={{ marginTop: 32, fontSize: 64, fontWeight: 700, lineHeight: 1.08, letterSpacing: -2 }}>
LA TUA FRASE PRINCIPALE, LA STESSA DEL TITOLO H1
</div>
<div style={{ marginTop: 34, fontSize: 28, color: "#c4b5fd", maxWidth: 940 }}>
Una riga di supporto: cosa offri e a chi.
</div>
</div>
),
size,
);
}
```
Poi crea `app/twitter-image.tsx` che riesporta la stessa cosa, così le due schede coincidono:
```tsx
export { default, alt, size, contentType } from "../opengraph-image";
```
A quel punto Next genera da solo i tag `og:image` e `twitter:image`. Imposta `metadataBase: new URL("https://TUO-DOMINIO")` nel root layout perché gli URL escano assoluti: quelli relativi li ignorano quasi tutti i crawler.
**Se il progetto non usa Next.js**, esporta un PNG 1200×630 sotto 1 MB, mettilo in `/og-image.png` e dichiara i tag a mano:
```html
<meta property="og:title" content="…">
<meta property="og:description" content="…">
<meta property="og:image" content="https://TUO-DOMINIO/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="https://TUO-DOMINIO/">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="…">
<meta name="twitter:description" content="…">
<meta name="twitter:image" content="https://TUO-DOMINIO/og-image.png">
```
Le regole che fanno la differenza:
- Esattamente 1200×630 px. Le altre proporzioni vengono ritagliate e il testo si perde.
- Leggibile in miniatura: la frase a 60 px o più, tre righe al massimo.
- L'immagine ripete la promessa della pagina. Non è un logo su uno sfondo.
- URL assoluti e con il protocollo. Un percorso relativo fallisce senza avvisare.
- Sotto 1 MB, in PNG o JPEG. Il WebP non lo leggono ancora tutti gli scraper.
- Controllala su https://cards-dev.twitter.com/validator e incollando il link in una chat di Slack o WhatsApp con te stesso.
## Come verificare che sia risolto
Quando hai finito, esegui questi controlli e mostrami il risultato:
```bash
# 1. Questo è LETTERALMENTE ciò che vede un crawler di IA (senza eseguire JavaScript).
curl -sL "http://harborcyclery.example/" | sed 's/<script[^>]*>.*<\/script>//g; s/<[^>]*>//g' | tr -s ' \n' | head -60
# 2. Il server non deve bloccare i bot di IA (tutti devono restituire 200).
curl -sL -o /dev/null -w "OAI-SearchBot: %{http_code}\n" -A "OAI-SearchBot" "http://harborcyclery.example/"
curl -sL -o /dev/null -w "Claude-SearchBot: %{http_code}\n" -A "Claude-SearchBot" "http://harborcyclery.example/"
curl -sL -o /dev/null -w "PerplexityBot: %{http_code}\n" -A "PerplexityBot" "http://harborcyclery.example/"
# 3. robots.txt non deve contenere un Disallow che riguardi questi agenti.
curl -s "http://harborcyclery.example/robots.txt"
```
L'obiettivo è che il testo del punto 1 contenga tutto il contenuto importante della pagina. Se lì non compare, per l'IA non esiste.
---
Report generato da Tarsier · http://harborcyclery.example/ · 36/100