Why it matters
OpenAI, Anthropic, Perplexity, Meta and ByteDance crawlers fetch HTML without executing JavaScript, so client-rendered text doesn't exist for them. Measured as 1 − (5-word shingles of rendered main text found in raw HTML fetched as GPTBot); above 0.20 is a scoring gate.
How to fix it
Render primary content in Server Components (or prerender it). Keep 'use client' for interactive leaves and fetch data on the server, not in useEffect.
Example
// ✗ app/pricing/page.tsx
'use client'
export default function Page() { const [plans, setPlans] = useState([]); useEffect(() => { fetch('/api/plans')... }, []) }
// ✓ Server Component: the HTML response contains the plans
export default async function Page() {
const plans = await getPlans()
return <PlanTable plans={plans} /> // PlanTable may be a Client Component for toggles
}References
More ai search rules
void geo reports 41 rules in this category. Generative-engine optimisation: whether AI crawlers that don't run JavaScript see the same content, valid and visible JSON-LD, an explicit AI robots policy, llms.txt, Markdown mirrors and answer-first writing.
hidden-streamed-contentCrawlers receive main content only inside hidden streaming containersai-bot-blockedAI crawler user agents get 401/403/429/503 or a challenge pageai-content-differsAI crawlers get materially different HTML than browsersjsonld-parse-errorJSON-LD block is not valid JSONjsonld-unsafeJSON-LD contains a literal </script or <!--jsonld-missingPage has no JSON-LDjsonld-not-in-rawJSON-LD is injected by JavaScripthome-entity-missingHome page lacks Organization + a single WebSite node