GEO CHECKLIST (plain text mirror of the interactive checklist). Updated October 2026.
Purpose: tick through each item and note the command to check it. Item ids match the web checklist.
Source: https://www.maxenius.com/blog/generative-engine-optimization . Replace every placeholder domain (yourdomain.com).

ACCESS
  [ ] Live /robots.txt returns 200 text/plain  (robots-live)
      curl -sI https://yourdomain.com/robots.txt
  [ ] Named AI groups repeat every Disallow rule from the * group  (robots-groups)
      A named group replaces the * group for that bot
  [ ] Search bots (OAI-SearchBot, Claude-SearchBot, PerplexityBot, Googlebot, bingbot) are allowed in robots.txt  (robots-search-bots)
      python3 scripts/rfc9309_check.py robots.txt OAI-SearchBot /blog/post
  [ ] Training bot decision made and written down (GPTBot, ClaudeBot, Google-Extended)  (robots-training-decision)
      Training and search are separate tokens
  [ ] CDN and WAF allow the bots' published IP ranges  (waf-checked)
      python3 scripts/verify_bot_ip.py <ip>
  [ ] Cloudflare managed robots.txt and the Vercel AI Bots ruleset are checked  (waf-managed-rules)
  [ ] Managed robots.txt on your CDN checked against the live file  (live-file-matches-repo)
      diff <(curl -s https://yourdomain.com/robots.txt) public/robots.txt

RENDER
  [ ] View-source or curl shows main text, title, canonical and JSON-LD without JavaScript  (html-has-answer)
      scripts/check-ai-crawl.sh https://yourdomain.com/page "a sentence"
  [ ] Key answers are not only in tabs, accordions, images or PDFs  (no-hidden-answers)
  [ ] Links are real a href elements  (crawlable-links)
      curl -s URL | grep -o "<a [^>]*href"
  [ ] Important pages return 200 with no noindex, nosnippet or max-snippet:0  (snippet-eligible)
      curl -sI URL | grep -i -E "^HTTP/|x-robots-tag"

CONTENT
  [ ] The first 1 to 2 sentences under each heading answer it  (answer-first)
  [ ] One topic per URL  (one-topic)
  [ ] Numbers have a linked primary source  (sources-linked)
  [ ] The page contains something only you can say (first-hand detail)  (non-commodity)
  [ ] No keyword stuffing, no hidden text for LLMs  (no-manipulation)

STRUCTURED DATA AND ENTITY
  [ ] Organization JSON-LD on the home page with sameAs  (org-jsonld)
  [ ] JSON-LD matches visible text and validates  (jsonld-valid)
      Check the page with Google's Rich Results Test
  [ ] Same business name and description on your site, Business Profile, Bing Places and Merchant Center  (entity-consistent)
  [ ] Author pages with name and url  (author-pages)

URLS AND FRESHNESS
  [ ] Canonical, sitemap loc and final redirect target use the same host and URL  (one-host)
      curl -sI https://example.com/page | grep -i -E "^HTTP/|^location"
  [ ] Sitemap lastmod reflects real content changes only  (honest-lastmod)
  [ ] Visible Last updated date plus dateModified in JSON-LD  (visible-date)
  [ ] IndexNow key file is live and pings return 200 or 202 (Bing and other participants, not Google)  (indexnow)
      bash indexnow/ping.sh
  [ ] Sitemap submitted in Search Console and Bing Webmaster Tools  (sitemaps-submitted)

MEASURE
  [ ] Search Console, Settings, Search generative AI is not set to Exclude  (gsc-not-excluded)
  [ ] Generative AI performance report baseline saved  (gsc-baseline)
  [ ] Annotation added for the change date  (gsc-annotation)
  [ ] GA4 AI Assistant channel or a custom channel group checked  (ga4-channel)
      measure/ga4-ai-sources.regex
  [ ] Bing AI Performance baseline exported  (bing-baseline)
  [ ] Bot hits verified in logs with an IP check  (logs-checked)
      python3 scripts/ai_bot_report.py access.log
  [ ] 20 to 40 prompts logged, 3 runs per engine  (prompt-log)
      measure/ai-prompt-tracker.csv

OPTIONAL: LLMS.TXT
  [ ] /llms.txt returns 200 text/plain or text/markdown, one generator only, linked from footer or head  (llms-optional)
      curl -sI https://yourdomain.com/llms.txt

Starter kit: https://www.maxenius.com/downloads/geo-starter-kit/geo-starter-kit.zip
