Riferimento completo di tutti i 32 analyzer e 328 controlli che alimentano l'analisi SEO di SiteScan.
Server configuration, HTTP protocols, encoding, responsive design
Identifies pages returning 4xx (client errors) and 5xx (server errors) HTTP status codes, and maps which internal pages link to them.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | HTTP 5xx server error pages |
W01 |
WARNING | HTTP 4xx client error pages (404, 403, etc.) |
I01 |
INFO | Pagine HTTP 410 Gone: rimozioni intenzionali, riportate come informazione e non contate come errori o avvisi |
I02 |
INFO | Pagine che non hanno inviato nessuna risposta HTTP (connessione rifiutata, timeout, errore DNS o TLS): stato sconosciuto, riportate come informazione e non contate come errori o avvisi |
I03 |
INFO | Cloudflare email-obfuscation links (/cdn-cgi/l/email-protection): a 4xx for a crawler but resolved by Cloudflare's JavaScript in a real browser, so not a broken link. Reported as information and not counted |
Detects pages that return HTTP 200 but behave like error pages (soft 404s) using multi-signal scoring: reference matching, phrase detection, and statistical anomaly.
| Code | Severity | Description |
|---|---|---|
W01 |
WARNING | Page detected as soft 404 (score above threshold) |
W02 |
WARNING | A livello di sito: gli URL inesistenti non restituiscono 404 (reindirizzati alla homepage o a un altro URL, oppure serviti con HTTP 200), rilevato con un URL di prova casuale |
Analyzes HTTP redirect chains, detecting excessive hops, external redirects, and structural link rot from internal pages pointing to redirected URLs.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Redirect chain exceeds 5 hops (Google recommended max) |
W01 |
WARNING | Redirect detected (1-5 hops) |
W02 |
WARNING | Problematic redirect: internal referrers point to different final URL |
W03 |
WARNING | External redirect: final URL on different domain |
W04 |
WARNING | Host canonicalization missing: www and non-www both serve content on different hosts (no 301 between them) |
Comprehensive character encoding analysis: missing charset declarations, mismatches between HTTP and HTML charset, mojibake patterns, BOM presence, and double-encoding.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | No charset declaration found (HTTP or HTML) |
E02 |
ERROR | HTTP Content-Type charset differs from HTML meta charset |
E03 |
ERROR | U+FFFD replacement characters detected in content |
E04 |
ERROR | Mojibake patterns detected (UTF-8 misread as Latin-1/CP1252) |
E05 |
ERROR | Encoding corruption in SEO fields (title, description, H1) |
E06 |
ERROR | Invalid or unrecognized charset name |
W01 |
WARNING | Non-UTF-8 charset declared |
W02 |
WARNING | UTF-8 BOM present |
W03 |
WARNING | Double-encoded UTF-8 detected |
W04 |
WARNING | NBSP mojibake pattern detected |
W05 |
WARNING | Charset declared only in HTML meta, not HTTP header |
Analyzes robots.txt format, directives, and effectiveness. Checks for missing or malformed files, overly restrictive rules, sitemap presence, and crawl budget impact.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Invalid format: RTF, HTML, PDF, XML, or binary content |
E02 |
ERROR | UTF-8 BOM present in robots.txt |
E03 |
ERROR | Wrong Content-Type (not text/plain) |
E04 |
ERROR | HTTP error response (4xx/5xx) |
E05 |
ERROR | Blocks all crawlers (Disallow: / for *) |
W01 |
WARNING | Missing robots.txt file |
W02 |
WARNING | Empty robots.txt file |
W03 |
WARNING | File too large (>500 KiB, Google truncates) |
W04 |
WARNING | Blocks major crawlers (Googlebot, Bingbot, GPTBot, ClaudeBot) |
W05 |
WARNING | Sitemap trovata in una posizione standard ma non dichiarata nel robots.txt |
W06 |
WARNING | Restrictive crawl budget (<0.5 pages/day) |
W07 |
WARNING | Risorse statiche (/images/, /css/, /js/, /static/, /assets/) bloccate per un motore di ricerca che renderizza le pagine (il gruppo *, Googlebot o Bingbot) senza una regola Allow di deroga — può compromettere il rendering delle pagine per la ricerca |
W08 |
WARNING | Orphaned rules (before any User-agent) |
W09 |
WARNING | Deprecated noindex directive |
W10 |
WARNING | Indirizzo della sitemap che non è un URL http(s) completo (relativo, o con un altro schema): in una riga Sitemap del robots.txt o in un indice di sitemap. I motori lo ignorano; se robots.txt ha solo righe così, la sitemap si cerca a ciascun indirizzo relativo e poi nei percorsi standard |
W11 |
WARNING | Nessuna sitemap dichiarata nel robots.txt e nessuna trovata nelle posizioni standard (sitemap.xml, sitemap_index.xml, wp-sitemap.xml, ...): la sitemap non è individuabile, il che non prova che non esista |
W12 |
WARNING | La sitemap pubblicata omette intere sezioni o lingue del sito: il crawl ha pagine indicizzabili e raggiungibili in una sezione (es. una lingua come /en/) che ha zero URL nella sitemap, mentre altre sezioni sono coperte. I motori di ricerca devono allora trovare quelle pagine solo tramite i link |
I12 |
INFO | Sitemap in attesa di pubblicazione: pagine scansionate ora ma assenti dalla sitemap pubblicata, già incluse nella sitemap generata da questa scansione. Non conteggiato |
W13 |
WARNING | Sitemap declared or found but unreachable |
W14 |
WARNING | XML della sitemap malformato (senza <urlset> né <sitemapindex>, e non è un feed RSS o Atom, che si leggono come sitemap) |
W15 |
WARNING | Sitemap URLs that return 4xx/5xx |
W16 |
WARNING | Sitemap incompleta: pagine scansionate che mancano dalla sitemap pubblicata, con la percentuale delle pagine da mettere in sitemap che vi compaiono (non contano gli indirizzi con parametri, le pagine lasciate fuori di proposito e le pagine 2, 3... degli elenchi; le pagine già nella sitemap generata dalla scansione sono indicate a parte e da sole non fanno scattare l'avviso) |
W17 |
WARNING | La maggior parte delle date lastmod della sitemap è più vecchia del numero di anni configurato, oppure alcune sono date segnaposto di prima che esistesse il web (come 1970-01-01) |
I18 |
INFO | All sitemap URLs share the same <priority> (Google ignores the field) |
I19 |
INFO | All sitemap URLs share the same <changefreq> (Google ignores the field) |
I20 |
INFO | Sitemap index coverage: child sitemaps read, skipped and failed (W16 and I12 are not evaluated when coverage is partial) |
I21 |
INFO | Risorse statiche bloccate solo per crawler AI / tool SEO (GPTBot, ClaudeBot, Ahrefs, Semrush, ...), mentre i motori di ricerca principali (il gruppo *, Googlebot, Bingbot) possono comunque scaricarle — di solito una scelta deliberata, non un problema di rendering per la SEO. Non conteggiato |
Checks viewport meta tag presence and configuration for mobile-friendly design. Detects missing viewports, disabled zoom, fixed-width layouts, and inconsistent viewport coverage.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Missing viewport meta tag |
W01 |
WARNING | Viewport issues (user-scalable=no, fixed width, missing initial-scale) |
W02 |
WARNING | Partial viewport coverage: inconsistent across pages |
W03 |
WARNING | Missing apple-touch-icon (only when require_touch_icon is enabled; off by default) |
Detects meta robots directives (noindex, nofollow) and meta refresh redirects across all pages. Flags critical issues like noindex on homepage, sitemap conflicts, and HTML-level redirects.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Homepage has noindex (entire site may be deindexed) |
E02 |
ERROR | Page in sitemap.xml has noindex (conflicting signals) |
E03 |
ERROR | Homepage uses meta refresh redirect (should use HTTP 301) |
E04 |
ERROR | Page has meta refresh with delay > 0 (accessibility + SEO issue) |
E05 |
ERROR | URL disallowed in robots.txt but has meta noindex — conflicting signals, Google cannot see noindex and may index URL without snippet |
W01 |
WARNING | Non-homepage page has noindex directive |
W05 |
WARNING | Page has instant meta refresh (delay=0) — should use HTTP 301 |
W06 |
WARNING | Meta refresh redirects to external domain |
W07 |
WARNING | Meta refresh target differs from canonical URL |
I02 |
INFO | Pagine con direttiva robots nofollow: i motori di ricerca non seguono i loro link in uscita (spesso voluto, riportato come informazione) |
Per-URL analysis of HTTP response headers captured by the crawler: cookie security flags, server fingerprint, X-Frame-Options / X-Content-Type-Options / HSTS coverage across all pages, ETag inode leak, TTFB statistics. Complements 014 (homepage-only score) with site-wide coverage.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Cookie set on HTTPS page without Secure flag (MITM cookie theft) |
W01 |
WARNING | Cookie without HttpOnly flag (XSS cookie theft) |
W02 |
WARNING | Cookie without SameSite attribute (CSRF risk) |
W03 |
WARNING | Server banner exposes version (fingerprint) |
W04 |
WARNING | X-Powered-By header leaks backend stack |
W05 |
WARNING | Missing X-Frame-Options header (per-URL) |
W06 |
WARNING | Missing X-Content-Type-Options: nosniff (per-URL) |
W07 |
WARNING | Missing Strict-Transport-Security on HTTPS URL (per-URL) |
W08 |
WARNING | ETag exposes Apache inode number (fingerprint) |
I01 |
INFO | Distribuzione dei banner del server: quali valori dell'header Server restituisce il sito sugli URL scansionati |
I02 |
INFO | Statistiche TTFB: mediana, p90 e p99 del tempo al primo byte sugli URL scansionati, con gli URL più lenti |
I03 |
INFO | Contenuti non aggiornati: URL con header Last-Modified più vecchio della soglia configurata (in giorni) |
Verifies that the cookie banner (CMP) actually gates Google Tag Manager, gtag and other marketing tags: known CMP vendor detection, script order and Consent Mode v2 defaults, Cookie-Script account configuration, double-loading through GTM, site-wide coverage — plus a runtime check with a headless browser proving whether Google tag hits carry consent state.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Google/marketing tags are present but no consent banner (CMP) was detected, neither in the pages nor inside the GTM container — tracking runs without user consent |
E02 |
ERROR | Script della CMP caricato DOPO lo snippet del tag Google, senza un consenso predefinito inline prima: il predefinito arriva tardi e il Consent Mode non ha effetto sulle prime richieste. Il rilievo dice se il controllo col browser l'ha confermato in homepage; se il controllo ha visto il consenso funzionare, il rilievo è W16 |
E03 |
ERROR | The "Google Consent Mode" option is disabled in the Cookie-Script account configuration — the banner is shown but sends no consent signals to Google tags |
E04 |
ERROR | Runtime proof (headless browser on the homepage): Google tags fired without any Consent Mode state (no gcs parameter) — the banner does not gate the tags |
E05 |
ERROR | Consent probe (pagina caricata senza accettare il banner): il tag Google è partito senza alcuno stato di consenso, quindi il Consent Mode non è applicato, né Base né Avanzato |
E06 |
ERROR | Banner probe a runtime (pagina caricata due volte, consenso rifiutato e poi accettato): non compare alcun banner cookie, eppure i tag Google partono, quindi i visitatori vengono tracciati senza che venga chiesto loro nulla. Esclude anche un banner sviluppato in proprio senza firma riconoscibile |
E07 |
ERROR | Struttura del container GTM, segnalata solo con prove di stato di consenso mancante (storico notturno recente o scansione in corso): la CMP è caricata da un tag HTML personalizzato o da un template del fornitore che non imposta il consenso predefinito, nessun tag del container lo imposta prima del primo tag Google e quel tag parte su un evento di pagina standard. Il predefinito arriva solo dopo lo script esterno e il tag Google gareggia con lui |
E08 |
ERROR | Consent probe (homepage caricata senza accettare il banner): il primo hit Google riportava già ad_storage e/o analytics_storage CONCESSI prima di qualsiasi interazione. Il banner non controlla quei segnali: il predefinito è concesso, oppure lo strumento di consenso li concede al caricamento |
E09 |
ERROR | Controllo runtime: una richiesta dello strumento di consenso è fallita in homepage (script o configurazione dell'account 404/403, errore di rete, bloccata dalla Content Security Policy). Il sito ha uno strumento di consenso, ma in produzione è rotto: va sistemata l'installazione |
W01 |
WARNING | The CMP is loaded twice: once inside the GTM container and once standalone in the page (double banner, conflicting consent states possible) |
W02 |
WARNING | The CMP script precedes the Google tag but is loaded with async/defer — execution order not guaranteed, tags may fire before the consent default is set |
W03 |
WARNING | The inline consent default lacks the Consent Mode v2 signals ad_user_data and ad_personalization (required since March 2024) |
W04 |
WARNING | A marketing tag is hardcoded in the page without any CMP blocking mechanism — it runs regardless of consent |
W05 |
WARNING | The CMP script is present on part of the site but missing on some pages — no banner is shown there and tags run ungated |
W06 |
WARNING | More than one CMP detected on the site — two banners can appear and their consent states conflict |
W07 |
WARNING | Google tags are present and no CMP was detected in the pages; the GTM container could not be checked, so verify manually that a consent banner exists |
W08 |
WARNING | A cookie banner-like markup was found but it matches no known CMP (custom banner) — static analysis cannot verify it gates the tags |
W09 |
WARNING | The very same CMP script file is included more than once in the page markup (duplicate initialization possible) |
W10 |
WARNING | Banner probe a runtime: il banner cookie c'è ma i tag Google non riportano alcuno stato di consenso, quindi il banner non è collegato al Google Consent Mode. La soluzione è attivare il Consent Mode nello strumento di consenso esistente, non installare un nuovo banner |
W11 |
WARNING | Consent probe: Consent Mode Base, nessuna richiesta raggiunge Google fino al consenso, quindi chi rifiuta non viene misurato affatto |
W12 |
WARNING | Gli script hanno attributi di blocco della CMP (data-cookiescript, data-cookiecategory, ...) ma nessuna CMP viene caricata, né nelle pagine né nel container GTM: un residuo di uno strumento di consenso rimosso o rotto, quegli script partono comunque |
W13 |
WARNING | Struttura del container GTM: un tag Google parte su Consent Initialization, l'evento riservato all'impostazione del consenso predefinito; segnalato solo con prove di stato di consenso mancante |
W14 |
WARNING | Storico notturno: nelle ultime 14 notti il primo hit Google aveva lo stato del Consent Mode in alcune notti e in altre no: il predefinito non è garantito prima del tag Google (una gara) |
W15 |
WARNING | Il consenso predefinito imposta un wait_for_update poco plausibile: sotto i 100 ms (il valore è in millisecondi, quindi l'attesa finisce prima che lo strumento di consenso risponda) o sopra i 10 s (i tag Google trattengono il primo hit per tutto quel tempo) |
W16 |
WARNING | Script della CMP caricato DOPO lo snippet del tag Google, senza un consenso predefinito inline prima, ma il controllo col browser ha visto il consenso funzionare in homepage (solo un ping senza cookie, oppure nessuna richiesta fino al consenso): dipende dai tempi di caricamento, quindi l'ordine va corretto comunque |
I02 |
INFO | GTM installato senza l'iframe di riserva <noscript> (riguarda solo i visitatori senza JavaScript) |
I03 |
INFO | CMP caricata solo tramite il container GTM: l'analisi statica non può verificare che parta con l'attivatore Consent Initialization |
I04 |
INFO | Più ID di container GTM nella pagina (a volte voluto, ma i container duplicati fanno scattare i tag due volte) |
I05 |
INFO | The Cookie-Script account configuration could not be fetched, or its "Google Consent Mode" state could not be determined |
I06 |
INFO | Cookie-Script "Google Consent Mode" option verified as enabled |
I07 |
INFO | Cookie-Script account option disabled, but the CMP loads through the official GTM template which sets the consent defaults itself |
I08 |
INFO | Runtime check passed: Google tag hits carry Consent Mode state (gcs parameter present) |
I09 |
INFO | Consent probe: con il banner non accettato il tag Google invia comunque un ping senza cookie (Consent Mode avanzato, che è anche l'impostazione predefinita di GTM) |
I10 |
INFO | Controllo runtime: rilevato un banner cookie in homepage (confronto fra la pagina con consenso rifiutato e con consenso accettato, quindi anche i banner sviluppati in proprio) |
I11 |
INFO | Sequenza temporale delle richieste a runtime: le richieste rilevanti per il consenso in ordine cronologico (documento, script della CMP, caricatori GTM/gtag, hit Google), così "Google ha ricevuto dati prima del consenso" è una sequenza osservata, non una deduzione |
I13 |
INFO | La CMP è presente: il browser headless ha visualizzato il suo banner, ma nell'HTML statico non è stato riconosciuto nessuno script del fornitore (spesso lo carica GTM) |
I14 |
INFO | Banner cookie che non corrisponde a nessuna CMP nota, con i tag Google che a runtime partono con lo stato del Consent Mode |
I15 |
INFO | Tag Google visto solo a runtime: nessun caricatore GTM/gtag nell'HTML statico (incluso in un bundle o iniettato da un plugin), il browser headless l'ha visto caricare. I controlli statici sull'ordine di caricamento non si applicano, quelli a runtime sì |
I16 |
INFO | Storico notturno (ultime 60 notti): in quante notti il primo hit Google riportava lo stato del Consent Mode, la ripartizione nelle ultime 14 notti e gli esiti del banner. Il riferimento dietro i controlli della singola scansione |
I17 |
INFO | Collegamento con il GTM Audit: l'ultimo GTM Audit salvato per il dominio, con data, conteggi di errori/avvisi/note e classe di consenso, segnalato come superato se il container è cambiato o l'audit ha più di 90 giorni. Riportato, mai conteggiato |
I18 |
INFO | Collegamento con il GTM Audit: il sito usa un container GTM ma per il dominio non è ancora stato eseguito alcun GTM Audit |
I19 |
INFO | Il consenso predefinito imposta wait_for_update (valore e dove è impostato): i tag Google che partono prima della risposta dello strumento di consenso attendono fino a quel tempo. Una mitigazione della gara CMP/tag, non un sostituto dell'ordine di caricamento |
I20 |
INFO | Il consenso predefinito è limitato ad alcune regioni: al di fuori il sito non imposta alcun predefinito e Google applica il proprio. Indica se l'Italia, da cui partono i controlli a runtime, è coperta |
Rileva le pagine che rispondono HTTP 200 ma in cui un componente form del CMS non viene renderizzato: al posto del form il visitatore vede il messaggio d'errore del plugin (es. Contact Form 7 "Error: Contact form not found." in una delle sue traduzioni ufficiali) oppure il testo grezzo dello shortcode. La pagina si carica correttamente per ogni check HTTP, ma la sua funzione chiave — contatto o download — è morta. Match deterministico sulle stringhe del testo crawlato, nessuna richiesta aggiuntiva.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Il messaggio d'errore del plugin viene mostrato ai visitatori al posto del form (form cancellato o shortcode con ID errato) |
W01 |
WARNING | Uno shortcode di form grezzo è visibile nel testo della pagina (plugin disattivato o shortcode fuori posto) — il form non viene renderizzato |
Esamina il container Google Tag Manager pubblico del sito con gli stessi controlli del servizio GTM Audit, così i risultati compaiono nel report, nelle scansioni programmate, nell'instradamento delle email e nei confronti fra scansioni. Controlli statici sul container pubblicato: ID di misurazione condivisi da più tag, Universal Analytics dismesso, tag in pausa, HTML personalizzato, template della community, tag senza attivatore, consenso predefinito, ID dinamici. Controlli a runtime: la homepage viene caricata in un browser headless con il consenso negato e poi con il consenso concesso, per vedere le richieste a Google e ad altri tracker prima del consenso, i segnali di consenso concessi per impostazione predefinita, gli ID di misurazione non dichiarati, i container aggiuntivi e i cookie scritti prima del consenso. I rilievi che richiedono l'accesso al container tramite l'API di Google Tag Manager (codici A) vengono dall'ultimo GTM Audit salvato con accesso API. Gira in ogni scansione; un sito senza container GTM risulta semplicemente ok.
| Code | Severity | Description |
|---|---|---|
D1 |
WARNING | Un ID di misurazione GA4 riceve page_view da più di un tag, o da un tag più un tag il cui nome evento è l'evento del dataLayer ({{Event}}) su un trigger che accetta anche page_view: le visualizzazioni di pagina possono essere contate due volte (warning); un ID condiviso da un Google tag e dai suoi tag evento GA4, o con tag il cui nome evento non si legge dal container pubblico, è elencato come nota (info). Altri ID (per esempio un Google tag su AW-): più di tre tag sullo stesso ID (warning); non contano i tag di conversione e remarketing di Google Ads sullo stesso account né gli ID Universal Analytics. Gli ID scritti in variabili Costante si leggono come quelli scritti nel tag |
D4 |
WARNING | Tag Universal Analytics (UA-) attivi: UA ha smesso di elaborare i dati a luglio 2023 (luglio 2024 per UA 360) e le sue proprietà sono state eliminate a luglio 2024; i tag partono ancora sui loro attivatori (elencati tag per tag), caricano analytics.js e inviano dati che nessuno raccoglie |
D4b |
INFO | Paused Universal Analytics tags: harmless, can be deleted |
D5 |
INFO | Tag in pausa e la loro quota sui tag configurati: non partono e il container pubblicato ne conserva solo un segnaposto (tipo e ID, senza configurazione); elencati per fare ordine |
H1 |
WARNING | Tag HTML personalizzati, ciascuno con il suo attivatore, i tracker riconosciuti nel codice e l'eventuale controllo di consenso aggiuntivo. Un attivatore conta come gestione del consenso solo se tiene fermo il tag sia prima che il visitatore scelga sia dopo un rifiuto: un evento dello strumento di consenso per una categoria accettata, col nome completo e fatto solo di parole del consenso (un attivatore che accetta gli eventi per una parte del nome, come contiene consent_marketing, o un nome con un'altra parola, come consent_marketing_update o cookie_consent_marketing_ko, può partire anche dopo un rifiuto e non conta), una condizione sul cookie o sulla variabile di consenso che significa accettazione di una categoria (per gli strumenti di consenso più diffusi verificata sul cookie che scrivono dopo un rifiuto), un'eccezione che vale fino al consenso; per un tag in sequenza, anche l'attivatore del tag con cui parte; per un tag lanciato da un trigger group, gli attivatori del gruppo (aspetta se uno di loro aspetta). Per un tag di un servizio noto di pubblicità o di analisi, anche quando il visitatore rifiuta solo quella categoria (marketing o statistiche) e accetta le altre: un pixel Meta che aspetta il consenso alle statistiche parte con il marketing rifiutato. Un attivatore che nomina lo strumento di consenso ma lascia partire il tag prima della scelta o dopo un rifiuto, o il cui effetto non si ricava dal container, viene detto e non conta come gestione. Avviso se c'è uno strumento di consenso e almeno un tag senza gestione del consenso chiama altri siti; informazione negli altri casi |
H2 |
INFO | Tag da template della community (galleria dei template): codice di terze parti, elencati per una verifica |
H3 |
WARNING | Tag senza attivatore: non partono mai, configurazione inutile. Un tag che parte prima o dopo un altro tag (sequenza di tag) non conta |
H4 |
ERROR | Tag HTML personalizzati che caricano uno script noto di analisi o pubblicità (Matomo, Meta, TikTok, LinkedIn, Hotjar, Clarity, Pinterest, Criteo...) senza un controllo di consenso che li tenga fermi sia prima della scelta del visitatore sia dopo un rifiuto: nessun controllo aggiuntivo e nessun attivatore che aspetti l'accettazione (non basta un attivatore che nomina lo strumento di consenso, o che lascia partire il tag prima della scelta o dopo un rifiuto, né uno che aspetta il consenso di un'altra categoria, come un pixel pubblicitario che aspetta il consenso alle statistiche). Errore se il sito ha uno strumento di consenso, avviso altrimenti, e avviso quando tutti i tag elencati dipendono da un valore che dal container non si ricava |
C1 |
INFO | Il container imposta da sé il consenso predefinito (quali segnali); dice se il template non parte su Consent Initialization e quanti tag Google partono prima |
X1 |
INFO | Tag il cui ID di misurazione viene da una variabile che dipende dalla pagina (tabella di ricerca, dataLayer, JavaScript): i controlli statici non possono dire a quale proprietà inviano. Gli ID nelle variabili Costante e nella variabile delle impostazioni di Google Analytics si leggono |
A1 |
ERROR | Dall'ultimo GTM Audit con accesso API: tag senza requisiti di consenso con impostazioni di consenso "non impostato" benché il sito abbia uno strumento di consenso (riportato come nota, gravità originale nel titolo) |
A1b |
INFO | From the last saved audit with API access: template tags whose consent behaviour could not be determined (template code not returned) |
A1c |
INFO | From the last saved audit with API access: Google tags never reviewed for consent ("Not set"; they honour analytics_storage/ad_storage natively) |
A3 |
WARNING | Dall'ultimo GTM Audit con accesso API: nessun attivatore Consent Initialization nel container (né un attivatore di quel tipo né un tag sull'attivatore di sistema Consent Initialization - All Pages) |
A4 |
INFO | From the last saved audit with API access: live tags with blocking triggers (exceptions), listed for review |
A5 |
WARNING | Dall'ultimo GTM Audit con accesso API: modifiche non pubblicate in un'area di lavoro (warning; "almeno" quando non tutte le aree di lavoro si sono potute controllare); una nota quando se ne è potuta leggere solo una parte, o nessuna |
A7 |
INFO | Dall'ultimo GTM Audit con accesso API: utenti con accesso al container |
R1 |
ERROR | Runtime: richieste ai tracker inviate con consenso negato e senza segnale di consenso (richieste Google senza gcs, pixel pubblicitari, tracker di terze parti con un identificativo); le richieste di statistica che non salvano nulla sul dispositivo sono R24 |
R2 |
ERROR | Runtime: richieste Google senza alcun segnale di consenso (una richiesta di raccolta senza ID di misurazione, come una sonda anti-adblock, non conta) |
R3 |
WARNING | Runtime: segnali di consenso Google (ad_storage, analytics_storage, ad_user_data, ad_personalization) concessi per impostazione predefinita prima di qualsiasi scelta dell'utente; informazione se sono concessi solo segnali che i tag Google non usano, come security_storage o functionality_storage |
R4 |
WARNING | Runtime: ID di misurazione visti nelle richieste che il container non dichiara (informazione se il container usa ID dinamici) |
R5 |
WARNING | Runtime: container GTM aggiuntivi caricati dalla pagina oltre a quelli citati nell'HTML |
R6 |
INFO | Runtime: con il consenso negato ogni hit Google porta lo stato del consenso (gcs); elenca ogni ID di misurazione (dall'hit o, per Google Ads, dal suo percorso) e dice quale stato risultava concesso senza interazione. Un hit senza ID è indicato con host e percorso |
R7 |
INFO | Runtime: sequenza delle richieste (documento, CMP, caricatore GTM, hit Google) così come osservata |
R8 |
WARNING | Runtime: il container GTM non è citato dalla homepage (avviso) oppure è stato trattenuto fino al consenso (informazione) |
R9 |
ERROR | Runtime: cookie di tracciamento scritti prima del consenso (errore); cookie di terze parti sconosciuti (avviso); cookie tecnici/della CMP o nessuno (informazione). "Nulla scritto" solo per i cookie e lo storage che il browser ha letto per intero: una lettura non riuscita, un elenco tagliato al suo limite o un servizio browser che non conferma la lettura viene detto, mai presentato come vuoto |
R10 |
WARNING | Runtime: the CMP grants non-essential categories without an answer, or records an answer by itself without any interaction (warning); only essential categories granted (info) |
R11 |
INFO | Runtime: script di tracciamento scritti nel sorgente della pagina trattenuti dalla CMP fino al consenso; gli script aggiunti a runtime (dal container GTM o da un altro script) sono elencati a parte |
R12 |
ERROR | Runtime, pagine interne campionate (GTM Audit): richieste di tracciamento che la homepage non mostrava, o mostrava con un comportamento diverso rispetto al consenso, compreso uno stato del consenso Google che concede più che in homepage (gcs G111 dove la homepage manda G100), e segnali di consenso Google concessi di default su una pagina campionata ma non in homepage (errore quando le richieste partono senza stato del consenso o con un identificativo e c'è un CMP, altrimenti avviso) |
R13 |
ERROR | Runtime, sampled inner pages (GTM Audit): tracking cookies set before consent that the homepage did not write (warning when no CMP is present) |
R14 |
INFO | Runtime, pagine interne campionate (GTM Audit): pagine osservate col consenso negato e cosa ha inviato ciascuna; "stesso comportamento della homepage" solo quando nessuna richiesta, nessun cookie e nessun default del consenso differisce e ogni pagina è stata osservata per intero (cookie letti, ogni richiesta esaminata, richieste di tracciamento sotto il limite del servizio) |
R16 |
ERROR | Runtime: i comandi di consenso nel dataLayer (consent default/update, con i tempi) messi a confronto con il primo hit Google. Errore se l'hit è partito prima che il predefinito fosse dichiarato; avviso se un aggiornamento precede il predefinito o più predefiniti sono in conflitto su un segnale che i tag Google leggono (i predefiniti per regioni diverse non si confrontano); informazione negli altri casi |
R17 |
INFO | Runtime, consenso concesso (secondo caricamento): richieste di tracciamento che partono solo dopo il consenso, e richieste Google il cui stato di consenso passa da negato a concesso, cioè quelle che il banner controlla davvero |
R18 |
WARNING | Runtime, consenso concesso: nessuna richiesta di tracciamento è partita dalla homepage nemmeno con il consenso, benché il container abbia dei tag (tag che partono solo su eventi successivi, o un'integrazione del consenso che continua a bloccare dopo l'accettazione) |
R19 |
INFO | Runtime, consenso concesso: non è stato possibile concedere il consenso automaticamente (né i cookie dello strumento di consenso né un pulsante di accettazione hanno funzionato): il secondo passaggio non è conclusivo |
R20 |
WARNING | Runtime, consenso concesso: Google riceve ancora il consenso negato (gcs G100) dopo che il visitatore ha accettato, cioè lo strumento di consenso non passa la scelta a Google (warning, anche accanto a R17 quando altre richieste partono); altrimenti le stesse richieste di tracciamento con lo stesso stato di consenso (o nessuna) con consenso negato e concesso, cioè il consenso non cambia ciò che la pagina invia (info) |
R21 |
INFO | Runtime, consent granted: the consent-denied and consent-granted loads landed on different hosts (a redirect that changes with consent cookies or language), so the comparison is inconclusive and no causal consent conclusion is drawn |
R22 |
WARNING | Runtime (gtm-browser 1.9.0+): eventi page_view contati per ID di misurazione GA4 in un caricamento della homepage, compresi quelli raggruppati in un'unica richiesta: più di un page_view per la stessa pagina (warning), uno per caricamento (info); i page_view senza URL della pagina si contano a parte, mai come doppioni |
R23 |
INFO | Runtime: richieste che il servizio browser ha visto ma non ha potuto esaminare; una richiesta di tracciamento fra queste mancherebbe dagli altri controlli runtime, quindi l'osservazione è incompleta |
R24 |
WARNING | Runtime: richieste a uno strumento di statistica web (Matomo) partite prima del consenso che non salvano nulla sul dispositivo (nessun cookie, nessun dato in localStorage); in Italia esenti dal consenso solo alle condizioni del Garante (IP mascherato, statistiche aggregate del singolo sito, nessun incrocio da parte di un fornitore terzo), che dal browser non si verificano (warning con un banner, info senza) |
S1 |
INFO | Cambiamenti rispetto al precedente audit salvato del dominio: rilievi nuovi e risolti per codice, versione del container e inventario dei tag, ID di misurazione, richieste di tracciamento e cookie comparsi o scomparsi a runtime. Differenze osservate, non giudizi |
Search engine optimization, structured data, metadata, linking
Validates H1-H6 heading hierarchy, checking for missing H1, multiple H1 tags, and heading level skips that harm SEO and accessibility.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Missing H1: page has zero H1 headings |
W01 |
WARNING | Multiple H1: page has more than one H1 heading |
W02 |
WARNING | Hierarchy skip: heading level skipped (e.g., H1 to H3) |
Finds pages sharing identical H1 headings, title tags or meta descriptions, which dilutes SEO value and confuses search engines.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Duplicate title: same title tag appears on multiple pages (counted as an error: duplicated titles are the strongest duplicate-content signal) |
W01 |
WARNING | Duplicate H1: same H1 text appears on multiple pages |
W03 |
WARNING | Duplicate meta description: same description text appears on multiple pages |
W04 |
WARNING | Meta description troncata: estratto generato automaticamente interrotto a metà frase (termina con due punti, virgola, punto e virgola, puntini di sospensione o una preposizione/articolo) |
W05 |
WARNING | Possibile refuso nello slug dell'URL: lo slug differisce di 1-2 caratteri dall'H1 della pagina (es. /paradontologia/ invece di Parodontologia) |
W06 |
WARNING | Missing title tag on HTML pages |
W07 |
WARNING | Missing meta description on HTML pages |
Checks heading text length for SEO optimization. Headings that are too short provide little SEO value, while overly long headings may be truncated.
| Code | Severity | Description |
|---|---|---|
W02 |
WARNING | H1 o H2 troppo lungo: più di 70 caratteri (H2: 80), oppure più di 12 parole nell'H1 |
I01 |
INFO | H1 troppo corto: una sola parola |
I02 |
INFO | H3-H6 troppo lunghi: oltre il limite di caratteri per livello (riportato come informazione: i principali strumenti SEO non controllano la lunghezza dei titoli sotto l'H2) |
Validates HTML lang attributes, canonical URLs, and hreflang implementations for multilingual SEO. Checks for missing, invalid, or conflicting declarations.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Missing lang attribute in HTML tag |
E02 |
ERROR | Missing or invalid canonical URL |
E03 |
ERROR | Missing reciprocal hreflang (A links to B but B does not link to A) |
E04 |
ERROR | Hreflang href is not absolute URL |
E05 |
ERROR | Canonical conflicts with hreflang |
W01 |
WARNING | Missing x-default hreflang entry (only when require_x_default is enabled; off by default) |
W02 |
WARNING | Canonical URL issues (relative, non-self, trailing slash mismatch) |
W03 |
WARNING | HTTPS page but hreflang/canonical uses HTTP |
E06 |
ERROR | L'hreflang punta a una pagina non indicizzabile (stato 4xx/5xx o noindex) |
E07 |
ERROR | Voce hreflang duplicata: lo stesso codice lingua è dichiarato due volte nella stessa pagina |
E08 |
ERROR | Codice lingua o regione dell'hreflang non valido: la lingua non è un codice ISO 639-1, oppure la regione non è un codice paese ISO 3166-1 alpha-2 assegnato (es. en-UK, es-419). Google ignora la voce |
E09 |
ERROR | La pagina ha tag hreflang ma nessuno punta alla pagina stessa (manca l'hreflang autoreferenziale). Non segnalato su una pagina con canonical verso un'altra pagina del proprio gruppo hreflang |
E10 |
ERROR | L'hreflang punta a un URL che reindirizza (3xx) invece che alla pagina finale (esclusi i redirect della sola barra finale) |
W05 |
WARNING | L'attributo lang dell'HTML non corrisponde alla lingua dell'hreflang con cui la pagina si autoreferenzia |
W06 |
WARNING | Il canonical punta a un'altra pagina che è noindex: la versione canonica dichiarata non è indicizzabile, quindi la pagina può sparire dall'indice senza che venga indicizzato nemmeno il suo canonical |
W07 |
WARNING | Catena di canonical: il canonical punta a una pagina che a sua volta ha un canonical verso un'altra (A → B → C), oppure i canonical formano un ciclo. Il canonical dovrebbe puntare direttamente alla versione canonica finale (self-referencing), non a una pagina intermedia |
I01 |
INFO | La pagina è noindex ma dichiara anche un canonical verso sé stessa (info, non conteggiato): Google ignora il canonical su una pagina noindex, quindi di solito è innocuo, ma verifica che la pagina debba davvero restare fuori dall'indice |
Validates Open Graph meta tags and Twitter Cards for social sharing. Checks required tags, content quality, consistency with page metadata, and duplicate detection.
| Code | Severity | Description |
|---|---|---|
E02 |
ERROR | Missing required OG tags (og:title, og:description) |
E03 |
ERROR | og:url is a relative URL (must be absolute per the Open Graph specification) |
W01 |
WARNING | Missing og:image tag |
W02 |
WARNING | OG tag quality issues (too long, too short, HTTP image, non-standard og:type, og:locale not in ll_CC format) |
W03 |
WARNING | Missing or invalid Twitter Card |
W04 |
WARNING | Duplicate OG tags across pages |
W05 |
WARNING | OG metadata inconsistent with page title/description/canonical, or og:locale language different from the HTML lang |
W06 |
WARNING | Immagine demo del tema o di stock usata come og:image (es. percorsi demo del tema): un residuo del sito di staging |
W07 |
WARNING | Pages with no Open Graph tags at all (one warning for the scan, pages listed) |
W08 |
WARNING | og:image is a relative URL (social platforms cannot resolve it) |
W09 |
WARNING | Most pages use the same og:image (site-wide default image) |
W10 |
WARNING | URL variants that differ from their canonical page in Open Graph presence |
Evaluates image ALT text coverage and quality. Detects missing ALT attributes, empty ALT text, untranslated ALT for multilingual sites, and overly long descriptions.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Image without an alt attribute, or with an empty alt that could not be checked in the page HTML (an empty alt="" confirmed in the HTML is listed as decorative, info only) |
E02 |
ERROR | Image is the only content of a link and has a confirmed empty alt (alt="") with no other accessible name on the link (no visible text, aria-label, aria-labelledby, or title): the link has no accessible name for screen readers (WCAG 2.4.4 / 4.1.2) |
W01 |
WARNING | Image ALT quality issue (untranslated, longer than 125 characters) |
Validates JSON-LD structured data blocks against Schema.org specifications. Checks syntax, required fields per type, URL format, and type recognition.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | JSON-LD syntax error: a block in the page (head or body) is not valid JSON; the report gives the cause (typographic quotes, line break inside a string...) and an excerpt |
E02 |
ERROR | Missing @type property |
E03 |
ERROR | Required fields missing for Schema.org type |
W01 |
WARNING | URL fields are not absolute URLs |
W02 |
WARNING | Recommended fields missing |
I03 |
INFO | Unknown or unrecognized Schema.org @type (listed, not counted) |
Analyzes internal linking structure using BFS from homepage. Detects orphan pages, deep pages (>4 clicks), generic anchor text, and self-linking patterns.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Pagina orfana della sitemap: URL dichiarato nella sitemap pubblicata, nessuna pagina scansionata lo collega e compare ancora nella sitemap generata da questa scansione (una pagina attuale, non appena rimossa) |
W01 |
WARNING | Deep page: reachable only with more than 4 clicks from homepage |
W02 |
WARNING | Testo del link generico (clicca qui, leggi tutto, ecc.) o URL nudo usato come testo del link |
W03 |
WARNING | href malformato: spazio o carattere di controllo (TAB/CR/LF o %09/%0A/%0D) dentro l'href, che si presenta come un falso dominio internazionalizzato |
W04 |
WARNING | Dead-end page: no outgoing internal links (blocks PageRank flow, excludes whitelisted terminals like contact/privacy) |
W05 |
WARNING | Link segnaposto href="#": voce di menu o invito all'azione la cui destinazione non è mai stata inserita (raggruppati per testo del link) |
W06 |
WARNING | Link tel: senza prefisso internazionale (+CC/00CC): non funziona per chi chiama dall'estero |
W07 |
WARNING | La sitemap pubblicata non dichiara alcun URL sull'host coperto da questa scansione: appartiene a un altro sito, oppure il sito scansionato ne è una copia di staging |
W08 |
WARNING | Copertura sitemap/scansione troppo bassa per giudicare le pagine orfane: sotto la soglia, un URL della sitemap assente dalla scansione significa che la scansione non l'ha raggiunto, non che nessuna pagina lo collega |
W09 |
WARNING | Link interni con parametri di tracciamento (utm_*, gclid, fbclid, _gl...): ogni clic fa ripartire la visita con una sorgente di campagna in analytics e l'URL con il parametro è un secondo indirizzo della stessa pagina. Un warning per insieme di parametri. I link con il marcatore di un assistente AI sono W11 |
W10 |
WARNING | Link avvolto in una pagina di Google invece di puntare alla pagina: una ricerca Google di un URL o un redirect google.com/url (copiato dai risultati di Google, o scritto da un assistente AI che non è riuscito a verificare il link), oppure un segnaposto come una ricerca di "#". Segnala quando l'indirizzo avvolto non è una pagina del sito. Le ricerche testuali (per esempio i link alle recensioni Google) non sono segnalate |
W11 |
WARNING | Link copiati da un assistente AI: link interni o esterni con il marcatore che l'assistente aggiunge ai link che cita (utm_source=chatgpt.com, utm_source=gemini, Perplexity, Copilot, Claude...), segno che nella pagina è stato incollato il testo di una chat AI. Indica l'indirizzo pulito di ogni link e le pagine che lo contengono. Un warning per assistente |
I02 |
INFO | Confronto delle pagine orfane non eseguito, con il motivo e i numeri che lo giustificano (nessuna sitemap leggibile, indice di sitemap non espanso, host diverso, copertura insufficiente) |
I03 |
INFO | Sitemap in attesa di pubblicazione: URL ancora presente nella sitemap pubblicata ma già assente da quella generata da questa scansione; pubblicarla chiude la differenza. Non conteggiato |
Compares the just-generated sitemap.xml with the previous scan's snapshot. Detects URL count spikes/drops (vs 7-day baseline) and suspicious new URLs (webshell paths, spam keywords, exotic charsets). Replaces the daily sitemap watchdog: the customer's sitemap.xml is SiteScan output, so meaningful diffs only happen between consecutive scans, not day-by-day.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Suspicious URLs added (an_sm_03): webshell paths /wp-content/uploads/*.php, double-extension, spam keywords pharma/casino/replica, cyrillic/CJK/arabic chars |
W01 |
WARNING | URL count spike (an_sm_02): +30% AND +50 absolute URLs vs previous snapshot |
W02 |
WARNING | URL count drop (an_sm_04): -30% AND -50 absolute URLs vs previous snapshot (de-indexing or content removal) |
Verifies that the homepage's JSON-LD structured data actually describes the real business, by comparing it against the AI-derived site profile (context_llm.json). Parses the whole document (head+body), so it catches body-injected JSON-LD that 021 misses. Two layers: deterministic NAP match (name/phone/email/locality) + neutral AI semantic judgement (Gemini) that also flags moved/empty/parked sites, language drift, or a different business — without presuming the cause. Homepage-only.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Structured data (JSON-LD) describe a different entity than the business — 2+ NAP contradictions (e.g. agency placeholder name/address) |
E02 |
ERROR | Homepage incoherent with the expected business per AI: site moved/parked/empty, different activity, or different main language |
E03 |
ERROR | Contenuto nascosto con link esterni e segni di iniezione (titoli propri, o uno script diverso da quello della pagina): invisibile ai visitatori, pienamente indicizzabile. Misurato nel browser |
W01 |
WARNING | Single NAP discrepancy between JSON-LD and the business profile |
W02 |
WARNING | Minor semantic discrepancy between live homepage and expected profile (AI) |
W03 |
WARNING | Contenuto nascosto con link esterni, senza gli altri segni di iniezione: può essere legittimo (finestra modale chiusa, menu fuori schermo), segnalato per una verifica |
I02 |
INFO | Blocco nascosto con molto testo e nessun link esterno (menu mobile, pannello a schede, fisarmonica). Elencato per una verifica, non conteggiato |
Trova i title di pagina quasi uguali (per esempio lo stesso titolo in due versioni linguistiche con solo una parola di collegamento tradotta, o lo stesso titolo con un separatore o maiuscole diverse), a complemento del 005, che trova solo i duplicati esatti. I titoli si confrontano parola per parola, mai lettera per lettera. Nessuna richiesta aggiuntiva, nessuna AI. Sperimentale: opzionale finché le soglie non saranno calibrate su siti reali.
| Code | Severity | Description |
|---|---|---|
W01 |
WARNING | Titoli quasi identici: tag title diversi che diventano uguali togliendo il suffisso/prefisso del sito e normalizzando maiuscole e punteggiatura (i numeri contano: "Magazine 2023" e "Magazine 2024" sono pagine diverse) |
W02 |
WARNING | Titoli che differiscono solo per parole vuote (and, und, with, &...): quasi sempre lo stesso argomento, spesso un titolo non tradotto in un'altra versione linguistica |
I01 |
INFO | Titoli che differiscono per una sola parola di contenuto (es. "Superior Double Room" e "Superior Triple Room"): elencati per una verifica, non conteggiati. Di solito varianti legittime |
HTTP security headers, JS vulnerabilities, mixed content
Validates all external links: detects broken links (4xx/5xx), connection failures, slow responses, HTTP-only links, and suspicious URL shorteners.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Critical error: 403, 404, 500, 502, 503, 504, any other failed HTTP response, or no response at all (host not found, timeout, TLS error, connection refused) |
W02 |
WARNING | Warning: 401, 408, 429 status (even though the request failed), slow response, HTTP not HTTPS, or suspicious shortener |
Evaluates 10 HTTP security headers using Mozilla Observatory methodology. Grades from A+ to F based on CSP, HSTS, cookie flags, CORS, X-Frame-Options, and more.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Critical security header missing or misconfigured (score impact >= -20) |
W01 |
WARNING | Security header improvement recommended (score impact -1 to -19) |
Controlla le librerie JavaScript caricate dalla homepage e dalla pagina d'errore (404) con il database di vulnerabilità OSV. Le librerie sono riconosciute dall'URL del CDN, dal nome del file, dai commenti con la versione in qualunque punto del file (anche dentro i bundle che uniscono più script), dalle regole di Retire.js sul contenuto e sulle impronte, e dalla versione realmente in uso letta nella pagina. Riporta gravità (Critical/High/Medium/Low), versioni coinvolte e correzioni disponibili; le librerie per cui il database non ha risposto sono indicate come non verificate e i file in cui non si è riconosciuta nessuna libreria sono elencati. Gli script serviti e aggiornati dal fornitore (pixel pubblicitari, player video, API delle mappe) sono indicati come servizi esterni: non sono pacchetti npm e il database non li copre. Gli script presenti solo in altre pagine non vengono controllati.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Critical or High CVE vulnerability (CVSS >= 7.0) |
W01 |
WARNING | Medium or Low CVE vulnerability (CVSS < 7.0) |
W02 |
WARNING | Vulnerabilità nota (di qualunque gravità) in una libreria inclusa nello script di un fornitore terzo, valutata da noi come non sfruttabile nel modo in cui quello script la usa. Il codice vulnerabile resta e può aggiornarlo solo il fornitore; la valutazione vale solo finché lo script è il codice che abbiamo controllato, altrimenti la vulnerabilità conta con la sua gravità piena |
Detects mixed content on HTTPS sites: HTTP scripts and stylesheets (blocked by browsers), HTTP images in OG tags, HTTP canonical/internal links, protocol-relative resource URLs, and unsafe cross-origin links.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Script loaded via HTTP (active mixed content, blocked by browsers) |
E02 |
ERROR | Stylesheet loaded via HTTP (active mixed content, blocked by browsers) |
W01 |
WARNING | og:image uses HTTP on HTTPS site |
W02 |
WARNING | Canonical URL uses http:// on HTTPS site |
W03 |
WARNING | og:url uses http:// on HTTPS site |
W04 |
WARNING | Internal links with explicit http:// protocol |
W05 |
WARNING | Resource loaded via protocol-relative URL (//...) instead of explicit https:// |
W06 |
WARNING | Cross-origin link with target="_blank" missing rel="noopener" (tab-nabbing risk) |
W07 |
WARNING | Script che bloccano il rendering nell'<head>: la pagina ha almeno il numero soglia di script senza async/defer prima di </head> (gli script prima di </body> non sono conteggiati) |
W08 |
WARNING | External CDN script missing SRI integrity hash (MITM tampering surface) |
W09 |
WARNING | Script type=module without crossorigin attribute (CORS/typed errors) |
Active pentest-style server security testing: TRACE/XST, host header injection, dangerous HTTP methods, sensitive file exposure, directory listing, TLS weakness, CRLF injection, verbose errors, path traversal, backup file discovery, security.txt compliance.
| Code | Severity | Description |
|---|---|---|
T01 |
WARNING | TRACE method enabled (Cross-Site Tracing risk) |
T02 |
WARNING | Host header injection accepted |
T03 |
ERROR | Dangerous HTTP methods enabled (PUT, DELETE, MKCOL, PROPFIND) |
T04 |
ERROR | Sensitive file accessible (.env, .git/HEAD, .htpasswd, phpinfo.php) |
T05 |
WARNING | Directory listing enabled |
T06 |
WARNING | Weak TLS version supported (TLS 1.0/1.1) |
T07 |
ERROR | CRLF injection possible |
T08 |
WARNING | Verbose error pages expose server information |
T09 |
ERROR | Path traversal possible |
T10 |
WARNING | X-Forwarded-Host injection accepted |
T11 |
WARNING | Default virtual host exposure via direct IP access |
T12 |
ERROR | Backup file accessible (.bak, .old, .swp) |
T13 |
INFO | security.txt (RFC 9116) missing or non-compliant |
T14 |
ERROR | CORS reflects arbitrary Origin with credentials (cross-origin data theft) |
T15 |
ERROR | CORS allows null Origin (exploitable via sandboxed iframes) |
T16 |
WARNING | CORS validates Origin with prefix/substring match instead of exact match |
T17 |
ERROR | CONNECT method accepted — server acts as open proxy |
T18 |
ERROR | X-Original-URL header overrides request path (access control bypass) |
T19 |
ERROR | X-Rewrite-URL header overrides routing (access control bypass) |
T20 |
WARNING | HTTP method override headers accepted (method restriction bypass) |
T21 |
ERROR | Extended sensitive file accessible (.env.local, phpinfo variants, .npmrc) |
T22 |
ERROR | SSL certificate expired, expiring soon, self-signed, or hostname mismatch |
T23 |
ERROR | Weak cipher suite accepted (RC4, DES, 3DES, NULL, EXPORT) |
T24 |
WARNING | crossdomain.xml allows access from any domain (wildcard) |
T25 |
INFO | Dependency files exposed (composer.json, package.json, requirements.txt) |
T26 |
ERROR | Admin panel publicly accessible (phpMyAdmin, Adminer, wp-admin) |
T27 |
WARNING | Session cookie missing security attributes (HttpOnly, Secure, SameSite) |
T28 |
WARNING | Information disclosure via response headers (X-Debug-Token, X-Backend-Server) |
T29 |
INFO | Missing modern security headers (Permissions-Policy, COOP, COEP) |
T30 |
WARNING | Dynamic page (sets cookies) missing Cache-Control no-store/private |
Grammar, image ALT text, accessibility, content quality
Checks heading accessibility: empty headings, headings hidden via CSS, and image-only headings that screen readers cannot interpret.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Empty heading: no text content and no image with alt text (whitespace-only headings included) |
E02 |
ERROR | Hidden H1: H1 with a CSS class that hides it from everyone (hidden, d-none, invisible...). Screen-reader-only classes (sr-only, visually-hidden) and responsive classes are not reported |
W01 |
WARNING | Hidden heading: H2-H6 with a CSS class that hides it from everyone (same rule as E02) |
W02 |
WARNING | Image-only heading without alt text: the heading contains only images and none has alt text or an aria-label, so it has no accessible name |
Analyzes grammar, spelling, and linguistic quality across all site languages using AI (Claude/Gemini). Reports errors, warnings, and suggestions with corrected text.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Grammar or spelling error (misspelling, wrong agreement, wrong word) |
I02 |
INFO | Grammar warning (spacing, capitalization, consistency): listed in the report, not counted |
I01 |
INFO | Stylistic suggestion (readability, rephrasing) |
Pre-launch editorial QA for staging sites, run on demand: re-reads the already-crawled corpus (no live fetch), runs six deterministic gap-checks not covered by the other analyzers, then an AI editorial synthesis produces content findings and a go-live verdict.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Unrendered template variables left in the pages ({{var}}, <%= %>, [% %], ${var}, %%VAR%%) |
E02 |
ERROR | Absolute links, canonical, og:url or hreflang still pointing to a staging host instead of the live domain |
E03 |
ERROR | Leftover placeholder / lorem-ipsum / TODO text, or near-empty pages (headings with no real content) |
W01 |
WARNING | Brand name written inconsistently across pages (case, spacing, accents) |
W02 |
WARNING | Conflicting founding / "since" year between pages (to confirm with the client) |
W03 |
WARNING | Copyright year in the past, or an expired "valid until" date |
E04 |
ERROR | Staging or technical host indexable (pages without noindex); also inconsistent per-page robots overrides |
E05 |
ERROR | Images from placeholder services (placehold.co, dummyimage, picsum...) |
E06 |
ERROR | Placeholder alt text (alt="alt", alt="image"...): the attribute is present, so the alt coverage check looks clean |
E07 |
ERROR | Empty pages, net of the site boilerplate |
E08 |
ERROR | Call to action pointing to an empty page |
E09 |
ERROR | Privacy or cookie policy not reachable anywhere: no page, link or document |
W04 |
WARNING | CMS version exposed in the generator meta tag |
W05 |
WARNING | Admin or author username exposed (twitter:data, meta author, /author/<slug>/ URLs) |
W06 |
WARNING | Inconsistent brand suffix in <title> across pages ("Brand 2026" vs "Brand") |
W07 |
WARNING | Junk meta description: all caps, too short, or a copy of the H1 |
W08 |
WARNING | Double-capital typo in visible text, buttons included ("REquest") |
W09 |
WARNING | Diverging contact details: the same mailbox on different domains, or a freemail address next to the institutional one |
W10 |
WARNING | Interface strings in another language than the page ("Read More" on an Italian site), in text and buttons |
W11 |
WARNING | Inconsistent menu: a link present on at least 80% of the pages is missing on a few (stale cache) |
W12 |
WARNING | Reserved area publicly reachable and indexable |
W13 |
WARNING | Privacy or cookie policy published only as a downloadable document (PDF, DOC...), with no HTML page |
Page load, static resources, browser diagnostics
Browser-based homepage analysis using headless Chrome. Reports JavaScript console errors, failed network requests, third-party domains, and page load performance metrics.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | JavaScript console error or failed network request |
E02 |
ERROR | Widget captcha di terze parti in stato di errore (es. reCAPTCHA "Invalid domain for site key"): ogni visitatore vede l'errore e i form protetti dal captcha non si possono inviare. Il testo dell'errore viene letto dentro l'iframe del fornitore |
W01 |
WARNING | JavaScript console warning |
W02 |
WARNING | Le risorse che bloccano il rendering nell'<head> superano il budget di byte del percorso critico (predefinito 170 KB trasferiti), misurato nel browser |
I01 |
INFO | Misura del blocco del rendering: richieste e byte prima del primo disegno, divisi fra CSS e JS, blocchi inline nell'<head>, First Contentful Paint |
Checks the downloadable files your pages link to — images, PDFs, Office documents, audio, video, fonts and archives: detects broken resources (4xx/5xx), oversized files, redirects and malformed URLs. Stylesheets and scripts are not covered by this check.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | Broken resource: the linked file is not there — 4xx client error (404 Not Found, 403 Forbidden, 410 Gone) |
E02 |
ERROR | Oversized file: larger than the size limit for its own type (default 5 MB; higher for audio and video, lower for fonts) |
E03 |
ERROR | Server error: the linked file exists but the server fails to deliver it (5xx) — an infrastructure problem, not a broken link |
W01 |
WARNING | Redirected resource: the link answers with a 3xx and the file is actually served from a different URL |
W02 |
WARNING | Malformed URL: the link contains path traversal segments (/../) and had to be normalized before checking |
W03 |
WARNING | Unreachable resource: no response at all — the request timed out or the connection failed |
Sign up for free and run your first scan in under a minute.