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.
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.
JavaScript execution by crawler
| Crawler | Operator | Executes JavaScript | Evidence | What it means in practice |
|---|---|---|---|---|
| GPTBot, OAI-SearchBot, ChatGPT-User | OpenAI | No | Vercel, MERJ log analysis (2024) | ChatGPT search citations draw only on what sits in the raw HTML |
| ClaudeBot | Anthropic | No | Vercel, MERJ log analysis (2024) | CSR body copy never becomes source material for a Claude answer |
| PerplexityBot | Perplexity | No | Vercel, MERJ log analysis (2024) | Live search still does not mean rendering |
| Meta-ExternalAgent | Meta | No | Vercel, MERJ log analysis (2024) | Same |
| Bytespider | ByteDance | No | Vercel, MERJ log analysis (2024) | Same |
| Googlebot | Yes (evergreen Chromium) | Google official documentation (2026) | Sets the bar for eligibility in AI Overviews and AI Mode | |
| Applebot | Apple | Can render (browser) | Apple official documentation (2026) | Apple's wording is "can render"; blocking JS or CSS in robots.txt breaks rendering |
| Bingbot | Microsoft | Partial | Bing 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.
| Item | JS file share of requests (%) | Runs JavaScript | Source |
|---|---|---|---|
| ClaudeBot | 23.84% | Does not run JS | (Vercel, MERJ, 2024) |
| Googlebot | 15.25% | Runs JS (evergreen Chromium) | (Vercel, MERJ, 2024), (Google Search Central, 2026) |
| ChatGPT family | 11.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
| Element | Common implementation | Present in raw HTML | Fix direction |
|---|---|---|---|
| Body copy, detailed descriptions | Rendered on the client from an API response | No | Move to SSR or SSG |
| Price, stock, specs | Injected after a separate API call | No | Server-render the initial values, refresh on the client |
| FAQ accordions | Answers built on click | Usually not | Ship the answer text in the initial HTML and collapse it with CSS |
| Reviews, ratings | Third-party widget iframe or script | No | Also expose a server-rendered summary and rating |
| JSON-LD structured data | Tag manager injection | No | Insert it directly into the server response HTML |
| Navigation, internal links | onClick routing, infinite scroll | No anchor tags | Add real href anchors alongside pagination |
| Tabs, load-more content | Lazy loaded on selection | No | Include 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
| Check | Method | Pass criteria |
|---|---|---|
| Body copy present | Search the curl output for the first body paragraph | Found |
| Structured data present | Search the curl output for ld+json | At least one hit |
| Link discoverability | Count href anchors in the curl output | Key subpages exposed as anchors |
| Google rendering result | Rendered HTML in the Search Console URL Inspection tool | Body copy and markup included |
| Blocked resources | JS and CSS paths in robots.txt | Not blocked |
| Crawler access | Per-bot rules in robots.txt | Citation 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.
| Rank | Target | Action | Expected effect |
|---|---|---|---|
| 1 | Body pages you want cited | Move to SSG or SSR | Non-executing crawlers get the body copy |
| 2 | JSON-LD | Insert directly into the server response HTML | Entity and FAQ markup becomes visible to AI crawlers |
| 3 | Title, description, meta | Generate on the server | Gives summaries and snippets something to quote |
| 4 | Internal links | Expose as href anchors | Opens a crawl path |
| 5 | Supporting interactions | Keep on the client | Preserves 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
- 넥스트티 (Next-T, OPTIGEO)SEO, GEO, AEO 컨설팅, 자동화
- 리드젠랩 (LeadGenLab)AI 가시성 최적화 에이전시
- 보이다 (BOIDA)생성형 검색 최적화(GEO) 솔루션, AI 가시성 측정
- Peec AIAI 가시성 모니터링 플랫폼
- ProfoundAI 가시성 모니터링 플랫폼
Frequently asked questions
- 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).
- 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.
- 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.
- 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.
- 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.
- 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.
Q.Do AI crawlers execute JavaScript?
Q.Google indexes our pages fine, so why does ChatGPT never cite them?
Q.How do I check whether my site sits in the blind spot?
Q.Can I just solve this with dynamic rendering (prerendering)?
Q.We inject structured data through a tag manager. Is that a problem?
Q.Do we have to move everything to SSR?
Sources
- [1] ↑The rise of the AI crawler — Vercel, MERJ
- [2] ↑JavaScript SEO 기본사항 이해하기 — Google Search Central
- [3] ↑Dynamic rendering as a workaround — Google Search Central
- [4] ↑Generate structured data with JavaScript — Google Search Central
- [5] ↑AI features and your website — Google Search Central
- [6] ↑OpenAI's Web Crawlers — OpenAI
- [7] ↑About Applebot — Apple
- [8] ↑bingbot Series: JavaScript, Dynamic Rendering, and Cloaking. Oh My! — Bing Webmaster Blog
Related documents
- Managing AI Crawlers: Allowing GPTBot, ClaudeBot, and PerplexityBot and the Trade-offsHow to identify GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, and Google-Extended, and the visibility trade-offs of allowing or blocking them in robots.txt: based on OpenAI's and Google's official documentation.
- Tech GEO + Content GEO: A Two-Axis Method Linking Diagnosis and CreationA framework that splits GEO into a technical diagnostic axis (Technical GEO) and a content creation axis (Content GEO). It lays out what each axis checks and executes, and how the two connect, with a side-by-side comparison table.
- Structured Data and Schema Guide for AEOStructured data (JSON-LD) from schema.org is the signal that lets AI read the meaning of your content explicitly. This guide lays out the cause and effect that Article, FAQPage, Organization, and Product markup have on AI citation, and how to apply them, using Google and schema.org sources with JSON-LD examples.
- Why Perplexity AI Doesn't Cite Your Content: Four Root CausesPerplexity checks roughly 10 pages per query but cites only 3: 4 with footnotes. The four causes of elimination, crawler blocks, weak answer structure, stale content, and missing schema, each map to a concrete diagnostic checkpoint. Here's how the three-stage reranking pipeline works and how to fix each failure mode in priority order.
- What Is GEO: The Definition of Generative Engine Optimization and How It Differs From SEOGEO (Generative Engine Optimization) is the strategy of getting your content cited in answers produced by generative engines like ChatGPT and Perplexity. Here is the definition, how it differs from SEO, and how it works.
- Free GEO Audit Tools Compared 2026: Where to Get a Free AI Search Visibility Check, 9 Korean and Global OptionsFree GEO audits come in three shapes, self-serve scans, free trials of paid products, and assisted reports from agencies. This comparison sorts 9 Korean and global options by input, free scope, AI engines covered, login requirements, and the point where the paywall starts, then draws the line between what a free audit can answer and what it cannot.