Vercel and MERJ analyzed more than 500 million GPTBot fetches and found zero evidence of JavaScript execution (Vercel). ChatGPT, Claude, and Perplexity crawlers request the raw HTML, and some even download your JavaScript files, but none of them run the scripts. Whatever your page assembles in the browser after load, they do not see.
Most AI crawlers fetch raw HTML and do not execute JavaScript. Content, and schema markup, that gets injected client-side by React, Vue, or any framework rendering in the browser is invisible to them. The test is a diff: compare what the server returns with what the rendered page shows. The gap is exactly what AI cannot read.
What do AI crawlers see instead?
They see your initial HTML response, before a single script runs. If your server sends a real, populated page, that is what they get. If your server sends a near-empty shell with a <div id="root"> and a bundle of JavaScript that fills it in on the client, that is what they get: the shell. The article text, the product details, the FAQ, the price, all of it arrives after the fetch has already been recorded and the crawler has moved on.
The data backs up the mechanism. In the Vercel and MERJ study, ChatGPT’s crawler fetched JavaScript files in around 11% of its requests and Claude’s in around 24%, yet neither executed them (Vercel). Downloading a script is not running it. It is the difference between a delivery driver dropping a flat-pack box on your porch and a driver assembling the furniture. AI crawlers deliver. They do not assemble.
Isn’t Google fine with client-side rendering now?
Google is. Everyone else is not, and conflating the two is how sites talk themselves into being invisible. Googlebot renders JavaScript with a mature, if delayed, pipeline, and Google dropped its old client-side-rendering warnings on that basis. That fact applies to Google Search and nowhere else. It is not a permission slip for AI search (gsqi case study).
The exposure compounds when you remember where ChatGPT gets its results. A large share of ChatGPT’s web answers draw on Bing’s index, and Bing’s JavaScript rendering is limited. So a fully client-rendered app risks being invisible in Bing’s index and to the direct AI crawlers at the same time: two doors, both shut, for the same reason. You do not get to be seen by AI search on the strength of Googlebot being clever.
How do you test for the gap?
Fetch the page twice and compare. First, request the raw HTML the way a crawler does, with no JavaScript engine: curl the URL, or fetch it with scripting disabled. Second, load the same URL in a real browser and read the fully rendered DOM. Diff the two. Anything present in the rendered version but missing from the raw version is content AI crawlers cannot see. That diff is the whole method, and it is exactly what our render check automates.
The failure that catches careful teams is structured data. You did the right thing and added JSON-LD, but your tag manager or your framework injects it into the DOM after load. To a browser, the schema is there. To an AI crawler reading raw HTML, it never existed. This is a false negative in the worst direction: you believe you are marked up, your own browser confirms it, and the crawler sees a page with no schema at all. When we flag “schema missing” on a site whose developers swear it is present, injected-after-load JSON-LD is the usual culprit. The fix is to render your entity markup server-side so it lands in the initial HTML, not after the JavaScript runs.
The broader fix is the same one the study points to: server-side rendering, or static generation, or prerendering for bots. Send a populated page in the first response. For content-heavy pages, product pages, articles, category listings, documentation, that is the clean answer. Reserve client-side rendering for the interactive bits that no crawler needs to read anyway.
The practical next step: pick your three highest-value pages, curl each one, and search the raw output for a sentence you can see in the browser. If it is not in the curl output, neither is AI search. To get the raw-versus-rendered diff run for you, run a free scan.