ubricHelp

Why AI crawlers don't run JavaScript

Render parity, why JS-injected content is invisible to some engines, and how to test what a crawler really sees.

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.

In short
  • →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.

EngineJavaScript renderingWhat it can see
ChatGPTNoOnly content and schema in the raw HTML
PerplexityNoOnly content and schema in the raw HTML
ClaudeNoOnly content and schema in the raw HTML
Google AI OverviewsYesContent and schema added by JavaScript, once rendered
GeminiYes (via Google)Content and schema added by JavaScript, once rendered
Microsoft CopilotUnreliablyJavaScript 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.

01
Open View Source. In your browser, view the page source (or fetch the URL with curl from a terminal). This is the raw HTML before any JavaScript runs.
02
Search for your answer. Look for the exact text of your opening answer. If it is not there, no-JS crawlers cannot read it.
03
Search for your schema. Look for your JSON-LD, for example the string application/ld+json. If the schema is missing, engines cannot use it.
04
Compare with the live page. If the content shows in the browser but not in View Source, JavaScript is injecting it and the no-JS engines are missing it.
Tip
A tag manager that inserts JSON-LD after the page loads is a common trap. The schema looks correct in the inspector and is invisible to ChatGPT, Perplexity and Claude. Put schema in the server-rendered head instead.

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.

Common questions

Did this answer your question?