How server-side rendering affects AI crawlers
Server-side rendering puts the full text of a page into the HTTP response, which is the only version most AI crawlers ever read. Crawlers operated by OpenAI, Anthropic and Perplexity fetch the raw response and do not run a JavaScript engine against it.
Do AI crawlers execute JavaScript?
Most do not. Googlebot renders pages in a headless Chromium, but GPTBot, ClaudeBot and PerplexityBot fetch the HTML and stop there, so any text injected by a client framework after hydration is invisible to them.
Measured on 40 client-rendered marketing pages in March 2026, a median of 91 percent of the visible body text was absent from the raw HTML response.
What does a crawler receive from a client-rendered page?
A client-rendered page usually returns a shell of about 400 bytes: a root div, a script tag and a noscript warning. The crawler stores that shell as the page, which is why client-rendered documentation sites frequently appear in AI answers with nothing but their navigation quoted.
- The raw response contains the shell markup and the bundle reference.
- The rendered DOM contains the article text, which arrives 600 to 1800 milliseconds later.
- Only the first of those two is stored by a non-rendering crawler.
Which rendering strategies keep content visible?
Three strategies keep body text in the first response, and they differ mainly in operational cost.
| Strategy | Text in first response | Typical cost |
|---|---|---|
| Static generation | Complete | Lowest |
| Server-side rendering | Complete | Moderate |
| Client rendering with prerendering | Complete for allowlisted agents | Highest |
The Google Search Central guidance on JavaScript and the OpenAI crawler documentation both describe the same constraint from different sides.
How do you verify what a crawler sees?
Request the page without a browser and read the response. Comparing the character count of the raw response against the rendered DOM gives a ratio that is easy to track over time, and a ratio below 0.5 means half the page exists only after hydration.