{"total":39,"weights":{"access":27,"content":22,"geo":33},"checks":[{"id":"access.robots_txt","category":"access","weight":4,"severity":"critical","blocker":true,"title":"robots.txt blocks search engines from this page","why":"Googlebot cannot fetch the page. Without indexing, neither search results nor the AI answers built on top of search can surface you.","pass":"robots.txt allows search engines"},{"id":"access.meta_robots","category":"access","weight":4,"severity":"critical","blocker":true,"title":"Page is marked noindex","why":"The page can be crawled but is told not to be indexed. This is usually a staging tag that shipped to production, and on its own it zeroes out organic traffic.","pass":"No indexing directive blocking the page"},{"id":"access.canonical_host","category":"access","weight":3,"severity":"warning","blocker":false,"title":"www and http variants do not resolve to one address","why":"When the same content answers on four addresses, search engines split authority between them and have to guess which is canonical.","pass":"All host variants redirect to one address"},{"id":"access.canonical_tag","category":"access","weight":1,"severity":"opportunity","blocker":false,"title":"Canonical tag missing or malformed","why":"The canonical tag names the authoritative version among duplicates. Without it, every parameterised URL can be treated as a separate page.","pass":"Canonical tag is correct"},{"id":"access.http_status","category":"access","weight":2,"severity":"critical","blocker":true,"title":"Page does not return a successful response","why":"The address does not answer with 200, or sits behind a long redirect chain. Crawlers stop following chains after a few hops.","pass":"Clean 200 response"},{"id":"access.https","category":"access","weight":2,"severity":"critical","blocker":false,"title":"HTTPS missing or certificate is broken","why":"HTTPS has been a ranking signal for years and browsers flag insecure pages. A certificate error also stops crawlers outright.","pass":"HTTPS is valid"},{"id":"access.sitemap","category":"access","weight":1,"severity":"opportunity","blocker":false,"title":"Sitemap not found or not declared","why":"A sitemap tells search engines directly which pages exist and when they changed. For pages that are hard to reach by internal links it is the only route.","pass":"Sitemap present and declared"},{"id":"access.soft_404","category":"access","weight":2,"severity":"warning","blocker":false,"title":"Missing pages return 200 (soft 404)","why":"When non-existent addresses answer \"success\", a crawler discovers unlimited empty pages and spends its crawl budget on them.","pass":"Missing pages correctly return 404"},{"id":"access.psi_performance","category":"access","weight":2,"severity":"warning","blocker":false,"title":"Page speed is low","why":"The PageSpeed Insights performance score is below threshold. Slow pages rank worse and lose visitors before the content renders.","pass":"Page speed is adequate"},{"id":"access.mobile","category":"access","weight":2,"severity":"warning","blocker":false,"title":"Mobile readiness signals are missing","why":"Google indexes the mobile version first. A page without a viewport declaration renders at desktop width on phones.","pass":"Mobile ready"},{"id":"access.broken_links","category":"access","weight":2,"severity":"warning","blocker":false,"title":"Broken internal links on the page","why":"Broken links waste crawl budget and dead-end the reader. They are usually leftovers from a content migration.","pass":"Internal links are healthy"},{"id":"access.ttfb","category":"access","weight":1,"severity":"opportunity","blocker":false,"title":"Server response time is high","why":"Time to first byte sets the ceiling for how fast everything else can load. It is usually a caching or server-location problem.","pass":"Server responds quickly"},{"id":"access.lang_hreflang","category":"access","weight":1,"severity":"opportunity","blocker":false,"title":"Language declaration or hreflang missing","why":"On multilingual sites hreflang decides which version each visitor sees. Declarations that are not reciprocal are ignored entirely.","pass":"Language declarations are consistent"},{"id":"content.title","category":"content","weight":4,"severity":"critical","blocker":false,"title":"Title tag is missing or unclear","why":"The title is the main search-result headline. There is no fixed character limit; it should describe the page concisely and accurately.","pass":"Title tag is descriptive"},{"id":"content.meta_description","category":"content","weight":3,"severity":"warning","blocker":false,"title":"Meta description missing or badly sized","why":"If you do not write one, the search engine picks a sentence at random. It is one of the few snippets you control that directly moves click-through.","pass":"Meta description is well formed"},{"id":"content.h1","category":"content","weight":2,"severity":"warning","blocker":false,"title":"No primary page heading found","why":"A primary heading explains the page topic to users and search systems. Multiple H1s are not inherently an error; a missing or unclear heading is.","pass":"Primary page heading is present"},{"id":"content.heading_hierarchy","category":"content","weight":1,"severity":"opportunity","blocker":false,"title":"Heading hierarchy skips levels","why":"Jumping from H2 to H4 breaks the document outline. AI systems chunk pages along the heading tree, so a broken outline produces mis-scoped quotes.","pass":"Heading hierarchy is consistent"},{"id":"content.depth","category":"content","weight":1,"severity":"warning","blocker":false,"title":"Main content looks insufficient in the initial response","why":"This check does not impose a word-count target. It only verifies that users and crawlers receive meaningful main content from the server.","pass":"Main content is readable in the initial response"},{"id":"content.img_alt","category":"content","weight":3,"severity":"warning","blocker":false,"title":"Some images have no alt text","why":"Alt text is both an accessibility requirement and the only content signal in image search. Decorative images should carry an empty alt=\"\", not be skipped.","pass":"Image alt coverage is complete"},{"id":"content.jsonld_present","category":"content","weight":0,"severity":"opportunity","blocker":false,"title":"No structured data is used on this page","why":"Schema is not mandatory on every page. Only relevant, accurate markup that matches visible content can enable supported rich-result eligibility.","pass":"JSON-LD present"},{"id":"content.jsonld_complete","category":"content","weight":3,"severity":"warning","blocker":false,"title":"Structured data is invalid","why":"Malformed JSON-LD cannot be read by search engines. Feature-specific eligibility should also be checked with Google Rich Results Test.","pass":"JSON-LD syntax is valid"},{"id":"content.img_delivery","category":"content","weight":2,"severity":"opportunity","blocker":false,"title":"Image delivery can be improved","why":"Modern formats, lazy loading and explicit dimensions each move page speed and layout shift (CLS) directly.","pass":"Image delivery is good"},{"id":"content.social_cards","category":"content","weight":2,"severity":"opportunity","blocker":false,"title":"Open Graph / Twitter cards incomplete","why":"These decide the title, description and image shown when the link is shared. Without them the platform picks something at random.","pass":"Share cards are complete"},{"id":"content.anchor_quality","category":"content","weight":1,"severity":"opportunity","blocker":false,"title":"Generic link text in use","why":"\"Click here\" and \"read more\" say nothing about the destination. Anchor text is how you describe the page you are linking to.","pass":"Link text is descriptive"},{"id":"geo.ai_robots_matrix","category":"geo","weight":8,"severity":"critical","blocker":true,"title":"Search and answer-engine crawlers are blocked in robots.txt","why":"This only covers bots used for search, citation, or user-requested fetches. Blocking training crawlers is a publisher choice and does not lower the AEO score.","pass":"Open to search and answer-engine crawlers"},{"id":"geo.ai_ua_probe","category":"geo","weight":6,"severity":"critical","blocker":false,"title":"Server silently rejects AI bots","why":"robots.txt allows them but the server answers these bots with a 403 or a challenge page. This is the most insidious failure mode — no SEO tool reports it, so it can go unnoticed for years. It usually comes from CDN bot management.","pass":"AI bots get through at the server"},{"id":"geo.noai_tags","category":"geo","weight":0,"severity":"opportunity","blocker":false,"title":"Content is opted out of AI use","why":"Tags like noai / noimageai refuse AI use of the content. Fine if deliberate; if not, it quietly switches off visibility.","pass":"No AI opt-out directives"},{"id":"geo.cloaking","category":"geo","weight":1,"severity":"warning","blocker":false,"title":"Bots are served different content","why":"The body returned to bots differs materially from the one visitors get. If deliberate that is a penalisable practice; if not, a cache or bot-management layer is likely truncating the content.","pass":"Bots and visitors get the same content"},{"id":"geo.js_free_content","category":"geo","weight":6,"severity":"critical","blocker":true,"title":"Content only appears with JavaScript","why":"Most AI crawlers do not execute JavaScript. If the raw HTML from the server is empty, your page really is empty to them — no matter how good the content is. Server-side rendering or static generation fixes this in one step.","pass":"Content is present without JavaScript"},{"id":"geo.semantic_main","category":"geo","weight":1,"severity":"opportunity","blocker":false,"title":"Main content is not semantically marked","why":"<main> or <article> tells a parser where the real content starts and ends. Without it, navigation, sidebar and footer bleed into the content.","pass":"Main content is semantically marked"},{"id":"geo.content_wall","category":"geo","weight":2,"severity":"warning","blocker":false,"title":"Content sits behind a wall","why":"If a cookie banner, login screen or age gate is what the first response contains, the wall is all a crawler ever sees.","pass":"Content is available in the first response"},{"id":"geo.llms_txt","category":"geo","weight":0,"severity":"opportunity","blocker":false,"title":"No llms.txt file found","why":"llms.txt is experimental. It is not an SEO or AEO requirement, and its absence does not affect the score.","pass":"llms.txt present"},{"id":"geo.dates","category":"geo","weight":2,"severity":"warning","blocker":false,"title":"Publication or update date is unclear","why":"AI systems prefer current sources. Undated content is assumed stale next to a dated competitor.","pass":"Date signals are clear"},{"id":"geo.author","category":"geo","weight":2,"severity":"warning","blocker":false,"title":"No author identity","why":"Who wrote this feeds directly into how trustworthy the content is judged to be. Author schema plus a verifiable profile link closes the gap.","pass":"Author identity is stated"},{"id":"geo.definition_first","category":"geo","weight":2,"severity":"opportunity","blocker":false,"title":"Opening paragraph does not answer the question","why":"AI systems chunk the page and look for the most direct answer. A page that answers its own headline in the first two sentences is far more citable.","pass":"Opening answers directly"},{"id":"geo.entity","category":"geo","weight":1,"severity":"opportunity","blocker":false,"title":"Brand is not defined as an entity","why":"Organization schema plus a match in a known knowledge base makes it unambiguous which entity your brand name refers to.","pass":"Brand entity is clear"},{"id":"geo.question_headings","category":"geo","weight":0,"severity":"opportunity","blocker":false,"title":"No question-shaped headings","why":"People ask assistants questions. A page whose headings are written as questions makes the match to those questions easy.","pass":"Question-shaped headings present"},{"id":"geo.structured_blocks","category":"geo","weight":1,"severity":"opportunity","blocker":false,"title":"Few tables or lists","why":"Tables and lists are ready-made chunks that lift straight into an answer. Long unbroken paragraphs do not extract that way.","pass":"Structured blocks present"},{"id":"geo.evidence_density","category":"geo","weight":1,"severity":"opportunity","blocker":false,"title":"No external sources for editorial claims","why":"Reliable external sources help readers verify claims in articles and guides. Random numeric density is not treated as a quality signal.","pass":"Editorial sources are cited"}]}