Why AI crawlers don't run JavaScript
Several AI crawlers do not run JavaScript. ChatGPT, Perplexity and Claude read the raw HTML your server returns and never execute page scripts, so any content or schema injected by JavaScript is invisible to them. Google renders JavaScript; Microsoft Copilot renders it unreliably. If a signal only appears after scripts run, assume the no-JS engines cannot see it.
- →ChatGPT, Perplexity and Claude do not run JavaScript; Google does; Copilot does so unreliably.
- →Content or schema injected by JavaScript is invisible to the no-JS engines, even when it looks fine in your browser.
- →Test with View Source (the raw HTML), not the browser inspector, and serve the content server-side so it is in the initial HTML.
Why don't AI crawlers run JavaScript?
Most AI crawlers skip JavaScript because rendering it is slow and expensive at web scale. Fetching raw HTML is cheap and fast; spinning up a full browser to execute a page's scripts, wait for network calls and build the final DOM costs far more compute per page. When a crawler is fetching billions of URLs, many engines choose speed and simply read the HTML the server sends. So ChatGPT, Perplexity and Claude read your page as text, exactly as it arrives, and never see anything a script would have added.
Which engines render JavaScript and which don't?
Engines split into three groups on JavaScript, and the split decides what each can see on your page.
| Engine | JavaScript rendering | What it can see |
|---|---|---|
| ChatGPT | No | Only content and schema in the raw HTML |
| Perplexity | No | Only content and schema in the raw HTML |
| Claude | No | Only content and schema in the raw HTML |
| Google AI Overviews | Yes | Content and schema added by JavaScript, once rendered |
| Gemini | Yes (via Google) | Content and schema added by JavaScript, once rendered |
| Microsoft Copilot | Unreliably | JavaScript content only some of the time |
Because three of the six scored engines ignore scripts, the safe assumption is that JavaScript-only content will not be cited.
What is render parity?
Render parity is the match between what your server sends as raw HTML and what a browser shows after JavaScript has run. A page has render parity when its important content and schema are present in the initial HTML, so a no-JS crawler and a human see the same thing. A page lacks render parity when the answer or the JSON-LD only appears after scripts execute. Render parity matters because the engines that skip JavaScript can only cite what is in the raw HTML.
How to test what a crawler sees
Test render parity by looking at the raw HTML, not the rendered page. The browser inspector shows the DOM after scripts have run, which hides the problem.
curl from a terminal). This is the raw HTML before any JavaScript runs.application/ld+json. If the schema is missing, engines cannot use it.How to fix JavaScript-only content
The fix is to put important content in the initial HTML so it is present before any script runs. Use server-side rendering, static site generation or prerendering so the answer text and the JSON-LD are in the response the server sends. Keep schema in the server-rendered head rather than injecting it client-side. Then re-check with View Source. For a walk-through aimed at schema specifically, see rendering-schema-without-javascript.
How Rubric checks this
Rubric checks render parity directly. It reads what an engine reads, so a scored check confirms whether your schema is readable without JavaScript, and the crawler-access checks confirm the AI bots can reach the page at all. If a page relies on JavaScript for its content, Rubric scores it as the no-JS engines would see it, which is why a page that looks perfect in a browser can still score below the line. See agent-ready-and-crawler-access for the reachability side of the same picture.