In one sentence: if your content only exists after hydration, Google will usually still index it and most AI retrieval agents will see an empty shell — so a clean Search Console is not evidence that answer engines can read your site.

Why this is the most under-diagnosed failure

Everything you use to check your site runs JavaScript. Your browser does. Your preview tool does. Your rank tracker probably does. So a client-rendered page looks completely fine from every vantage point you normally occupy, and the one consumer that matters here — a retrieval agent fetching raw HTML — is the one you never simulate.

Open your own page with JavaScript disabled. Whatever you see is the model's complete view.

The shapes this takes

PatternWhat the agent gets
SPA with client-side routingThe shell only — often the same shell for every URL
Content fetched in useEffect after mountHeadings and layout, no substance
Pricing or specs loaded from an API on interactionThe page appears to have no prices at all
FAQ rendered by a widgetFAQPage schema describing content that isn't in the HTML
Infinite scroll or "load more"The first batch, permanently

What to do about it, in order of preference

  • Server-render the substance. Static generation or SSR for anything you want quoted. This is the real fix and everything else is mitigation.
  • If you cannot, hoist the critical facts into the initial HTML. Prices, definitions, the answer paragraph under each heading — even as plain markup alongside the interactive version.
  • Never hide answers behind interaction. Accordions and tabs are fine as a visual pattern only if the content is in the HTML and merely collapsed with CSS.
  • Do not rely on schema to compensate. FAQPage markup over content the page never renders describes a page that doesn't exist, and a system comparing markup to rendered content has reason to trust neither.

How to verify properly

Fetch with JS disabled and read the body text — not the DOM in devtools, which shows the post-hydration state. Then do it as each named AI agent, because some origins serve different HTML based on user agent, occasionally by accident. Compare the word count of the raw HTML against what a reader sees; a large gap is the whole finding.

One honest caveat

Some agents do render JavaScript, and vendor behaviour changes. But building on the assumption that they will is a bet you cannot verify and do not need to take, because the fix — putting your important content in the HTML — has no downside for any consumer of your site, including human ones on slow connections.