Complete reference for all 32 analyzers and 328 checks that power SiteScan SEO analysis.
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 | HTTP 410 Gone pages: intentional removals, reported as information and not counted as errors or warnings |
I02 |
INFO | Pages that sent no HTTP response (connection refused, timeout, DNS or TLS failure): status unknown, reported as information and not counted as errors or warnings |
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 | Site-level: non-existent URLs do not return 404 (redirected to the homepage or another URL, or served with HTTP 200), detected with a random probe URL |
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 found at a standard location but not declared in robots.txt |
W06 |
WARNING | Restrictive crawl budget (<0.5 pages/day) |
W07 |
WARNING | Static resources (/images/, /css/, /js/, /static/, /assets/) blocked for a rendering search engine (the * group, Googlebot or Bingbot) with no Allow override — may harm page rendering for search |
W08 |
WARNING | Orphaned rules (before any User-agent) |
W09 |
WARNING | Deprecated noindex directive |
W10 |
WARNING | Sitemap URL is not a full http(s) address (relative, or another scheme): in a Sitemap line of robots.txt or in a sitemap index. Search engines ignore it; when robots.txt has only such lines, the sitemap is looked for at each relative address and then at the standard locations |
W11 |
WARNING | No sitemap declared in robots.txt and none found at the standard locations (sitemap.xml, sitemap_index.xml, wp-sitemap.xml, ...): the sitemap is not discoverable, which does not prove that none exists |
W12 |
WARNING | The published sitemap omits whole sections or languages of the site: the crawl has indexable, reachable pages in a section (e.g. a language like /en/) that has zero URLs in the sitemap, while other sections are covered. Search engines must then find those pages by links alone |
I12 |
INFO | Sitemap pending publication: pages crawled now but absent from the published sitemap, already included in the sitemap generated by this scan. Not counted |
W13 |
WARNING | Sitemap declared or found but unreachable |
W14 |
WARNING | Sitemap XML malformed (no <urlset> or <sitemapindex>, and not an RSS or Atom feed, which are read as sitemaps) |
W15 |
WARNING | Sitemap URLs that return 4xx/5xx |
W16 |
WARNING | Sitemap incomplete: crawled pages missing from the published sitemap, with the share of the crawled pages that belong in a sitemap that it lists (URLs with parameters, pages left out on purpose and paginated listings are not counted; pages already in the sitemap generated by the scan are named apart and do not raise the warning on their own) |
W17 |
WARNING | Most sitemap lastmod dates are older than the configured number of years, or some are placeholder dates from before the web existed (such as 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 | Static resources blocked only for AI crawlers / SEO tools (GPTBot, ClaudeBot, Ahrefs, Semrush, ...), while the main search engines (the * group, Googlebot, Bingbot) can still fetch them — usually a deliberate policy, not an SEO rendering issue. Not counted |
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 | Pages with a nofollow robots directive: search engines will not follow their outbound links (often intentional, reported as information) |
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 | Server banner distribution: which Server header values the site returns across the crawled URLs |
I02 |
INFO | TTFB statistics: median, p90 and p99 time to first byte across the crawled URLs, with the slowest URLs |
I03 |
INFO | Stale content: URLs whose Last-Modified header is older than the configured threshold (days) |
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 | CMP script placed AFTER the Google tag snippet with no inline consent default before it — consent default registered too late, Consent Mode not effective. The finding says whether the browser check confirmed it on the homepage; when the check saw consent working it is W16 instead |
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 (page loaded without accepting the banner): the Google tag fired with no consent state at all, so Consent Mode is not applied, neither Basic nor Advanced |
E06 |
ERROR | Runtime banner probe (page loaded twice, consent refused then accepted): no cookie banner appears at all, yet the Google tags fire, so visitors are tracked without being asked. Also rules out an in-house banner with no recognizable vendor signature |
E07 |
ERROR | GTM container structure, reported only with evidence of missing consent state (recent nightly history or the current run): the CMP is loaded by a Custom HTML tag or by a vendor template that sets no consent default, no container tag sets the default earlier than the first Google tag, and that Google tag fires on a built-in page event. The default arrives only after the external script has run, and the Google tag races it |
E08 |
ERROR | Consent probe (homepage loaded without accepting the banner): the first Google hit already carried ad_storage and/or analytics_storage GRANTED before any interaction. The banner does not gate those signals: the default is granted, or the consent tool grants them on load |
E09 |
ERROR | Runtime check: a request of the consent tool failed on the homepage (script or account configuration 404/403, network error, blocked by the Content Security Policy). The site has a consent tool but it is broken in production: the fix is the installation |
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 | Runtime banner probe: a cookie banner is present but the Google tags carry no consent state, so the banner is not connected to Google Consent Mode. The fix is to enable Consent Mode in the existing consent tool, not to install a new banner |
W11 |
WARNING | Consent probe: Basic Consent Mode, no request reaches Google until consent, so visitors who refuse are not measured at all |
W12 |
WARNING | Scripts carry CMP blocking attributes (data-cookiescript, data-cookiecategory, ...) but no CMP is loaded, neither in the pages nor in the GTM container: a leftover of a removed or broken consent tool, those scripts run regardless of consent |
W13 |
WARNING | GTM container structure: a Google tag fires on Consent Initialization, the event reserved for setting consent defaults; reported only with evidence of missing consent state |
W14 |
WARNING | Nightly history: over the last 14 nights the first Google hit had Consent Mode state on some nights and none on others: the default is not guaranteed before the Google tag (a race) |
W15 |
WARNING | The consent default sets an implausible wait_for_update: below 100 ms (the value is in milliseconds, so the wait ends before the consent tool can answer) or above 10 s (Google tags hold their first hit that long) |
W16 |
WARNING | CMP script placed AFTER the Google tag snippet with no inline consent default before it, but the browser check saw consent working on the homepage (only a cookieless ping, or no request until consent): it depends on timing, so the order is still worth fixing |
I02 |
INFO | GTM installed without the <noscript> iframe fallback (affects only visitors without JavaScript) |
I03 |
INFO | CMP loaded only through the GTM container: static analysis cannot verify that it fires on the Consent Initialization trigger |
I04 |
INFO | Multiple GTM container IDs on the page (sometimes intentional, but duplicate containers double-fire tags) |
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: with the banner not accepted, the Google tag still sends a cookieless ping (Advanced Consent Mode, which is also GTM's default) |
I10 |
INFO | Runtime check: a cookie banner was detected on the homepage (page with consent refused compared with consent accepted, so in-house banners are covered too) |
I11 |
INFO | Runtime request timeline: the consent-relevant requests in chronological order (document, CMP script, GTM/gtag loaders, Google hits), so "Google received data before consent" is an observed sequence, not an inference |
I13 |
INFO | The CMP is present: the headless browser rendered its banner, but no script of this vendor was recognized in the static HTML (often it is loaded by GTM) |
I14 |
INFO | A cookie banner matching no known CMP signature, with the Google tags firing with Consent Mode state at runtime |
I15 |
INFO | Google tag seen only at runtime: no GTM/gtag loader in the static HTML (bundled or injected by a plugin), the headless browser saw it load. Static load-order checks do not apply, runtime checks do |
I16 |
INFO | Nightly history (last 60 nights): on how many nights the first Google hit carried Consent Mode state, the split over the last 14 nights and the banner verdicts. The base rate behind the single-run checks |
I17 |
INFO | GTM Audit bridge: the latest GTM Audit saved for the domain, with its date, error/warning/note counts and consent class, flagged as stale when the container changed or the audit is older than 90 days. Reported, never counted |
I18 |
INFO | GTM Audit bridge: the site uses a GTM container but no GTM Audit has been run for the domain yet |
I19 |
INFO | The consent default sets wait_for_update (value and where it is set): Google tags that fire before the consent tool answers wait up to that long. A mitigation of the CMP/tag race, not a substitute for the load order |
I20 |
INFO | The consent default is limited to some regions: outside them the site sets no default and Google applies its own. Says whether Italy, where the runtime checks run, is covered |
Detects pages that return HTTP 200 but where a CMS form component failed to render: instead of the form, visitors see the form plugin's own error message (e.g. Contact Form 7 "Error: Contact form not found." in any of its official translations) or the raw shortcode text. The page loads fine for every HTTP check, but its key function — contact or download — is dead. Deterministic string matching on the crawled page text, no extra requests.
| Code | Severity | Description |
|---|---|---|
E01 |
ERROR | A form plugin error message is rendered to visitors instead of the form (the form was deleted or the shortcode references a wrong form ID) |
W01 |
WARNING | A raw form shortcode is visible in the page text (form plugin deactivated or shortcode misplaced) — the form does not render |
Audits the site's public Google Tag Manager container with the same checks as the GTM Audit service, so the results appear in the report, in scheduled scans, in email routing and in scan comparisons. Static checks on the published container: measurement IDs shared by several tags, legacy Universal Analytics, paused tags, Custom HTML, community templates, tags with no trigger, consent defaults, dynamic IDs. Runtime checks: the homepage is loaded in a headless browser with consent denied, then again with consent granted, to see requests to Google and other trackers before consent, consent signals granted by default, undeclared measurement IDs, extra containers and cookies written before consent. Findings that need access to the container through the Google Tag Manager API (A codes) come from the latest saved GTM Audit with API access. Runs in every scan; a site without a GTM container is simply ok.
| Code | Severity | Description |
|---|---|---|
D1 |
WARNING | A GA4 measurement ID receives page_view from more than one tag, or from one tag plus a tag whose event name is the dataLayer event ({{Event}}) on a trigger that also accepts page_view: page views can be counted twice (warning); a shared ID that is one Google tag plus its GA4 event tags, or with tags whose event name cannot be read from the public container, listed as a note (info). Other IDs (for example a Google tag on AW-): more than three tags on one ID (warning); Google Ads conversion and remarketing tags on one account and Universal Analytics IDs are not counted. IDs written in Constant variables are read like literal IDs |
D4 |
WARNING | Live Universal Analytics tags (UA-): UA stopped processing data in July 2023 (July 2024 for UA 360) and its properties were deleted in July 2024; the tags still fire on their triggers (listed with each tag), load analytics.js and send hits that nothing collects |
D4b |
INFO | Paused Universal Analytics tags: harmless, can be deleted |
D5 |
INFO | Paused tags and their share of the configured tags: they do not fire and the published container keeps only a placeholder for each (type and ID, no configuration); listed for housekeeping |
H1 |
WARNING | Custom HTML tags, each with its trigger, the trackers recognized in its code and whether it carries an additional consent check (read from the published container). A trigger counts as consent handling only when it holds the tag both before the visitor chooses and after a refusal: a consent tool event for an accepted category, named in full and only with words about consent (a trigger that accepts events by part of their name, such as contains consent_marketing, or a name with another word, such as consent_marketing_update or cookie_consent_marketing_ko, can also fire on a refusal and does not count), a condition on the consent cookie or variable that means acceptance of a category (for the common consent tools checked against the cookie they write after a refusal), an exception that applies until consent is given; for a sequenced tag, also the trigger of the tag it fires with; for a tag fired by a trigger group, the triggers of the group (it waits if one of them waits). For a tag of a known advertising or analytics service, also when the visitor refuses only that category (marketing or statistics) and accepts the others: a Meta pixel waiting for the statistics consent fires with marketing refused. A trigger that names the consent tool but lets the tag fire before the choice or after a refusal, or whose effect cannot be worked out from the container, is said and not counted as handling. Warning when a consent tool is present and at least one tag without consent handling calls other sites; info otherwise |
H2 |
INFO | Community template tags (gallery templates): third-party code, listed for review |
H3 |
WARNING | Tags with no trigger: they never fire, dead configuration. A tag fired before or after another tag (tag sequencing) is not counted |
H4 |
ERROR | Custom HTML tags that load a known analytics or advertising script (Matomo, Meta, TikTok, LinkedIn, Hotjar, Clarity, Pinterest, Criteo...) and have no consent check that holds them both before the visitor chooses and after a refusal in the published container: no additional consent check, and no trigger that waits for acceptance (a trigger that only names the consent tool, or that lets the tag fire before the choice or after a refusal, does not count; nor does one that waits for consent to another category, such as an advertising pixel waiting for the statistics consent). Error when the site has a consent tool, warning otherwise, and warning when every tag listed depends on a value this check cannot work out from the container. Static version of the API-tier A1, with the tag code and trigger instead of the tag name |
C1 |
INFO | The container sets consent defaults itself (which signals); says when the template does not fire on Consent Initialization and how many Google tags fire before it |
X1 |
INFO | Tags whose measurement ID comes from a variable that depends on the page (lookup table, dataLayer, JavaScript): the static checks cannot tell which property they send to. IDs in Constant variables and in the Google Analytics settings variable are read |
A1 |
ERROR | From the latest GTM Audit with API access: tags with no consent requirement whose consent settings are "not set" although the site has a consent tool (reported as a note, original severity in the title) |
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 | From the latest GTM Audit with API access: no Consent Initialization trigger in the container (neither a trigger of that type nor a tag on the built-in Consent Initialization - All Pages trigger) |
A4 |
INFO | From the last saved audit with API access: live tags with blocking triggers (exceptions), listed for review |
A5 |
WARNING | From the latest GTM Audit with API access: unpublished changes in a workspace (warning; "at least" when not every workspace could be checked); a note when only part of the workspaces, or none, could be read |
A7 |
INFO | From the latest GTM Audit with API access: users with access to the container |
R1 |
ERROR | Runtime: requests to trackers sent with consent denied and no consent signal (Google requests without gcs, advertising pixels, third-party trackers with an identifier); statistics requests that store nothing on the device are R24 |
R2 |
ERROR | Runtime: Google requests carrying no consent signal at all (a collect request with no measurement ID, such as an ad-blocker probe, is not counted) |
R3 |
WARNING | Runtime: Google consent signals (ad_storage, analytics_storage, ad_user_data, ad_personalization) granted by default before any user choice; info when only signals Google tags do not use, such as security_storage or functionality_storage, are granted |
R4 |
WARNING | Runtime: measurement IDs seen in the requests that the container does not declare (info when the container uses dynamic IDs) |
R5 |
WARNING | Runtime: additional GTM containers loaded by the page beyond the ones referenced in the HTML |
R6 |
INFO | Runtime: every Google hit carries the consent state (gcs) with consent denied; lists each measurement ID (from the hit or, for Google Ads, from its path) and says which state was granted without interaction. A hit without an ID is shown by host and path |
R7 |
INFO | Runtime: request timeline (document, CMP, GTM loader, Google hits) as observed |
R8 |
WARNING | Runtime: the GTM container is not referenced by the homepage (warning) or was held back until consent (info) |
R9 |
ERROR | Runtime: tracking cookies written before consent (error); unknown third-party cookies (warning); technical/CMP cookies or none (info). "Nothing written" only for the cookie jar and storage the browser read in full: a read that failed, a list cut at its limit or a browser service that does not confirm the read is said, never reported as empty |
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: tracking scripts written in the page source held back by the CMP until consent; scripts added at runtime (by the GTM container, or another script) listed apart |
R12 |
ERROR | Runtime, sampled inner pages (GTM Audit): tracking requests the homepage did not show, or showed with a different consent behaviour, including a Google consent state that grants more than on the homepage (gcs G111 where the homepage sends G100), and Google consent signals granted by default on a sampled page but not on the homepage (error when requests leave without consent state or with an identifier and a CMP is present, otherwise warning) |
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, sampled inner pages (GTM Audit): pages observed with consent denied and what each one sent; "same behaviour as the homepage" only when no request, cookie or consent default differs and every page was observed in full (cookies read, every request examined, tracking requests under the service limit) |
R16 |
ERROR | Runtime: the consent commands on the dataLayer (consent default/update, with timestamps) lined up with the first Google hit. Error when the hit left before the default was declared; warning when an update precedes the default or several defaults conflict on a signal Google tags read (defaults for different regions are not compared); info otherwise |
R17 |
INFO | Runtime, consent granted (second load): tracking requests that fire only after consent is granted, and Google requests whose consent state switches from denied to granted, i.e. the requests the banner actually gates |
R18 |
WARNING | Runtime, consent granted: no tracking request left the homepage even with consent granted although the container has tags (tags firing only on later events, or a consent integration that keeps blocking after acceptance) |
R19 |
INFO | Runtime, consent granted: consent could not be granted automatically (neither the consent tool's cookies nor an accept button worked): the second pass is inconclusive |
R20 |
WARNING | Runtime, consent granted: Google still receives consent denied (gcs G100) after the visitor accepted, i.e. the consent tool does not pass the choice to Google (warning, also next to R17 when other requests start); otherwise the same tracking requests with the same consent state (or none) with consent denied and granted, i.e. consent does not change what the page sends (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+): page_view events counted per GA4 measurement ID on one homepage load, including events batched in one request: more than one page_view for the same page (warning), one per load (info); page_views without a page URL are counted apart, never as duplicates |
R23 |
INFO | Runtime: requests the browser service saw but could not examine; a tracking request among them would be missing from the other runtime checks, so the observation is incomplete |
R24 |
WARNING | Runtime: requests to a web statistics tool (Matomo) sent before consent that store nothing on the device (no cookie, no local storage); in Italy exempt from consent only under the Garante conditions (IP masked, aggregate statistics for this site, no combination by a third party), which cannot be checked from the browser (warning with a consent banner, info without) |
S1 |
INFO | Changes since the previous saved audit of the domain: new and resolved findings by code, container version and tag inventory, measurement IDs, tracking requests and cookies that appeared or disappeared at runtime. Observed differences, not judgements |
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 | Truncated meta description: an auto-generated excerpt cut mid-sentence (ends with a colon, comma, semicolon, ellipsis or a preposition/article) |
W05 |
WARNING | Possible typo in the URL slug: the slug differs by 1-2 characters from the page H1 (e.g. /paradontologia/ vs 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 or H2 too long: more than 70 characters (H2: 80), or more than 12 words on the H1 |
I01 |
INFO | H1 too short: a single word |
I02 |
INFO | H3-H6 too long: over the per-level character limit (reported as information: major SEO tools do not check heading length below 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 | hreflang points to a non-indexable page (4xx/5xx status or noindex) |
E07 |
ERROR | Duplicate hreflang entry: the same language code is declared twice on one page |
E08 |
ERROR | Invalid hreflang language or region code: the language is not ISO 639-1, or the region is not an assigned ISO 3166-1 alpha-2 country code (e.g. en-UK, es-419). Google ignores the entry |
E09 |
ERROR | Page has hreflang tags but none of them references the page itself (missing self-referencing hreflang). Not reported on a page canonicalised to another page of its own hreflang cluster |
E10 |
ERROR | hreflang points to a URL that redirects (3xx) instead of the final page (trailing-slash redirects excluded) |
W05 |
WARNING | The HTML lang attribute does not match the language of the page's own hreflang self-reference |
W06 |
WARNING | Canonical points to a different page that is noindex: the declared canonical version is not indexable, so the page may be dropped from the index without its canonical being indexed either |
W07 |
WARNING | Canonical chain: the canonical points to a page that is itself canonicalised elsewhere (A to B to C), or the canonicals form a loop. The canonical should point directly to the final self-referencing canonical URL, not to an intermediate page |
I01 |
INFO | Page is noindex but also declares a self-referencing canonical (info, not counted): Google ignores the canonical on a noindex page, so it is usually harmless, but check the page is meant to be excluded from the index |
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 | Theme demo or stock image used as og:image (e.g. theme demo paths): a leftover of the staging site |
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 | Sitemap-orphan page: URL declared in the published sitemap, no crawled page links to it, and still present in the sitemap generated by this scan (a current page, not one just removed) |
W01 |
WARNING | Deep page: reachable only with more than 4 clicks from homepage |
W02 |
WARNING | Generic anchor text (click here, read more, etc.) or a bare URL used as link text |
W03 |
WARNING | Malformed href: whitespace or a control character (TAB/CR/LF or %09/%0A/%0D) inside the href, which surfaces as a bogus internationalized domain |
W04 |
WARNING | Dead-end page: no outgoing internal links (blocks PageRank flow, excludes whitelisted terminals like contact/privacy) |
W05 |
WARNING | Placeholder link href="#": a menu entry or call to action whose target was never filled in (grouped by anchor text) |
W06 |
WARNING | tel: link without international prefix (+CC/00CC): it does not work for callers from abroad |
W07 |
WARNING | The published sitemap declares no URL on the host this scan covered: it belongs to a different site, or the scanned site is a staging copy of it |
W08 |
WARNING | Sitemap/crawl coverage too low to judge orphan pages: below the threshold, a sitemap URL missing from the crawl means the crawl did not reach it, not that nothing links to it |
W09 |
WARNING | Internal links with tracking parameters (utm_*, gclid, fbclid, _gl...): every click restarts the visit with a campaign source in analytics and the tagged URL is a second address of the same page. One warning per set of parameters. Links with the marker of an AI assistant are W11 |
W10 |
WARNING | Link wrapped in a Google page instead of pointing to the page: a Google Search for a URL or a google.com/url redirect (copied from Google results, or written by an AI assistant that could not verify the link), or a placeholder such as a search for "#". Says when the wrapped address is not a page of the site. Plain-text searches (e.g. links to Google reviews) are not reported |
W11 |
WARNING | Links copied from an AI assistant: internal or external links with the marker that the assistant adds to the links it cites (utm_source=chatgpt.com, utm_source=gemini, Perplexity, Copilot, Claude...), a sign that text was pasted from an AI chat. Gives the clean address of each link and the pages that contain it. One warning per assistant |
I02 |
INFO | Orphan-page comparison not performed, with the reason and the numbers behind it (no readable sitemap, sitemap index not expanded, host mismatch, insufficient coverage) |
I03 |
INFO | Sitemap pending publication: URL still listed in the published sitemap but already absent from the sitemap generated by this scan; publishing it closes the gap. Not counted |
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 | Hidden content carrying external links plus injection markers (its own headings, or a script different from the page): invisible to visitors, fully indexable. Measured in the 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 | Hidden content containing external links, without the other injection markers: it can be legitimate (dismissed modal, off-canvas menu), reported for review |
I02 |
INFO | Hidden block with substantial text and no external links (mobile menu, tab panel, accordion). Listed for review, not counted |
Finds page titles that are nearly the same (for example the same title in two language versions with only a connector word translated, or the same title with a different separator or case), complementing 005, which only finds exact duplicates. Titles are compared word by word, never letter by letter. No extra requests, no AI. Experimental: optional until the thresholds are calibrated on real sites.
| Code | Severity | Description |
|---|---|---|
W01 |
WARNING | Near-identical titles: different title tags that become identical after removing the site suffix/prefix and normalizing case and punctuation (numbers are kept: "Magazine 2023" and "Magazine 2024" are different pages) |
W02 |
WARNING | Titles differing only by stopwords (and, und, with, &...): almost always the same topic, often an untranslated title in another language version |
I01 |
INFO | Titles one content word apart (e.g. "Superior Double Room" vs "Superior Triple Room"): listed for review, not counted. Usually legitimate variants |
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) |
Checks the JavaScript libraries loaded by the homepage and by the error page (404) against the OSV vulnerability database. Libraries are identified by CDN URL, file name, the version banners anywhere in the file (also inside bundles that join several scripts), Retire.js content rules and fingerprints, and by the version actually in use read in the page. Reports severity (Critical/High/Medium/Low), affected versions and available fixes; libraries whose database lookup failed are listed as not verified, and files in which no library could be identified are listed as such. Scripts served and updated by their provider (advertising pixels, video players, map APIs) are listed as hosted services: they are not npm packages, so the database does not cover them. Scripts that appear only on other pages are not checked.
| 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 | Known vulnerability (any severity) in a library bundled inside a third-party provider script, assessed by us as not exploitable in the way that script uses it. The vulnerable code is still there and only the provider can update it; the assessment applies only while the script is the code that was checked, otherwise the vulnerability counts at its full severity |
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 | Render-blocking scripts in <head>: the page has at least the threshold number of scripts without async/defer before </head> (scripts before </body> are not counted) |
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 | Third-party captcha widget in error state (e.g. reCAPTCHA "Invalid domain for site key"): every visitor sees the error and the forms protected by the captcha cannot be submitted. The error text is read inside the provider's iframe |
W01 |
WARNING | JavaScript console warning |
W02 |
WARNING | Render-blocking resources in <head> exceed the critical-path byte budget (default 170 KB transferred), measured in the browser |
I01 |
INFO | Render-blocking measurement: requests and bytes before the first paint, split between CSS and JS, inline blocks in <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 |