# The Getting Found Checklist Every data point the free audit tools at jwatte.com measure, collected into one file you can hand to the AI plan you already pay for. Version 1.4, October 22, 2026 (review items 3.11, 3.54, 3.67, 3.86, 7.55, A16.2, A16.3 and A27.9 updated to Google's review snippet guidelines; 1.3 updated 5.39 to 5.41 and 5.45 to ARD v0.91). Written by J.A. Watte. Free to copy, adapt and ship. No signup, no email, no tracking, no attribution required. Companion article: https://jwatte.com/blog/bolt-new-seo-aeo-geo-do-it-yourself/ The tools that verify every line below, free and in your browser: https://jwatte.com/tools/ This file, always at its latest version: https://jwatte.com/downloads/getting-found-checklist.md Every check in this file exists as code in a tool on that site. The pass conditions, thresholds and lists were copied from the tool source, not from a best-practices article, so when a line says 170 characters or 2.5 seconds, that is the number the tool will hold you to. Where a tool cites a standard (an RFC, a WCAG success criterion, a schema.org type, a Google document) the line names it. 892 general checks in 12 sections, plus 290 industry-specific ones in the appendix, drawn from 80 tools. --- ## How to use this file There are three ways in. Pick the one that matches where you are. **You already have a site.** Open Claude, ChatGPT or Gemini. The free tier handles a page at a time; the $20 tier does a whole site in a sitting. Paste this file, then paste the page you want checked: in your browser press Ctrl+U (Cmd+Option+U on a Mac), select all, copy. Add your robots.txt and sitemap.xml the same way. Then use Prompt A. **You are building a new site with a coding agent** (Claude Code, Codex, Jules, Cursor, Windsurf, or bolt.new itself). Save this file at the project root as `GETTING-FOUND.md`. If the project has an `AGENTS.md` or `CLAUDE.md`, add one line to it: "Read GETTING-FOUND.md before writing any page, and build to it." Then use Prompt B. **You ran a tool on jwatte.com and it handed you a fix prompt.** That prompt already carries your findings. Paste it, then this file, then use Prompt C, so the fix meets the whole section and not just the one finding. **How much to paste at once.** This is a large file, about 1150 KB, because it holds every check rather than a highlights reel. A coding agent reads it whole from disk. A chat window takes it a section at a time: paste the front matter (everything above section 1) plus the one section you are working on, and start with sections 1 and 2. Section sizes: 1: 90 KB, 2: 63 KB, 3: 107 KB, 4: 51 KB, 5: 76 KB, 6: 60 KB, 7: 100 KB, 8: 60 KB, 9: 100 KB, 10: 88 KB, 11: 69 KB, 12: 57 KB, Appendix A: 218 KB. Whichever way in, the last step is the same: **verify with the tool, not with the AI's own report.** Every section below names the tools that measure it. Most accept a deep link, so `https://jwatte.com/tools//?url=https://yoursite.com&autorun=1` opens the tool with your site filled in and the audit already running. Nothing on that site needs an account, and nothing you enter is stored. ### Prompt A: audit a site that exists ```text You are auditing a website against GETTING-FOUND.md, pasted above. Work through it section by section, in the order the file gives. For every check, report PASS, WARN, FAIL or N/A with one line of evidence from the HTML, robots.txt or sitemap I pasted. Do not guess at anything you cannot see; if a check needs a file or a response header I have not given you, list it under "Needs input" and move on. When you finish a section, give me the fixes for every FAIL and WARN as complete, paste-ready code (a full block, a full JSON-LD block, a full robots.txt), never a fragment with "..." in it. Keep everything that already passes exactly as it is. Mark checks that do not apply to this kind of site as N/A and say why in five words or fewer. At the end, list the jwatte.com tools I should run to confirm each section, taken from the Verify lines in the file. ``` ### Prompt B: build a new site to this file ```text Read GETTING-FOUND.md at the project root before writing anything. Build this site to it: plain HTML and CSS, one file per page, no framework unless I ask for one. The business: [name, what it does, city and state, street address, phone, hours, the three questions customers ask most, and the pages I want]. Every check in the file that applies to this kind of site must pass on the first deploy; where the file gives a number, hit the number. Where a check needs a value only I have (an EIN, a license number, a Google Business Profile link, a Search Console verification), put a FILL: marker in the code and list every marker at the end. When you are done, print the checks you believe pass, the checks you marked N/A with a reason each, and the tools from the Verify lines I should run before I tell anyone the site exists. ``` ### Prompt C: apply a tool's fix prompt against the whole standard ```text Above is a fix prompt generated by a jwatte.com audit tool, with my site's findings inside it, followed by GETTING-FOUND.md. Fix every finding in the prompt. While you are in each file, bring it up to every other check in the same section of GETTING-FOUND.md, so I am not back next week for the neighbor of the thing you just fixed. Give me complete files, not fragments. Change nothing that already passes. List what you changed, check by check, using the numbering in the file. ``` ## How to read a check Each check is a task-list line so you can tick it in any Markdown editor, or let the AI tick it: - [ ] **Number and title**, as the tool labels it on screen. - Pass: the condition that earns full credit. - Warn: where the tool gives half credit (only present when the tool has a warn state). - Fail: the condition that earns none. - Numbers and lists the tool uses: every threshold, user-agent token, header name or file path the check is coded with. - Why: what goes wrong when it fails. - Fix: the remedy the tool's own fix prompt gives. - Verify: the tool or tools that measure it, and the standard the check implements. Scoring, as the Mega Analyzer does it: each section's score is the unweighted average of its checks, a warn counting as half, and the overall average maps to a letter. A is 90 or better, B is 80 to 89, C is 70 to 79, D is 60 to 69, F is below 60. Information-only checks are not scored. In the tool you can mark any check N/A and it leaves both the score and the fix prompt. Checks gated to one kind of business (a nonprofit's EIN, an attorney's bar number) are in Appendix A so the main list stays general. ## The order to do it in If you do nothing else, do the sections in this order, because each one is wasted without the one before it: 1. **What the crawler actually sees** (section 1). An unreachable page scores zero on everything else. 2. **Titles, descriptions and headings** (section 2). The result itself. 3. **Structured data** (section 3) and, if you have a door, **Local** (section 6). 4. **Trust** (section 7). Who you are, in a form a machine can confirm. 5. **Being read by AI** (section 5) and **Answer engines** (section 4). Access first, then quotability. 6. **Speed** (section 8), **Accessibility** (section 9), **Security** (section 10). 7. **Content** (section 11), which is the work that never finishes. 8. **Hosting** (section 12) is decided once, so decide it before section 1 if the site does not exist yet. --- ## 1. What the crawler actually sees Nothing else in this file matters if the crawler cannot reach the page, or reaches a different page than the visitor does. This section is robots.txt, the sitemap and the truth of its dates, canonicals, redirects, indexability and internal links: the plumbing between your files and the index. **Verify this section with:** [Site Analyzer](https://jwatte.com/tools/analyzer/), [E-E-A-T Audit](https://jwatte.com/tools/eeat-analyzer/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/), [Internal Link Auditor](https://jwatte.com/tools/internal-link-auditor/), [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/), [Image Alt Audit](https://jwatte.com/tools/image-alt-audit/), [Schema Validator](https://jwatte.com/tools/schema-validator/), [Rich Results Eligibility Audit](https://jwatte.com/tools/rich-results-eligibility-audit/), [FAQ Schema Parity](https://jwatte.com/tools/faq-schema-parity/), [Mega SEO Analyzer](https://jwatte.com/tools/mega-seo-analyzer/), [AI Posture Audit](https://jwatte.com/tools/ai-posture-audit/), [Agent Ready Audit](https://jwatte.com/tools/agent-ready-audit/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/), [Mega Batch](https://jwatte.com/tools/mega-batch/), [Single Site Gen](https://jwatte.com/tools/single-site-gen/), [Migration Analyzer](https://jwatte.com/tools/migration-analyzer/), [robots.txt Simulator](https://jwatte.com/tools/robots-txt-simulator/), [Site Migration Gen](https://jwatte.com/tools/site-migration-gen/), [AI Bot Policy Generator](https://jwatte.com/tools/ai-bot-policy-gen/), [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/), [Duplicate Title / Meta Description Audit](https://jwatte.com/tools/duplicate-title-meta-audit/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Search Console + Bing Importer](https://jwatte.com/tools/search-console-importer/), [Link Graph](https://jwatte.com/tools/link-graph/), [Mega AEO Analyzer](https://jwatte.com/tools/mega-aeo-analyzer/), [Rendered DOM Paste Audit](https://jwatte.com/tools/rendered-dom-paste-audit/), [Uptime + Response-Time Diagnostic](https://jwatte.com/tools/uptime-check/), [Meta + OG Inspector](https://jwatte.com/tools/meta-og-inspector/), [Featured-Snippet Extractability Audit](https://jwatte.com/tools/featured-snippet-extractability/), [SGE Readiness Audit](https://jwatte.com/tools/sge-readiness-audit/), [Platform Audit](https://jwatte.com/tools/platform-audit/), [Monoclone Gen.](https://jwatte.com/tools/monoclone-generator/). - [ ] **1.1 Site serves a real page (not a parked domain, error page or empty response)** - Pass: The URL returns a page with real content and a title, not a parking page, DNS error or empty body. - Numbers and lists the tool uses: HTML shorter than 100 chars fails; first 2000 chars must not match /domain is for sale|buy this domain|parked|not found|dns.*error|this site can|no server|unable to connect/i; HTML under 500 chars must contain `Just a moment|challenges\.cloudflare\.com|Sorry, you have been blocked|Incapsula incident ID|aws-waf-token|Akamai bot manager|enable javascript and cookies to continue/i (Mega Analyzer); a challenge is suspected after a status of 0, 403, 405, 429 or 503 (Internal Link Auditor); retrievers to allowlist: Googlebot-Image, GPTBot-User, ClaudeBot, PerplexityBot, Applebot (Image Alt Audit). - Why: Search engine and AI crawlers hit the same wall as any automated visitor, so a challenge page means they see nothing to index or cite. - Fix: Exempt verified crawlers and static discovery files (robots.txt, sitemap.xml, images) from bot challenges at the WAF or CDN, and verify the pages in a real browser. - Verify: [Internal Link Auditor](https://jwatte.com/tools/internal-link-auditor/), [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/), [Image Alt Audit](https://jwatte.com/tools/image-alt-audit/), [Schema Validator](https://jwatte.com/tools/schema-validator/) and 3 more. - [ ] **1.3 robots.txt served at the site root** - Pass: GET /robots.txt returns HTTP 200 with plain-text content. - Numbers and lists the tool uses: Path /robots.txt; body must be non-HTML text longer than 5 chars with upstream status under 400 (Batch Analyzer) or longer than 10 chars (E-E-A-T Analyzer); status 200 and at least one User-agent: directive matching /user-agent\s*:/i, with text/plain named only in the fix text and not checked (Agent-Ready Audit); status 200 (Migration Analyzer); recommended content User-agent: *, Allow: /, a Sitemap: line and Unix line endings (Single-Site Generator); missing file is a critical crawl fail (Mega Analyzer, Batch Analyzer, Mega Batch) with impact 4 (Mega SEO Analyzer), a warn in the Analyzer network checks and a fail in AI Posture Audit. - Why: It is the first file every crawler reads; Google crawls without one, but AI crawlers need explicit rules and fall back to per-bot defaults when it is missing. - Fix: Publish /robots.txt at the origin root with at least 'User-agent: *' and 'Allow: /' plus a Sitemap: line, served as text/plain. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [AI Posture Audit](https://jwatte.com/tools/ai-posture-audit/), [Agent Ready Audit](https://jwatte.com/tools/agent-ready-audit/), [E-E-A-T Audit](https://jwatte.com/tools/eeat-analyzer/) and 6 more. Standard: RFC 9309. - [ ] **1.4 robots.txt rules are grouped under User-agent lines** - Pass: Every Allow and Disallow line sits directly below the User-agent line(s) it applies to, so each bot resolves to exactly one rule group. - Fail: A rule that appears before any User-agent line is ignored, and lines that are not user-agent, allow or disallow (such as Crawl-delay) carry no crawl effect. - Numbers and lists the tool uses: Directive syntax /^([a-z-]+):\s*(.*)$/i after stripping comments /#.*$/; recognized keys user-agent, disallow, allow; a bot matches a group only by exact token equality (Googlebot-Image does not inherit Googlebot), falls back to the * group, and when several groups name the same token the last one wins (Robots.txt Simulator). - Why: A misplaced rule silently does nothing, so a block you think is in place may not be, or a bot you meant to allow may fall through to a stricter group. - Fix: Put each User-agent line directly above its Allow and Disallow lines, name each bot token exactly, and keep one group per bot. - Verify: [robots.txt Simulator](https://jwatte.com/tools/robots-txt-simulator/). Standard: RFC 9309. - [ ] **1.5 Page path is not blocked by a robots.txt Disallow rule** - Pass: No Disallow rule in the User-agent: * group (or the group for the bot you care about) equals / or matches the page path. - Numbers and lists the tool uses: Groups split on blank lines; comments stripped with /#.*$/; only groups whose User-agent includes * are evaluated; a rule blocks when it equals / or the path starts with it (Mega Analyzer, Analyzer, E-E-A-T Analyzer, Batch Analyzer, Mega Batch); per-bot simulation uses longest-match precedence over pathname plus query, * as wildcard and $ as end anchor, and on equal pattern length the rule listed first in the group wins (Robots.txt Simulator); severity critical. - Why: A blocked path is never crawled, so the page cannot be indexed no matter how good it is. - Fix: Remove or narrow the Disallow rule, or add an Allow rule at least as long as the blocking pattern for paths that should be crawled. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [robots.txt Simulator](https://jwatte.com/tools/robots-txt-simulator/), [E-E-A-T Audit](https://jwatte.com/tools/eeat-analyzer/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/) and 4 more. Standard: RFC 9309. - [ ] **1.6 robots.txt declares a Sitemap: line** - Pass: Robots.txt contains at least one line starting with Sitemap: followed by the absolute sitemap URL. - Warn: Missing Sitemap: line (warn in every tool that checks it). - Numbers and lists the tool uses: Regex /^\s*sitemap\s*:/mi (Mega Analyzer, Analyzer, E-E-A-T Analyzer, Batch Analyzer); /^\s*sitemap\s*:\s*(\S+)/mi (Mega Batch); /^\s*Sitemap\s*:\s*(\S+)/gim, first 3 listed (Agent-Ready Audit); severity warn; generated form 'Sitemap: ``/sitemap.xml' with an optional commented sitemap-image.xml line (AI Bot Policy Generator). - Why: Crawlers and AI bots find the sitemap directly from the file they read first instead of guessing paths. - Fix: Add 'Sitemap: https://yourdomain.com/sitemap.xml' (absolute URL on the canonical host) to robots.txt. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Agent Ready Audit](https://jwatte.com/tools/agent-ready-audit/), [E-E-A-T Audit](https://jwatte.com/tools/eeat-analyzer/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/) and 5 more. Standard: sitemaps.org robots.txt Sitemap directive. - [ ] **1.7 robots.txt Sitemap: URL uses the canonical domain** - Pass: The hostname in the Sitemap: URL equals the site's canonical hostname. - Numbers and lists the tool uses: Sitemap URL parsed with /Sitemap:\s*(https?:\/\/\S+)/i; hostname compared with the canonical hostname, falling back to the page hostname when no canonical is set (Analyzer); compared with the canonical hostname only when a canonical is present (Batch Analyzer). - Why: Google follows this URL first; if it lands on a redirect the sitemap may not be processed at all. - Fix: Write the Sitemap: line as https://example.com/sitemap.xml on the canonical host, not a www or http variant. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/). - [ ] **1.8 Sitemap declared in robots.txt is reachable and valid** - Pass: The file that the Sitemap: line points at returns a urlset or sitemapindex document. - Fail: Robots.txt points at a /sitemap.xml that returns a 404 or a body without a urlset or sitemapindex root (critical). - Numbers and lists the tool uses: Gate: declared URL matches /\/sitemap\.xml\/?$/i so custom paths like /wp-sitemap.xml are not evaluated; body must match urlset or sitemapindex; severity critical (Mega Batch). - Why: A declared but broken sitemap is worse than none, because every crawler follows the declaration straight into a dead file. - Fix: Fix the declared sitemap so it returns valid XML, or point the Sitemap: line at the file that actually exists. - Verify: [Mega Batch](https://jwatte.com/tools/mega-batch/). Standard: sitemaps.org. - [ ] **1.9 XML sitemap served at a standard path** - Pass: A sitemap answers with HTTP 200 at /sitemap.xml or another standard path, or at the URL declared in robots.txt. - Fail: No sitemap at any probed path and none declared in robots.txt (critical). - Numbers and lists the tool uses: Paths probed: /sitemap.xml, /sitemap_index.xml, /wp-sitemap.xml, /sitemap-index.xml, /sitemap1.xml, /sitemap.xml.gz, plus any robots.txt Sitemap: line including cross-origin ones (Mega Analyzer); /sitemap.xml, /sitemap_index.xml, /sitemap-index.xml, /sitemaps.xml (Mega SEO Analyzer); /sitemap.xml, /sitemap_index.xml, /sitemap-index.xml with a body whose first 500 chars do not match /not found|404/i (Index Coverage Delta); /sitemap.xml only (Analyzer, E-E-A-T Analyzer, Duplicate Title/Meta Audit, Migration Analyzer, Batch Analyzer, Mega Batch); body must be non-HTML text, capped at 50000 chars (Batch Analyzer); missing is a critical crawl fail with impact 3 (Mega SEO Analyzer). - Why: The sitemap is the most reliable way to hand every URL to Google, Bing and IndexNow; without it, deep pages depend on link discovery alone. - Fix: Publish a sitemap at /sitemap.xml (or a sitemap index there) and declare it in robots.txt; submit it in Google Search Console and Bing Webmaster Tools after every deploy that changes the URL set. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/), [Duplicate Title / Meta Description Audit](https://jwatte.com/tools/duplicate-title-meta-audit/), [Agent Ready Audit](https://jwatte.com/tools/agent-ready-audit/) and 6 more. Standard: sitemaps.org. - [ ] **1.10 Sitemap is valid XML with a urlset or sitemapindex root** - Pass: The sitemap parses as XML and its root element is urlset or sitemapindex. - Fail: File is served but has no urlset or sitemapindex root, or the XML has a parse error (critical). - Numbers and lists the tool uses: Root regex /<(urlset|sitemapindex)\b/i (Mega Analyzer, Analyzer, E-E-A-T Analyzer, Batch Analyzer, Mega Batch); /``` entries. - Fail: Sitemap parses but contains no ```` entries, so tools that read it find nothing to crawl. - Numbers and lists the tool uses: `` regex /``\s*([^<\s]+)\s*<\/loc>/gi with duplicates removed (Search Console Importer); only http(s) locs kept (Mega SEO Analyzer); sitemap-index children walked: first 3 (Duplicate Title/Meta Audit, Mega SEO Analyzer), first 5 (Sitemap Audit), first 12 (Index Coverage Delta), first 20 (Link Graph); more than 500 URLs flagged as a large site (Migration Analyzer). - Why: An empty sitemap advertises nothing and reads as an unmaintained site. - Fix: Generate the sitemap from the real page list at build time so every indexable page appears as a ```` entry. - Verify: [Search Console + Bing Importer](https://jwatte.com/tools/search-console-importer/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Duplicate Title / Meta Description Audit](https://jwatte.com/tools/duplicate-title-meta-audit/), [Link Graph](https://jwatte.com/tools/link-graph/) and 2 more. Standard: sitemaps.org. - [ ] **1.12 Sitemap index references child sitemaps** - Pass: A sitemapindex lists one or more child sitemap `` entries. - Warn: Index contains zero child .xml locs (Mega Analyzer); children beyond the fifth are not audited (Sitemap Audit). - Numbers and lists the tool uses: Gate /`([^<]+\.xml)<\/loc>/gi (Mega Analyzer); first 5 children expanded (Sitemap Audit). - Why: An empty index feeds nothing to crawlers, and unused children waste crawl budget. - Fix: List every child sitemap loc in the index and prune children that no longer contain indexed pages. - Verify: [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). Standard: sitemaps.org. - [ ] **1.13 Sitemap URLs use the canonical domain** - Pass: The hostname of the sitemap's `` entries equals the canonical hostname. - Numbers and lists the tool uses: First `` hostname compared with the canonical (or page) hostname via /``(.*?)<\/loc>/gi; requires a canonical to be present (Analyzer, Batch Analyzer). - Why: Google follows each sitemap URL, hits the redirect to the real host, and reports 'Page with redirect' instead of indexing. - Fix: Regenerate the sitemap with canonical hostnames (find and replace across sitemap.xml or fix the site domain in the sitemap template). - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/). - [ ] **1.14 No /index.html URLs in the sitemap** - Pass: No sitemap entry path ends in /index.html or /index.htm. - Numbers and lists the tool uses: Regex /\/index\.html/i (Analyzer, Batch Analyzer); /\/index\.html?$/i (Sitemap Audit, Index Coverage Delta); listed as a GSC 'Page with redirect' risk pattern. - Why: If / and /index.html both serve the same content, Google reports 'Duplicate without user-selected canonical' or 'Page with redirect' for every one of them. - Fix: Strip the filename so entries read /path/, and 301 /index.html to / (netlify.toml redirect with force=true, vercel.json redirect, Cloudflare _redirects, Apache RewriteRule or Nginx return 301). - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/). Standard: Google Search Console 'Page with redirect' report. - [ ] **1.15 Sitemap uses one host (no www and apex mix)** - Pass: Every sitemap entry shares one hostname. - Fail: More than one hostname appears and the minority host is the www or apex twin of the dominant host. - Numbers and lists the tool uses: Hostnames lowercased; dominant host = most entries; apex derived with .replace(/^www\./, ''); listed up to 50 (Sitemap Audit). - Why: The non-canonical host family always 301s, so GSC flags every such entry as 'Page with redirect'. - Fix: Pick one canonical host and normalize every sitemap entry to it. - Verify: [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/). Standard: Google Search Console 'Page with redirect' report. - [ ] **1.16 Sitemap uses one trailing-slash convention** - Pass: Inner-page entries all end with a slash or all end without one, and no path appears in both forms. - Warn: Inner pages mix with-slash and without-slash forms (Analyzer). - Fail: The same origin plus path appears in both slash variants (Sitemap Audit). - Numbers and lists the tool uses: Inner pages = pathname not / with length over 1; URLs ending in a 2 to 5 char file extension /\.\w{2,5}$/ are excluded (Analyzer); extension exclusion /\.[a-z0-9]{2,6}$/i, key = origin plus pathname without trailing slash, listed up to 50 (Sitemap Audit). - Why: Hosts 301 between /foo and /foo/, so mixed forms guarantee redirect hops and 'Redirect error' reports in Search Console. - Fix: Pick one pattern site-wide and redirect the other (netlify.toml 301, vercel.json trailingSlash, Cloudflare Transform Rules, Apache RewriteRule or Nginx rewrite). - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/). Standard: Google Search Console 'Page with redirect' report. - [ ] **1.17 Sitemap lastmod values are recent and accurate** - Pass: A healthy share of sitemap entries carry a lastmod within the last 90 days. - Warn: Fewer than 30% of entries updated within 90 days (Mega Analyzer); any entry older than 90 days (Sitemap Audit). - Numbers and lists the tool uses: Window 90 days (90*86400*1000 ms); pass ratio 30% or more; gate 3 or more url entries (Mega Analyzer); stale = Date.parse(lastmod) older than now minus 90*24*3600*1000 ms (Sitemap Audit); newest and oldest lastmod reported as info via /``(.*?)<\/lastmod>/gi (Analyzer). - Why: Bing and Yandex use lastmod to decide what to re-crawl first, so stale dates push your pages down the queue. - Fix: Have the build write lastmod from the real content change date, never from the build time, so dates move only when content does. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). Standard: sitemaps.org lastmod. - [ ] **1.18 Every sitemap entry has a lastmod** - Pass: Each `` node carries a `` element. - Warn: One or more entries have no lastmod (Sitemap Audit). - Numbers and lists the tool uses: Any `` without `` counts as missing (Sitemap Audit); expected format ISO 8601 with timezone on every indexable page (Single-Site Generator). - Why: Without lastmod, crawlers cannot prioritize changed pages and treat the whole sitemap as unknown age. - Fix: Emit lastmod in ISO 8601 with timezone for every entry, written automatically by the build when content changes. - Verify: [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Single Site Gen](https://jwatte.com/tools/single-site-gen/), [Site Migration Gen](https://jwatte.com/tools/site-migration-gen/). Standard: sitemaps.org lastmod; ISO 8601. - [ ] **1.19 No future-dated lastmod in the sitemap** - Pass: No lastmod is later than the current time. - Warn: Any lastmod more than one day in the future (Sitemap Audit). - Numbers and lists the tool uses: future = Date.parse(lastmod) greater than now plus 24*3600*1000 ms (Sitemap Audit). - Why: Future dates tell crawlers the sitemap is unreliable, which undermines every other lastmod. - Fix: Remove or correct future-dated lastmod values and fix the timezone handling that produced them. - Verify: [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/). Standard: sitemaps.org lastmod. - [ ] **1.20 Sitemap URLs return HTTP 200 (no 4xx or 5xx)** - Pass: Every probed sitemap URL responds with a 2xx status. - Fail: Any sitemap URL returns a status of 400 or higher, or fails to respond (status 0). - Numbers and lists the tool uses: Broken = status 400 or higher or status 0 (Analyzer site crawl, first 50 sitemap URLs); status 400 or higher only, status 0 not counted (Index Coverage Delta); stat counts 404 while the list holds any status 400 or higher, first 200 probed by default, up to 900 (Sitemap Audit); status 400 or higher or status 0 with classes 4xx and 5xx, on pasted URLs up to 200 rather than sitemap entries (Redirect Chain Audit). - Why: Google de-trusts a sitemap that lists broken URLs and reports each as 'Submitted URL not found (404)' within a week. - Fix: Restore each broken page or remove it from the sitemap, then regenerate and resubmit the sitemap. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/). - [ ] **1.21 Sitemap URLs do not redirect** - Pass: Every sitemap URL responds 2xx directly rather than with a 3xx. - Warn: Any sitemap entry answers 301 or 302 (Analyzer site crawl, Index Coverage Delta, Sitemap Audit). - Numbers and lists the tool uses: Redirect band 300 to 399 (Analyzer, Index Coverage Delta); stat counts 301 plus 302 while the list holds any 3xx, listed up to 200 (Sitemap Audit); flagged as a GSC 'Page with redirect' pattern (Index Coverage Delta). - Why: Sitemaps should name terminal URLs; each redirecting entry becomes a 'Page with redirect' report and a wasted crawl. - Fix: Replace each redirecting entry with its final destination URL. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/). Standard: Google Search Console 'Page with redirect' report. - [ ] **1.22 Sitemap pages are self-canonical** - Pass: Each sitemap page's resolves to its own URL (trailing-slash variants tolerated). - Warn: A page's canonical points to a different URL (Analyzer site crawl, Index Coverage Delta). - Fail: The fetched page declares a canonical that, resolved against the final URL, differs from it, whether or not a redirect occurred (Redirect Chain Audit fail flag canonical!=final). - Numbers and lists the tool uses: canonical must equal the URL with or without one trailing slash (Analyzer); canonical resolved against the page and normalized (hash stripped, trailing slash removed) must equal the page URL (Index Coverage Delta); canonical regex /]*rel=["']?canonical["']?[^>]*href=["']?([^"'>\s]+)/i on the first 10000 chars, resolved against the final URL (Redirect Chain Audit). - Why: A sitemap URL whose canonical points elsewhere is asking Google not to index it; one of the two signals is wrong. - Fix: Make each listed page self-canonical, or drop the non-canonical URL from the sitemap; when the canonical is right, redirect to it instead. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/), [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/). - [ ] **1.23 No noindex pages listed in the sitemap** - Pass: No sitemap URL carries a meta robots noindex. - Numbers and lists the tool uses: Regex /noindex/ on the lowercased meta[name=robots] content of pages in the sitemap (Index Coverage Delta). - Why: The sitemap asks Google to index the page while the tag asks it not to; the conflict wastes crawl budget and confuses coverage reports. - Fix: Remove the URL from the sitemap or remove the noindex tag; the same URL cannot do both. - Verify: [Index Coverage Delta](https://jwatte.com/tools/index-coverage-delta/). - [ ] **1.24 No CMS-default placeholder pages in the sitemap** - Pass: No sitemap URL has an unmodified CMS default slug such as hello-world or sample-page. - Fail: Any placeholder slug is listed (critical). - Numbers and lists the tool uses: Regex /\/(?:hello[-_]world|sample[-_]page|sample[-_]post|untitled[-_]?(?:post|page|draft)?|blog[-_]post[-_]title[-_]?(?:one|two|three|four|five|[0-9]+)|coming[-_]?soon|placeholder[-_]?(?:page|post)?|lorem[-_]ipsum|new[-_]page|new[-_]post|test[-_]?(?:page|post|123)|page[-_]title|my[-_]first[-_](?:post|page)|default[-_]?(?:page|post))(?:-[a-z0-9]{4,8}){0,3}\/?$/i (Mega Analyzer). - Why: Placeholder pages tell site: queries and AI engines the site is unmaintained. - Fix: Delete, replace or unpublish the placeholder posts, then resubmit the sitemap in Search Console. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.25 No republished-draft random-suffix URL tails in the sitemap** - Pass: No sitemap URL ends in two or more random 5-character groups appended on re-publish. - Warn: Any such URL is listed (Mega Analyzer). - Numbers and lists the tool uses: Regex /\/[a-z0-9]+(?:-[a-z0-9]{2,})*(?:-(?=[a-z]*\d)[a-z0-9]{5}){2,}\/?$/i; Google displays roughly 70 chars of a URL (Mega Analyzer). - Why: Squarespace and similar builders append a suffix on every re-publish, leaving unstable URLs that lose backlinks. - Fix: Rename the slug to a clean form and add a 301 URL mapping from the suffixed version. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.26 No duplicate home-page aliases in the sitemap** - Pass: The sitemap lists / once with no alias paths such as /home or /welcome. - Warn: Root plus one or more aliases, or 2 or more aliases with no root (Mega Analyzer). - Numbers and lists the tool uses: Alias regex /\/(home(?:[-_][0-9a-z]+)?|welcome|index(?:[-_]old)?|landing(?:[-_]old)?|start[-_]here[-_](?:old|copy)|home[-_](?:copy|old|new|test))\/?$/i; threshold 2 aliases when no root is present (Mega Analyzer). - Why: Link equity splits across the aliases instead of consolidating on /. - Fix: Delete or noindex the aliases, 301 them to /, and resubmit the sitemap. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.27 Image sitemap served** - Pass: A /sitemap-image.xml file is served at the site root. - Warn: Missing on an image-heavy or editorial site (Mega Analyzer, Analyzer). - Numbers and lists the tool uses: Path /sitemap-image.xml; gate 10 or more images, or schema type matching /^(ImageGallery|Photograph|VisualArtwork|Painting|Sculpture)$/, or editorial context (Mega Analyzer); gate 5 or more images on the page (Analyzer); scored but never fetched (Batch Analyzer); hero images on Article and Recipe pages recommended because Google Discover prefers them (Sitemap Audit). - Why: Google Images and multimodal AI retrieval read image sitemaps to find and rank your pictures. - Fix: Publish sitemap-image.xml listing hero and gallery images and reference it from the main sitemap index. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Sitemap Audit](https://jwatte.com/tools/sitemap-audit/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/). Standard: Google image sitemap. - [ ] **1.28 X-Robots-Tag header does not force noindex** - Pass: The X-Robots-Tag response header is absent or does not contain noindex. - Fail: Header contains noindex (critical). - Numbers and lists the tool uses: Header keys x-robots-tag / X-Robots-Tag; regex /noindex/i; check only runs when the header exists (Analyzer, Batch Analyzer); binary score 0 or 100 combined with meta robots (Mega AEO Analyzer); severity critical. - Why: A header-level noindex overrides the page markup and blocks indexing site-wide without anything visible in the HTML. - Fix: Remove the noindex directive from the server or CDN header configuration on pages that should rank. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/), [Mega AEO Analyzer](https://jwatte.com/tools/mega-aeo-analyzer/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/) and 2 more. Standard: Google X-Robots-Tag. - [ ] **1.29 Missing URLs return a real HTTP 404 (no soft 404)** - Pass: A request for a nonexistent path returns HTTP 404 with a helpful 404 page. - Warn: The probe redirects (3xx) instead of returning 404, or the 404 page body is under 200 characters (Analyzer, Indexing Hygiene Checks). - Fail: The nonexistent path returns HTTP 200 (soft 404; fail in Indexing Hygiene Checks, warn 'Possible soft 404' in the Analyzer). - Numbers and lists the tool uses: Probe path origin + /__jw-probe-<6 random base-36 chars>/ (Indexing Hygiene Checks) or origin + /this-page-should-not-exist-404-test-`` (Analyzer); Indexing Hygiene Checks: 200 = soft 404 fail, 300 to 399 = warn, any other non-404 status = info; Analyzer: expected status 404 or 0, body over 200 chars = pass, body under 200 chars = warn minimal page, any other status with a longer body = warn possible soft 404. - Why: Soft 404s make Google treat every phantom URL as indexable, bloating the crawl queue, and redirect-to-home patterns produce 'Page with redirect' reports. - Fix: Configure the server or framework to return a real 404 status for missing pages, and give the 404 template navigation and search so visitors can recover. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/). Standard: Google Search Console 'Page with redirect' report. - [ ] **1.30 404 template is marked noindex** - Pass: The 404 page carries `` whose content includes noindex. - Warn: The 404 template has no robots meta at all (Analyzer, Indexing Hygiene Checks). - Fail: A robots meta is present but its content lacks noindex, or a page whose title or H1 reads like a not-found page is not noindexed. - Numbers and lists the tool uses: Robots meta regex /]*name=["']robots["'][^>]*content=["']([^"']+)["'][^>]*>/i tested with /noindex/; warn gate status 404 and HTML longer than 200 chars; 404-language regex /404|not\s*found|page\s*missing|can(?:['’]|no)t\s*find/i on lowercased title plus first H1 (Indexing Hygiene Checks). - Why: Without noindex, Google treats every missing URL as an indexable page. - Fix: Add `` to the 404 template. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/). - [ ] **1.31 404 template emits no canonical tag** - Pass: The HTML served for a missing URL contains no . - Warn: A canonical tag with any href, even a self-canonical, is present on the 404 template (Analyzer, Indexing Hygiene Checks). - Numbers and lists the tool uses: Canonical regex /]*rel=["']canonical["'][^>]*>/i with href from /href=["']([^"']+)["']/i; the /404 self-canonical case is the separate canonical-bleed check (Indexing Hygiene Checks). - Why: Even a self-canonical tells Google the missing URL is a real, indexable page. - Fix: Wrap the canonical output in an 'if not noindex' condition in the template so 404 pages never emit it. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/). - [ ] **1.32 No canonical pointing at /404.html** - Pass: Neither the page nor the 404 template declares a canonical whose href is the 404 page. - Fail: The canonical href matches the /404 pattern (fail in the Analyzer probe and in both Indexing Hygiene Checks entry points). - Numbers and lists the tool uses: Self-404 regex /\/404(?:\.html?|\/)?(?:[?#]|$)/i on the canonical href (Analyzer, Indexing Hygiene Checks). - Why: Google reads it as '/404.html is the canonical version of this URL', which is the number one cause of the 'Alternate page with proper canonical tag' report. - Fix: Wrap canonical and hreflang output in 'if not noindex' in the template and set noindex on the 404 page. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/). Standard: Google Search Console 'Alternate page with proper canonical tag' report. - [ ] **1.33 404 template emits no hreflang links** - Pass: The 404 page contains zero tags. - Warn: One or more hreflang links appear on the 404 template or on a page that reads like a 404 (Analyzer, Indexing Hygiene Checks). - Numbers and lists the tool uses: Regex /]*rel=["']alternate["'][^>]*hreflang=/gi, count over 0 (Analyzer, Indexing Hygiene Checks). - Why: Every missing URL would claim international alternates, confusing Google's indexing. - Fix: Wrap hreflang output in 'if not noindex' in the template. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/). - [ ] **1.34 Server-rendered HTML contains the page content (not a blank app shell)** - Pass: The raw HTML delivered by the server already contains the headings, copy and JSON-LD; it is not an empty mount point waiting for JavaScript. - Warn: A known client-rendered platform fingerprint, a noscript message about needing JavaScript, or a thin shell (HTML over 30000 bytes with under 200 visible words) is detected on a 2xx response and a banner points to the rendered-DOM workflow (Mega Analyzer via waf-detect.js detectSpaShell, informational, skipped in paste mode). - Fail: Raw HTML contains a known SPA mount div and lacks either an H1 or 150 words (critical, Mega Analyzer not_spa_shell); in the laundromat, self-storage, auto-wash and handyman vertical modules, SPA markers with under 120 raw words while the rendered page has over 250 add a client-rendered SPA issue. - Numbers and lists the tool uses: Mount ids root, app, __next, __nuxt, __svelte, gatsby-focus-wrapper, ___gatsby, __remix; shell = mount present and not (H1 count over 0 and word count 150 or more) (Mega Analyzer); when a bot-challenge page is returned the row is downgraded to warn; vertical modules: SPA markers /]+id=["'](?:root|app|__next|__nuxt)["'][^>]*>\s*<\/div>|__NEXT_DATA__|window\.__NUXT__|data-reactroot|ng-version|` is critical; a page with a title and under 200 chars of body text is critical (audit-toolkit.js jwScanForJSInjectedShells, surfaced by Mega Analyzer). - Why: AI crawlers and non-JS fetchers miss whatever is injected into an empty container. - Fix: Render the container server-side so its content is present in the initial HTML. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.36 Rendered DOM matches server HTML (no checks that only pass after hydration)** - Pass: No check changes severity between the server HTML and the rendered DOM. - Warn: One or more checks are changed or rendered-only (Rendered DOM Paste Audit). - Numbers and lists the tool uses: Compared only when a URL is supplied with the pasted DOM; the same 10 checks run on both documents: title present, meta description present, H1 count (1 pass, 0 fail, 2 or more warn), canonical present (else warn), html lang present (else fail), JSON-LD block count over 0 (else warn), every img has alt (else warn), main-content word count (300 or more pass, 100 to 299 warn, under 100 fail), internal links 3 or more (else warn); a diff row is 'changed' when the severity differs between static and rendered and 'rendered-only' when the static side has no such check (Rendered DOM Paste Audit). - Why: Googlebot's first pass reads the static HTML, so anything that only appears after hydration is missed on that pass. - Fix: Move the differing elements (schema, headings, canonical, links) into the server-rendered HTML. - Verify: [Rendered DOM Paste Audit](https://jwatte.com/tools/rendered-dom-paste-audit/). - [ ] **1.37 Mobile version is not thinner than desktop** - Pass: The mobile version of the page has the same word count, H2s and schema types as the desktop version. - Fail: Desktop exceeds mobile by more than 200 words, or desktop has more H2s or more schema types than mobile (flagged as PARITY ISSUE DETECTED in the AI fix prompt). - Numbers and lists the tool uses: AI prompt flag: desktop word count minus mobile over 200, or desktop H2 count minus mobile over 0, or desktop schema-type count minus mobile over 0; Mobile parity score starts at 100: absolute word gap over 200 = minus 25, over 50 = minus 10; H2 overlap below 90 percent = minus 25; schema-type overlap below 100 percent = minus 20; HTML size gap over 30 KB = minus 10; only evaluated when a mobile fetch exists (Mega Analyzer). - Why: Mobile-first indexing means Google ranks the thinner mobile version. - Fix: Serve the same content, headings and schema to mobile visitors as to desktop. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). Standard: Google mobile-first indexing. - [ ] **1.38 Page URL resolves without a redirect** - Pass: The requested URL is the final URL, or differs only by trailing slash or http to https on the same host; a www to apex flip is also tolerated by Mega Analyzer (and marked expected-canonical by Redirect Chain Audit) but not by Batch Analyzer, Mega Batch or Analyzer. - Warn: Cross-domain redirect, path rename, consolidation to the homepage, or a query or protocol change (Mega Analyzer, Batch Analyzer, Mega Batch, Analyzer, Redirect Chain Audit). - Numbers and lists the tool uses: Mega Analyzer: trivial = same host, same path after stripping trailing slashes and same query; or http to https on the same host, path and query; or apex to www (hosts compared after stripping /^www\./i) with the same path and query; otherwise warn. Batch Analyzer and Mega Batch: trivial = same lowercased host, same path after stripping trailing slashes and same query, or http to https on the same host, path and query; a www flip is reported as a cross-domain redirect; warn. Analyzer: warn when the hostname or the exact pathname differs; consolidation pattern dst.pathname === '/' or /^\/(research|articles|archive|category|tag)\/?$/. Uptime Check: info when the final URL differs from the input, pass 'No redirects' otherwise. Redirect Chain Audit: redirected = final URL differs from the start URL, cross-origin flag when the hostname differs, expected-canonical info flag when hosts match after stripping www and the path is unchanged for a www flip or http upgrade. - Why: Every hop costs a crawl and leaks a little authority, and external links to the old path bleed on every visit. - Fix: Update internal links, canonical and sitemap entries to the final URL and ask linking sites to re-point backlinks. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Uptime + Response-Time Diagnostic](https://jwatte.com/tools/uptime-check/), [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/) and 2 more. - [ ] **1.39 Redirect chains are one hop at most** - Pass: Any redirect reaches its final URL in a single hop. - Warn: A chain records more than 2 entries (Redirect Chain Audit). - Numbers and lists the tool uses: Chain entries over 2 (Redirect Chain Audit KPI 'Long chains (>2)' and prompt rows with hops over 2); the chain is approximated as the start URL plus the fetch's auto-followed final URL, so intermediate hops are not recorded; redirect loops (final URL equals an intermediate hop) appear only as a task in the AI fix prompt. - Why: Chains longer than two hops leak PageRank and exhaust AI-crawler retry budgets. - Fix: Collapse each chain with a single 301 from the first URL to the final URL in your Netlify _redirects, Apache .htaccess or nginx config, fixing loops first. - Verify: [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/). - [ ] **1.40 No https-to-http redirect downgrade** - Pass: A URL that starts on https never redirects to http. - Fail: The start URL is https: and the final URL is http: (flag 'https->http (DOWNGRADE)', rendered as a fail flag). - Numbers and lists the tool uses: Start protocol https: and final protocol http: (Redirect Chain Audit). - Why: A downgrade drops visitors and crawlers onto an insecure page. - Fix: Fix the server config so HTTPS stays HTTPS through every redirect. - Verify: [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/). - [ ] **1.41 Links point at https directly (no http-to-https upgrade hop)** - Pass: The traced URL starts on https, so no upgrade redirect is needed. - Warn: Start protocol is http and the final is https (Redirect Chain Audit). - Numbers and lists the tool uses: Start protocol http: and final protocol https: (Redirect Chain Audit). - Why: The upgrade hop is harmless for the site but wasted for every link that still uses http. - Fix: Link to the https URL directly in internal links, the sitemap and outreach. - Verify: [Redirect Chain Audit](https://jwatte.com/tools/redirect-chain-audit/). - [ ] **1.42 No meta refresh redirects** - Pass: The final page does not redirect with ``. - Warn: A meta refresh tag appears in the first 4000 characters (Redirect Chain Audit). - Numbers and lists the tool uses: Regex /]+name=["']robots["'][^>]+content=["'][^"']*noindex/i (Featured Snippet Extractability); /noindex/i on the X-Robots-Tag header or /]+name=["']robots["'][^>]+noindex/i on the HTML, binary score 0 or 100 (Mega AEO Analyzer); expected default index,follow on canonical pages (Single-Site Generator, Site Migration Generator). - Why: A noindex page is invisible to search and AI crawlers, cannot win featured snippets, and is a dead end for link authority. - Fix: Remove noindex from any page that should rank; keep it only on pages you deliberately hide. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Meta + OG Inspector](https://jwatte.com/tools/meta-og-inspector/), [Featured-Snippet Extractability Audit](https://jwatte.com/tools/featured-snippet-extractability/), [E-E-A-T Audit](https://jwatte.com/tools/eeat-analyzer/) and 6 more. Standard: Google robots meta tag. - [ ] **1.44 Meta robots declared explicitly** - Pass: The page carries a `` tag with an explicit directive. - Warn: No meta robots tag; the browser default of index,follow applies (Meta OG Inspector warns, AI Posture Audit reports as info). - Numbers and lists the tool uses: Recommended value max-snippet:-1, max-image-preview:large (AI Posture Audit). - Why: Not required, but an explicit declaration removes ambiguity for AI engines and lets you open up snippet and image-preview limits. - Fix: Add `` to indexable pages. - Verify: [Meta + OG Inspector](https://jwatte.com/tools/meta-og-inspector/), [AI Posture Audit](https://jwatte.com/tools/ai-posture-audit/). Standard: Google robots meta tag. - [ ] **1.45 Page does not set max-snippet:0** - Pass: No robots meta tag sets max-snippet to 0. - Fail: A robots meta sets max-snippet:0 (Featured Snippet Extractability). - Numbers and lists the tool uses: Regex /]+name=["']robots["'][^>]+content=["'][^"']*max-snippet:\s*0/i (Featured Snippet Extractability). - Why: Max-snippet:0 opts the page out of snippets, so it can never be quoted in a featured snippet or AI answer. - Fix: Remove the max-snippet:0 directive (or set max-snippet:-1) on pages you want quoted. - Verify: [Featured-Snippet Extractability Audit](https://jwatte.com/tools/featured-snippet-extractability/). Standard: Google robots meta tag max-snippet directive. - [ ] **1.46 Canonical URL set** - Pass: The page declares a `` with an absolute https href pointing at itself. - Warn: Missing canonical (Analyzer, Mega SEO Analyzer, SGE Readiness Audit, Platform Audit, Rendered DOM Paste Audit). - Fail: Missing canonical (Mega Analyzer, Meta OG Inspector); missing canonical forfeits 10 of the SEO bucket points in Batch Analyzer and 12 in Mega Batch. - Numbers and lists the tool uses: Regex /]+rel=["']canonical["']/i (Mega SEO Analyzer); href must be non-empty (SGE Readiness Audit); link[rel="canonical"] present, weight 10 in the SEO bucket (Batch Analyzer) and 12 (Mega Batch); expected self-referencing absolute https form on every page (Single-Site Generator); canonical present is a pre-deploy quality gate (Monoclone Generator). - Why: Without a canonical, Google has to guess the preferred URL among www, trailing-slash and query variants, and AI Overviews may attribute the wrong version. - Fix: Add `` with the page's own preferred URL. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Meta + OG Inspector](https://jwatte.com/tools/meta-og-inspector/), [SGE Readiness Audit](https://jwatte.com/tools/sge-readiness-audit/), [Platform Audit](https://jwatte.com/tools/platform-audit/) and 7 more. Standard: RFC 6596 (rel=canonical). - [ ] **1.47 Canonical points at this site's own domain** - Pass: The canonical hostname equals the page's final served hostname, or at least the same registrable domain. - Warn: Canonical is on a different host or registrable domain, or fails to parse (Mega Analyzer, Analyzer). - Fail: Canonical hostname differs from the final served hostname on a non-provisional host (Analyzer). - Numbers and lists the tool uses: Hostnames compared after stripping /^www\./i (Mega Analyzer); compared against the post-redirect final URL (Analyzer); provisional hosts /\.(netlify\.app|vercel\.app|pages\.dev|web\.app|firebaseapp\.com|github\.io|onrender\.com|fly\.dev)$/i are reported as info during DNS cutover (Analyzer); canonicals must resolve to the same origin (Single-Site Generator). - Why: A canonical on another domain hands your authority to that domain and produces 'Alternate page with proper canonical tag' in Search Console. - Fix: Make the canonical match your live preferred URL exactly, then update sitemap.xml and robots.txt to the same domain; only keep a cross-domain canonical for deliberately republished content. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/), [Single Site Gen](https://jwatte.com/tools/single-site-gen/). - [ ] **1.48 Canonical trailing slash matches the served URL** - Pass: The canonical path and the served path are identical, including the trailing slash. - Fail: Canonical path differs from the page path only by a trailing slash (Mega Analyzer). - Why: The two forms split ranking signals between them. - Fix: Confirm which form returns 200 and align the canonical to that form. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.49 Canonical URL does not use a non-standard port** - Pass: The canonical URL has no port, or uses 80 or 443. - Fail: Any other port (critical). - Numbers and lists the tool uses: Allowed ports 80 and 443 (Mega Analyzer). - Why: Googlebot does not crawl alternate ports; a port in the canonical usually means a staging URL leaked into production. - Fix: Emit the live origin in the canonical, without a port. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.50 Canonical URL resolves with HTTP 2xx** - Pass: A request to the declared canonical URL returns 2xx. - Warn: Canonical redirects (3xx); could not be verified (status 0 or unknown) is reported as info (Analyzer). - Fail: Canonical returns 400 or higher (Analyzer). - Numbers and lists the tool uses: 2xx pass; 300 to 399 warn; 400 or higher fail; status 0 info (Analyzer). - Why: A canonical that redirects or 404s is treated by Google as no canonical at all. - Fix: Update the canonical to the final destination URL that returns 2xx. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/). - [ ] **1.51 This URL is listed in the sitemap** - Pass: The page URL (or its trailing-slash or www variant) appears in the sitemap, or the sitemap is an index. - Warn: URL not found in the sitemap (Mega Analyzer, Analyzer, E-E-A-T Analyzer, Batch Analyzer, Mega Batch). - Numbers and lists the tool uses: Variants checked: hostname and its www/apex twin, with and without trailing slash; a sitemapindex passes (Mega Analyzer); exact href and trailing-slash toggle only (Analyzer, E-E-A-T Analyzer, Batch Analyzer, Mega Batch); severity warn. - Why: A page missing from the sitemap is discoverable only through internal links and gets no direct indexing signal. - Fix: Add the URL to the sitemap and resubmit it. - Verify: [Site Analyzer](https://jwatte.com/tools/analyzer/), [E-E-A-T Audit](https://jwatte.com/tools/eeat-analyzer/), [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/), [Batch Compare](https://jwatte.com/tools/batch-analyzer/) and 1 more. Standard: sitemaps.org. - [ ] **1.52 Thank-you and confirmation pages are noindex** - Pass: Any funnel or confirmation page carries a noindex directive. - Fail: A page whose path or title reads as a thank-you or confirmation page is indexable. - Numbers and lists the tool uses: Path regex /\/(thank[-_]?you|ty[-_]|confirmation|thanks|booked|meeting[-_]?booked)(\/|$)/; title patterns thank you, confirmation, meeting (is) booked, submission received (Mega Analyzer). - Why: An indexed thank-you page competes with the real conversion page for the same query and pollutes site: results. - Fix: Add `` to funnel and confirmation pages. - Verify: [Mega Analyzer](https://jwatte.com/tools/mega-analyzer/). - [ ] **1.53 URL slugs are clean kebab-case with no query parameters for content** - Pass: Content URLs use lowercase, hyphen-separated, keyword-aware slugs and never rely on query strings. - Why: Clean slugs are readable in results, stable across redesigns and easy for crawlers to canonicalize. - Fix: Rewrite content URLs as /section/keyword-slug/ and 301 the old forms. - Verify: [Single Site Gen](https://jwatte.com/tools/single-site-gen/). - [ ] **1.54 Page has followable internal outbound links (not a dead end)** - Pass: The page links to other pages on the same host without rel=nofollow, ideally several. - Warn: Zero followable internal links (Mega Analyzer, Batch Analyzer, Mega Batch); fewer than 5 (Analyzer); 3 to 7 outside nav (SGE Readiness Audit); fewer than 3 (Rendered DOM Paste Audit). - Fail: Zero internal outbound links (Analyzer crawl validation, E-E-A-T Analyzer, Link Graph dead-end tag); fewer than 3 outside nav (SGE Readiness Audit). - Numbers and lists the tool uses: Dead end = 0 anchors that resolve to the page hostname without rel nofollow (Mega Analyzer, Analyzer crawl validation, E-E-A-T Analyzer, Batch Analyzer, Mega Batch); Link Graph dead end = 0 same-host links after skipping mailto:, tel:, javascript:, sms: and data: hrefs, nofollow links still counted; at least 5 internal http(s) links after skipping tel:, mailto:, sms:, javascript: and data: hrefs (Analyzer, Batch Analyzer SEO bucket); tiers 10, 5 and 1 for full, partial and minimal credit, plus total links (internal plus external) 15 or more full and 8 or more partial (Batch Analyzer links bucket); 8 or more pass, 3 to 7 warn, under 3 fail, counted inside the content area and excluding links inside `