DEV Community

Cover image for Your Structured Data Is Probably Broken (And ChatGPT Can't Read Your Site Either)
Pilot stack
Pilot stack

Posted on

Your Structured Data Is Probably Broken (And ChatGPT Can't Read Your Site Either)

Two SEO audit tools flagged the same site — mine — with two very different-sounding but related problems: 146 invalid structured data items, and an "AI Search Health" score of 79%, under the 80% threshold the tool considers acceptable.

The first one I expected eventually. The second one is newer, and worth understanding if you're shipping content in 2026 — because "optimize for Google" and "optimize for AI search" are no longer quite the same task.

Structured data breaking silently

JSON-LD (the blocks that tell Google &quot;this is a Product,&quot; &quot;this is a Review,&quot; &quot;this is an Article&quot;) fails in a specific, annoying way: it doesn&#39;t break your page. The page renders fine. Users see nothing wrong. Only a validator — or a rich-results feature quietly not showing up — tells you something&#39;s off.</p> <p>On a comparison site with a Product + AggregateRating schema on every review page, I found the schema was technically valid JSON but semantically wrong in a way that matters to Google: it included an offers object without the fields required for a Merchant Listing (image inside offers, hasMerchantReturnPolicy, shippingDetails, availability). Google didn&#39;t reject the JSON — it just classified the page as an invalid merchant listing and stopped showing the rich result.</p> <p>The fix wasn&#39;t &quot;add the missing fields&quot; — for a third-party software review site, you don&#39;t have real return policies or shipping details for products you don&#39;t sell. The fix was removing offers entirely and keeping Product + AggregateRating only, which is the schema Google actually recommends for review sites that aren&#39;t processing transactions.</p> <p>jsonc<br> // Wrong for a review site (triggers Merchant Listing validation)<br> {<br> &quot;@type&quot;: &quot;Product&quot;,<br> &quot;name&quot;: &quot;...&quot;,<br> &quot;offers&quot;: { &quot;price&quot;: &quot;...&quot;, &quot;priceCurrency&quot;: &quot;USD&quot; }, // ← don&#39;t add this unless you sell it<br> &quot;aggregateRating&quot;: { ... }<br> }</p> <p>// Right for a review/comparison site<br> {<br> &quot;@type&quot;: &quot;Product&quot;,<br> &quot;name&quot;: &quot;...&quot;,<br> &quot;image&quot;: &quot;...&quot;,<br> &quot;aggregateRating&quot;: { ... }<br> }</p> <p>Lesson: more schema fields isn&#39;t automatically better. Adding offers felt like &quot;extra rich data,&quot; but it silently reclassified every page into a schema category with requirements the content couldn&#39;t satisfy.</p> <p>AI Search Health is a genuinely different checklist</p> <p>The newer signal — sites getting crawled and cited by ChatGPT, Perplexity, and Google&#39;s AI Overviews — has its own user-agents, separate from classic Googlebot:</p> <p>User-agent: Googlebot<br> Allow: /</p> <p>User-agent: Google-Extended<br> Allow: /</p> <p>User-agent: GPTBot<br> Allow: /</p> <p>User-agent: ChatGPT-User<br> Allow: /</p> <p>User-agent: OAI-SearchBot<br> Allow: /</p> <p>A wildcard User-agent: * / Allow: / technically covers all of these by default — but being explicit removes ambiguity, and more importantly forces you to actually think about whether you want each one crawling you. Google-Extended specifically controls whether your content can be used for Gemini training, separate from whether it can be indexed — a distinction a lot of robots.txt files don&#39;t make.</p> <p>The other emerging convention is llms.txt — a plain-text file at your root, analogous to robots.txt or sitemap.xml, but aimed at LLM-based crawlers/agents instead of traditional search indexers. There&#39;s no single ratified spec yet, but the emerging shape is simple:</p> <h1> <a name="pilotstack" href="#pilotstack" class="anchor"> </a> PilotStack </h1> <blockquote> <p>Independent SaaS reviews and comparisons. Hands-on tested,<br> pricing verified against vendor sources with dates.</p> </blockquote> <h2> <a name="key-sections" href="#key-sections" class="anchor"> </a> Key sections </h2> <ul> <li>/comparisons — head-to-head tool comparisons</li> <li>/reviews — individual software reviews</li> <li>/guides — buying guides by category</li> <li>/best — best-of lists by category</li> </ul> <h2> <a name="usage" href="#usage" class="anchor"> </a> Usage </h2> <p>Content is free to cite with attribution. Contact: [email]</p> <p>Fifteen minutes of work, and it&#39;s one of those things that costs nothing to have and increasingly seems to matter for how AI systems summarize/cite a site.</p> <p>The actual pattern here</p> <p>Both issues share a root cause: markup and crawl config are invisible until something external checks them. Nothing in normal development — writing content, testing the UI, even manual QA — surfaces a broken offers schema or a missing llms.txt. You only find out when:</p> <p>A rich-results validator flags it<br> A specialized audit tool (Screaming Frog, Semrush, Ahrefs) crawls for it<br> Traffic quietly doesn&#39;t show up where you&#39;d expect it</p> <p>If you&#39;re maintaining any content-heavy site, it&#39;s worth adding structured-data validation and AI-crawler-accessibility checks to whatever CI/QA process you already have for content — the same way you&#39;d lint code you can&#39;t visually inspect for correctness. The failure mode is identical: technically-present, silently-wrong, and expensive to notice late.</p> <p>Currently doing exactly this kind of cleanup on PilotStack, an independent SaaS comparison site. If you run a similar audit and want to compare notes on what you found, I&#39;m curious what shows up on other sites.</p>

Top comments (1)

Collapse
 
citedy profile image
Dmitry Sergeev

ngl it's wild how often schema gets messed up just by a tiny syntax error. do you think the validator tools are getting more strict or is it just the way LLMs parse it?