WWikiAP
Category: Technical

Do AI Crawlers Run JavaScript? Auditing and Fixing Missing Citations for CSR/SPA Content

GPTBot, ClaudeBot, and PerplexityBot do not execute JavaScript. Here is why CSR/SPA content disappears from AI search citations, and the fix sequence from a curl audit to server-side rendering, based on official documentation.

Technical GEO 에디터Published

Do AI Crawlers Run JavaScript? Auditing and Fixing Missing Citations for CSR/SPA Content

Do AI crawlers run JavaScript? The answer is short, most of them do not. When Vercel and MERJ analyzed crawler request logs across nextjs.org and the rest of their network, not one bot from OpenAI, Anthropic, Perplexity, Meta, or ByteDance rendered JavaScript[1]. Plenty of teams never learn this. They open Google Search Console, see a green indexed status, and decide the page is healthy, because Google does render. This page covers where that asymmetry starts, how to tell in three minutes whether your site sits in the gap, and what to fix in what order.

30-second definitions

  • Client-side rendering (CSR) builds the visible page by running JavaScript in the browser.
  • Server-side rendering (SSR) finishes the HTML on the server at request time and sends it down.
  • Static rendering (SSG) finishes the HTML at build time and stores it as a file.
  • Hydration takes the finished HTML the server sent and layers JavaScript behavior on top of it in the browser.
  • A rendering blind spot is content the browser shows but the raw HTML omits, which puts it out of reach for any crawler that skips JavaScript.
One URL, two diverging paths URL request Raw HTML received Runs JavaScript Googlebot, Applebot, Bingbot Body copy, tables, JSON-LD reach the index Skips JavaScript GPTBot, ClaudeBot, PerplexityBot Only empty containers, out of the citation pool
One URL, but what a crawler walks away with depends on whether it executes JavaScript. The lower path is the rendering blind spot.

JavaScript execution by crawler

CrawlerOperatorExecutes JavaScriptEvidenceWhat it means in practice
GPTBot, OAI-SearchBot, ChatGPT-UserOpenAINoVercel, MERJ log analysis (2024)ChatGPT search citations draw only on what sits in the raw HTML
ClaudeBotAnthropicNoVercel, MERJ log analysis (2024)CSR body copy never becomes source material for a Claude answer
PerplexityBotPerplexityNoVercel, MERJ log analysis (2024)Live search still does not mean rendering
Meta-ExternalAgentMetaNoVercel, MERJ log analysis (2024)Same
BytespiderByteDanceNoVercel, MERJ log analysis (2024)Same
GooglebotGoogleYes (evergreen Chromium)Google official documentation (2026)Sets the bar for eligibility in AI Overviews and AI Mode
ApplebotAppleCan render (browser)Apple official documentation (2026)Apple's wording is "can render"; blocking JS or CSS in robots.txt breaks rendering
BingbotMicrosoftPartialBing official blog (2018)States that doing it at scale across every page is hard

Five of those eight rows say no. If a site leaves its body content to client-side rendering, those five crawlers receive none of the page's substance.

The evidence, in numbers

Vercel and MERJ split the crawler requests hitting nextjs.org and the rest of their network by content type. Two findings stand out. The major AI crawlers do not render JavaScript, and yet they still pull down JavaScript files at a meaningful rate[1]. The shares below are measured on nextjs.org, and the ChatGPT family combines GPTBot, OAI-SearchBot, and ChatGPT-User. They fetch the files without running them, so a JS request in your server log is no proof that a bot rendered your app.

JS file share of crawler requests (nextjs.org) ClaudeBot 23.84% Googlebot 15.25% ChatGPT family 11.50% Source: (Vercel, MERJ, 2024)
JS file share of crawler requests (nextjs.org), source: (Vercel, MERJ, 2024)
ItemJS file share of requests (%)Runs JavaScriptSource
ClaudeBot23.84%Does not run JS(Vercel, MERJ, 2024)
Googlebot15.25%Runs JS (evergreen Chromium)(Vercel, MERJ, 2024), (Google Search Central, 2026)
ChatGPT family11.50%Does not run JS(Vercel, MERJ, 2024)

Volume is worth noting too. Over the same one-month window, GPTBot made 569 million requests and the Claude family made 370 million, against 4.5 billion for Googlebot (Vercel, MERJ, 2024)[1]. AI crawler traffic has passed the point where anyone can wave it off, and every one of those requests reads raw HTML and moves on.

The other side of the story sits in official documentation. Google describes processing JavaScript apps in three stages, crawling, rendering, and indexing, with rendering handled by an evergreen version of Chromium (Google Search Central, 2026)[2]. Applebot states that it can render website content inside a browser, and warns that blocking JS and CSS in robots.txt prevents proper rendering (Apple, 2026)[7]. Bing wrote that Bingbot can generally render JavaScript but has trouble doing it at scale for every page on every site (Bing Webmaster Blog, 2018)[8]. OpenAI's documentation separates the roles of GPTBot (model training), OAI-SearchBot (ChatGPT search surfacing), and ChatGPT-User (user-triggered visits), and says nothing about rendering (OpenAI crawler documentation, accessed September 2026)[6].

Why the page survives in Google and vanishes from AI answers

The difference comes down to how many stages each pipeline runs. Googlebot queues a page that returned HTTP 200 for rendering, and when its turn arrives, headless Chromium executes the JavaScript and the resulting HTML goes to the index[2]. Google attaches the caveat that the wait can run from seconds to considerably longer, but execution does happen.

The AI crawlers with no observed rendering have no second stage (Vercel, MERJ, 2024)[1]. Request, response, parse, and that is the whole sequence. That produces the asymmetry teams keep running into, a page that ranks well in Google search never shows up in the source list behind a ChatGPT or Perplexity answer. Months disappear into blaming content quality or prompt wording. The actual cause is one line of HTML.

The effect spills back onto Google as well. To appear as a supporting link in AI Overviews and AI Mode, Google requires that a page be indexed and eligible to appear in Google Search with a snippet (Google Search Central, 2025)[5]. Failed or delayed rendering delays indexing, and delayed indexing pushes back eligibility on AI surfaces.

Structured data is the sharpest trap. Google reads JavaScript-generated structured data from the DOM after rendering and supports injecting JSON-LD through a tag manager (Google Search Central, 2025)[4]. The Rich Results Test passes. For a crawler that skips JavaScript, that JSON-LD does not exist. The markup design covered in structured data schemas for AEO is worthless for AI citation if the injection point is the client.

The elements that land in the blind spot most often

ElementCommon implementationPresent in raw HTMLFix direction
Body copy, detailed descriptionsRendered on the client from an API responseNoMove to SSR or SSG
Price, stock, specsInjected after a separate API callNoServer-render the initial values, refresh on the client
FAQ accordionsAnswers built on clickUsually notShip the answer text in the initial HTML and collapse it with CSS
Reviews, ratingsThird-party widget iframe or scriptNoAlso expose a server-rendered summary and rating
JSON-LD structured dataTag manager injectionNoInsert it directly into the server response HTML
Navigation, internal linksonClick routing, infinite scrollNo anchor tagsAdd real href anchors alongside pagination
Tabs, load-more contentLazy loaded on selectionNoInclude it in the initial HTML and control visibility only

Execution, from audit to fix

Step 1: Audit the Raw HTML (3 Minutes)

The Elements tab in your browser devtools shows a DOM that has already finished rendering, which makes it useless for this audit. You need the HTML the server sent first.

# 1. Is the key body sentence in the raw HTML?
curl -sL "https://example.com/product/123" | grep -c "key phrase"

# 2. Is JSON-LD in the raw HTML?
curl -sL "https://example.com/product/123" | grep -o "application/ld+json" | wc -l

# 3. Do internal links exist as real anchors?
curl -sL "https://example.com/category/shoes" | grep -o '<a [^>]*href="[^"]*"' | wc -l

# 4. Does a crawler UA get a different response? (check each vendor's docs for exact UA strings)
curl -sL -A "GPTBot" "https://example.com/product/123" | wc -c

If checks 1 and 2 return 0, that page is blank to ChatGPT, Claude, and Perplexity. Looking fine in a browser proves nothing.

Step 2: The Diagnostic Checklist

CheckMethodPass criteria
Body copy presentSearch the curl output for the first body paragraphFound
Structured data presentSearch the curl output for ld+jsonAt least one hit
Link discoverabilityCount href anchors in the curl outputKey subpages exposed as anchors
Google rendering resultRendered HTML in the Search Console URL Inspection toolBody copy and markup included
Blocked resourcesJS and CSS paths in robots.txtNot blocked
Crawler accessPer-bot rules in robots.txtCitation bots allowed

Checks 4 and 5 run through the URL Inspection tool and Rich Results Test that Google's documentation points to[2]. Check 6 belongs with the per-bot allow policies covered in the AI crawler management guide.

Step 3: Fix Priority

Google has already settled the direction. It calls dynamic rendering a workaround rather than a recommended solution, one that adds complexity and resource demands, and points instead to server-side rendering, static rendering, and hydration (Google Search Central, 2025)[3]. Bolting on a prerender service will put out the immediate fire, but treating it as the final architecture leaves you with maintenance costs and a standing risk that the two versions drift apart.

RankTargetActionExpected effect
1Body pages you want citedMove to SSG or SSRNon-executing crawlers get the body copy
2JSON-LDInsert directly into the server response HTMLEntity and FAQ markup becomes visible to AI crawlers
3Title, description, metaGenerate on the serverGives summaries and snippets something to quote
4Internal linksExpose as href anchorsOpens a crawl path
5Supporting interactionsKeep on the clientPreserves performance and UX

The rule is simple. Anything quotable comes from the server, and only the interactions nobody will ever quote go to the browser. Vercel and MERJ landed in the same place: server-render body content, product data, documentation, metadata, and navigation, and keep client-side rendering for non-essential dynamic elements[1].

To run the raw HTML audit with tooling instead, the free GEO audit tool comparison maps what the free tiers actually answer. Once the fix ships, track citations separately. A raw HTML audit answers whether a page can be read, not whether it gets cited. Teams track per-engine citations with AI visibility monitoring tools such as Profound and Peec AI, or Korean options including BOIDA, Nextt, and LeadGenLab. The alternative is to query each engine directly and collect the source links. If rendering is fixed and citations still do not appear, the cause has moved to content structure, and why Perplexity does not cite your content plus the technical GEO and content GEO framework pick up the next step. For the concept itself, start with what GEO is.

Summary

Most AI crawlers do not execute JavaScript. GPTBot, ClaudeBot, PerplexityBot, Meta-ExternalAgent, and Bytespider all fall in that group, and while they download JS files, they never run them (Vercel, MERJ, 2024). Googlebot documents a rendering step, Applebot states it can render in a browser, and Bingbot says it cannot do so at scale. That leaves a CSR page in a split state, alive in Google search and absent from AI answers. Verify with curl rather than a browser, and fix with server-side and static rendering rather than dynamic rendering. Quotable content comes from the server, everything else can stay in the browser, and that one line is the baseline that closes the blind spot.

Related companies

Frequently asked questions

Q.Do AI crawlers execute JavaScript?
Most of them do not. Server log analysis by Vercel and MERJ found no JavaScript rendering from OpenAI (GPTBot, OAI-SearchBot, ChatGPT-User), Anthropic (ClaudeBot), Perplexity (PerplexityBot), Meta (Meta-ExternalAgent), or ByteDance (Bytespider) in 2024. The exceptions are Googlebot, which documents a rendering step (Google Search Central, 2026), and Applebot, which states it can render inside a browser (Apple, 2026).
Q.Google indexes our pages fine, so why does ChatGPT never cite them?
Googlebot works in three stages, crawl, render, and index, and executes JavaScript with evergreen Chromium. AI crawlers stop after reading the raw HTML. Body copy that only fills in inside a browser is visible to Google and looks like an empty container to an AI crawler.
Q.How do I check whether my site sits in the blind spot?
Look at the raw HTML, not the Elements tab in your browser devtools. Fetch the page with curl and grep for body sentences, prices, FAQ answers, and JSON-LD script blocks. If the browser shows it and curl does not, that content does not exist as far as an AI crawler is concerned.
Q.Can I just solve this with dynamic rendering (prerendering)?
It works as a stopgap, but it is not the recommended fix. Google labels dynamic rendering a workaround and says it is not a long-term answer because of the added complexity and resource load. The recommendation is server-side rendering, static rendering, or hydration.
Q.We inject structured data through a tag manager. Is that a problem?
Google reads JavaScript-generated structured data from the DOM after rendering. An AI crawler that never runs JavaScript simply does not see that JSON-LD. If AI citation is the goal, the JSON-LD belongs in the raw HTML the server returns.
Q.Do we have to move everything to SSR?
No. The test is whether the content is quotable. Titles, body copy, prices, specs, FAQ answers, navigation, and metadata belong in the server-rendered HTML. Supporting interactions such as filters, carousels, and animations can stay on the client.

Sources

  1. [1] ↑The rise of the AI crawlerVercel, MERJ
  2. [2] ↑JavaScript SEO 기본사항 이해하기Google Search Central
  3. [3] ↑Dynamic rendering as a workaroundGoogle Search Central
  4. [4] ↑Generate structured data with JavaScriptGoogle Search Central
  5. [5] ↑AI features and your websiteGoogle Search Central
  6. [6] ↑OpenAI's Web CrawlersOpenAI
  7. [7] ↑About ApplebotApple
  8. [8] ↑bingbot Series: JavaScript, Dynamic Rendering, and Cloaking. Oh My!Bing Webmaster Blog

This document was last edited on Sep 10, 2026. WikiAP content is compiled from public primary sources and updated for accuracy.