TL;DR

GPTBot fetches JavaScript in only 11.5% of requests and ClaudeBot in 23.84%, but neither executes it—meaning client-side rendered pages are blank to them. Google's AI Overviews are the exception because they pull from Google's already-rendered index, not from a separate crawl. A CSR page that loads pricing, specs, or comparisons via script is invisible to ChatGPT, Claude, and Perplexity, regardless of content quality.

The fix is not a full rewrite: inventory revenue-critical pages, test them with JavaScript disabled, and push engineering to switch those routes to server-side rendering or static generation. Your bottom line: if a non-rendering crawler sees an empty shell, your brand won't appear in AI answers.

The definition

Direct answer: This is a distinct problem from "JavaScript SEO," which for a decade has meant optimizing for Googlebot — a crawler that does execute JavaScript, via a headless Chromium renderer, before indexing a page. That older problem is about rendering queues and delays. This one is about rendering capability: several of the systems that decide whether your brand shows up in an AI-generated answer simply don't have a browser in the loop.

Why this isn't the Googlebot problem in a new coat

Direct answer: " That's a real browser, doing real rendering work, even if it happens on a delay after the initial crawl. That's the "index it later" model content teams have optimized around since 2018.

Google's own Search Central documentation lays out Googlebot's process in three phases — crawling, rendering, and indexing — and is explicit that "once Google's resources allow, a headless Chromium renders the page and executes the JavaScript," after which Google "uses the rendered HTML to index the page." That's a real browser, doing real rendering work, even if it happens on a delay after the initial crawl. That's the "index it later" model content teams have optimized around since 2018.

AI retrieval crawlers behave differently. Vercel published a study with digital marketing analytics firm MERJ, "The rise of the AI crawler," analyzing real crawler traffic across its network. The finding: GPTBot fetches JavaScript files in roughly 11.5% of its requests, and ClaudeBot in roughly 23.84% — but neither one ever executes what it downloads. Across the crawlers Vercel measured, none renders JavaScript. That's not a queue delay. It's an architectural ceiling: no matter how long you wait, a script-only page stays blank to these systems.

The practical effect is a split in what "gets seen." OpenAI documents three separate agents in its crawler overview — GPTBot (training data collection), OAI-SearchBot (the index behind ChatGPT Search), and ChatGPT-User (live fetches triggered by a user's prompt) — and none of them run a rendering engine. Anthropic's Claude Help Center documentation similarly describes ClaudeBot, Claude-User, and Claude-SearchBot as content-fetching agents, not browser-based renderers. Perplexity's help center article on robots.txt describes PerplexityBot indexing "similarly to other search engines" by reading page content directly, with no mention of a rendering step.

Google's AI Overviews and AI Mode are the exception that proves the rule, and it's worth being precise about why: they aren't a separate crawl. Google's documentation on AI features and your website states that "to be eligible to be shown as a supporting link in AI Overviews or AI Mode, a page must be indexed and eligible to be shown in Google Search with a snippet" — meaning AI Overviews draw on the same index that Googlebot's Chromium-based renderer already built. If Googlebot can render your page, AI Overviews can cite it. If GPTBot or ClaudeBot can't render your page, ChatGPT and Claude can't cite it, no matter how good the content is once it loads.

Rendering strategies compared

Direct answer: Different rendering strategies produce fundamentally different HTML at first response — which is the only HTML most AI crawlers ever see. Next.js's own documentation on rendering describes the tradeoffs this table summarizes.

StrategyHTML at first responseVisible to non-rendering AI crawlersVisible to Googlebot / AI OverviewsTypical use case
Static generation (SSG)Full content, built ahead of timeYesYesBlog posts, docs, marketing pages
Server-side rendering (SSR)Full content, built per requestYesYesPages with per-request personalization that still need to be readable without JS
Incremental static regeneration (ISR)Full content, rebuilt on a schedule/on demandYesYesLarge catalogs, pricing pages that change periodically
Client-side rendering (CSR)Empty shell + script tagsNoYes (after Chromium executes JS)Authenticated dashboards, internal tools
Hybrid (app shell + partial hydration)Partial content, rest loads via JSPartial — only the pre-rendered partYesComplex apps with some public, some interactive surface

The row that should worry content and product teams is client-side rendering. It's fully visible to Google's renderer and to a human in a browser — but to GPTBot, ClaudeBot, and PerplexityBot, a CSR page is functionally the same as a blank page. If your pricing page, comparison page, or product spec sheet loads its actual text via a script after the initial HTML, retrieval-based AI answer engines are working from nothing.

For the data behind that claim — Vercel's analysis of 569 million requests showing exactly which AI crawlers execute JavaScript and which don't — see our practical breakdown of client-side rendering and AI search visibility.

A step-by-step process for content and product teams

  1. Inventory your public-facing, revenue-relevant pages — pricing, product/feature pages, comparison pages, docs, blog posts, and any page you'd want cited in an AI-generated answer. Ignore logged-in app surfaces; they're out of scope for retrieval visibility.
  2. Check what a non-JS fetch actually returns. Disable JavaScript in your browser (or use a plain curl request) and load each page. If the core claims — pricing, feature names, specs — are missing from the raw response, that page is invisible to most AI crawlers today.
  3. Confirm which rendering mode each page actually uses, not which one you think it uses. Ask engineering directly: is this page statically generated, server-rendered, or does it depend on client-side data fetching for its primary content? Frameworks often mix modes per-route, so this varies page by page even within one site.
  4. Prioritize by retrieval value, not by traffic. A low-traffic comparison page that answers a common AI-search query (e.g., "X vs Y pricing") is often worth fixing before a high-traffic page that's already server-rendered.
  5. Push for server-rendered or statically generated HTML on anything you want cited, even if the interactive version stays client-rendered for logged-in users. This is a rendering-strategy decision, not a rewrite of your entire application.
  6. Write the load-bearing facts directly into the markup, not into a JSON payload a script parses afterward. Price, availability, and key claims should be plain text in the HTML that comes back on the first request.
  7. Verify with the actual crawlers, not just your browser. OpenAI, Anthropic, and Perplexity publish IP ranges and user-agent strings for their bots (linked from their respective documentation above) — request logs can confirm whether these agents are successfully fetching full content, not just hitting your server.
  8. Re-run the raw-HTML check after every major frontend redeploy. A framework upgrade or a new component library can silently flip a page from server-rendered to client-rendered without anyone noticing until visibility drops.
  9. Extend the same check to any embedded widgets or third-party content blocks (reviews, pricing calculators, FAQ accordions) — these are common places where a team fixes the main page but leaves a script-only widget carrying facts that never make it into the raw response.

What this doesn't guarantee

Direct answer: Fixing rendering makes your content reachable . It does not make it chosen .

Fixing rendering makes your content reachable. It does not make it chosen. Being readable in raw HTML is necessary but not sufficient — none of the following are solved by a rendering fix:

  • Citation isn't guaranteed. Google is explicit that AI Overviews only appear when its systems judge them additive to the search results, and even then a page must already be competitive enough to earn a snippet in classic search — rendering fixes remove a blocker, they don't add a ranking boost.
  • robots.txt still governs access. A perfectly server-rendered page blocked from GPTBot or ClaudeBot in robots.txt is still invisible to that crawler, rendering aside.
  • User-triggered fetches behave differently from indexing crawlers. Perplexity's documentation distinguishes PerplexityBot (which respects robots.txt for indexing) from Perplexity-User (a live, user-triggered fetch) — the rules and caching behavior aren't identical across every request type from the same company.
  • This doesn't fix stale or wrong content. If your raw HTML is readable but outdated, you've made an inaccurate answer easier for an AI system to retrieve, not a better one.
  • It doesn't substitute for the deeper crawler-focused technical work — sitemap hygiene, canonical tags in the initial HTML rather than injected via JavaScript, response codes, and server capacity for these bots — which is a separate, more infrastructure-heavy discipline from the content-team checklist above.

FAQ

Direct answer: Not directly. Googlebot renders JavaScript with a headless Chromium browser, so a client-side-rendered page can still be crawled, rendered, and indexed for classic search and for AI Overviews. The retrieval gap described here is specific to crawlers that skip the rendering step entirely — GPTBot, ClaudeBot, and PerplexityBot among them.

If I fix rendering, will ChatGPT start citing my site?

It becomes possible, not automatic. Being readable removes a hard technical blocker, but citation still depends on the content actually being relevant, current, and competitive against whatever else the system retrieves for a given query.

Is server-side rendering the only fix?

No — static generation and incremental static regeneration both produce full HTML on the first response and work just as well for this purpose. The requirement is that the content exists in the HTML the crawler receives, regardless of which prerendering strategy produces it.

Do I need to convert my whole site?

No. This matters most for public pages you want cited or summarized — pricing, product specs, comparisons, docs, blog content. Logged-in dashboards and internal tools can stay client-rendered without any retrieval consequence, since AI crawlers aren't fetching authenticated pages anyway.

How is this different from the JavaScript SEO guidance I've already implemented for Google?

Google's guidance assumes a renderer is eventually in the loop, so the fixes there are often about crawl budget, rendering delay, and making sure Googlebot reaches a page at all. This is a harder constraint: for GPTBot, ClaudeBot, and PerplexityBot, there is no later rendering step to wait for. If it's not in the first HTML response, it doesn't exist for those systems.

Can I just check this myself without engineering help?

Yes, for a first pass. Load a page with JavaScript disabled in your browser, or run a plain HTTP request against the URL, and compare what comes back to what you see normally. If your core content is missing, you have a rendering gap worth raising with engineering — you don't need deep technical tooling to spot it.

Evidence and scope

Review date: 2026-09-12.

Reproducible use. Use the framework with a defined audience, source data, and review date; test material recommendations against your own evidence before making a production or buying decision.

Limit. This article is educational guidance, not legal, financial, security, or performance assurance.