On this page8 sections
- Why it matters
- How does server-side rendering work?
- Do AI crawlers render JavaScript?
- The Raw-HTML Visibility Ratio
- Server-side rendering vs client-side rendering: what's the difference for SEO?
- How do you check whether a page is server-side rendered?
- Common mistakes with server-side rendering
- Related terms
Why it matters for founders and small teams
If your site is a JavaScript app, Google may still read your content while ChatGPT, Claude and Perplexity see an empty page — and nothing gets cited from an empty page. For a small team this is the rare technical fix with an outsized payoff: one rendering change can make every article you’ve already published readable to the AI engines your buyers ask.
How does server-side rendering work?#
Server-side rendering works by running the page’s code on the server, per request or at build time, so the HTML that arrives already contains the text, links and metadata — instead of an empty shell that JavaScript fills in later in the browser.
In a client-side rendered (CSR) app, the server sends a near-empty HTML document plus a bundle of JavaScript; the browser runs the script, fetches the data and builds the page. A person never notices. A crawler that reads only the first response sees the shell. Server rendering moves that work to the server, and the browser then hydrates the page — attaches the JavaScript that makes it interactive — without changing what the HTML already said.
| Approach | When the HTML is built | What a non-rendering crawler sees |
|---|---|---|
| Client-side rendering (CSR) | In the browser, after JavaScript runs | An empty shell, often a single <div> |
| Server-side rendering (SSR) | On the server, for each request | The full page |
| Static generation (SSG) | At build time, served as files | The full page |
| Incremental regeneration | At build time, then rebuilt on a schedule or on change | The full page, as of the last rebuild |
| Prerendering for bots | By a headless browser, cached and served to crawlers | The full page, if the cache is current |
Frameworks such as Next.js, Nuxt, SvelteKit, Astro and Remix support server rendering or static generation out of the box, and traditional platforms like WordPress and Shopify build HTML on the server. The risk sits mainly with single-page apps built on plain React, Vue or Angular, and with pages that load their main copy through a widget or API call after the page arrives.
Do AI crawlers render JavaScript?#
Most AI crawlers do not render JavaScript: OpenAI’s, Anthropic’s and Perplexity’s bots read the raw HTML response, so text that appears only after scripts run is invisible to them. Googlebot, which also feeds Gemini and AI Overviews, does render JavaScript, and so does Applebot.
None
of the major AI crawlers executed JavaScript in a study of Vercel's network — OpenAI, Anthropic, Meta, ByteDance and Perplexity included
23.84%
of Claude's crawler requests downloaded JavaScript files it then didn't run (ChatGPT's: 11.50%)
~28%
GPTBot, Claude, Applebot and PerplexityBot's combined fetches as a share of Googlebot's volume
| Engine | Crawler that reads your page | Runs JavaScript? |
|---|---|---|
| Google Search, AI Overviews, AI Mode, Gemini | Googlebot | Yes — queued, with a 2 MB HTML limit |
| ChatGPT search | OAI-SearchBot, ChatGPT-User | No — undocumented by OpenAI, none observed |
| Claude | Claude-SearchBot, Claude-User | No — Anthropic’s fetch tool doesn’t support JavaScript-rendered sites |
| Perplexity | PerplexityBot, Perplexity-User | No — failed on client-rendered pages in tests |
| Apple | Applebot | Yes — a browser-based crawler |
In August 2025 Glenn Gabe tested ChatGPT, Claude and Perplexity against client-rendered URLs and all three failed to read them, while server-rendered pages worked. Google hedges too: its own JavaScript guide says server-side or pre-rendering “is still a great idea” because “not all bots can run JavaScript.” See AI crawlers for what each bot is for.
Worked example
The Raw-HTML Visibility Ratio
A quick way to put a number on how much of a page non-rendering AI crawlers can read: compare the words in the raw HTML with the words a reader sees, then check the facts that matter. The inputs below are illustrative, for a fictional project-management app called Plannora — run the same steps on your own templates.
- 1
Count the words a reader sees
Open Plannora’s pricing page in a browser and count the visible body copy: plan names, prices, the feature list and the FAQ.
1,200 words
- 2
Count the words in the raw HTML
Fetch the page with
curland strip the tags. The shell holds the navigation, the footer and a loading message; the pricing table and FAQ arrive by JavaScript after load.180 words
- 3
Check the facts a buyer verifies
Search the raw HTML for five facts: starting price, free-tier limit, per-seat price, trial length and refund policy. Only the refund policy, linked in the footer, is there.
1 of 5 facts
- =
Visibility ratio
180 ÷ 1,200 — the share of the page ChatGPT, Claude and Perplexity can read. The fact ratio is 20%.
15%
The result: Anything under 100% on a page you want cited is a rendering bug, not a content problem. Moving Plannora’s pricing template to server rendering lifts both ratios to 100% without changing a word of copy — and only then does the page compete on what it says. Run the check once per template, and again after every front-end release.
Free to use and adapt. If you cite it, link to rankbox.xyz/glossary/server-side-rendering.
Server-side rendering vs client-side rendering: what's the difference for SEO?#
Client-side rendering asks every crawler to execute JavaScript before it can read the page, while server-side rendering hands over finished HTML. For Google the gap is speed and reliability, because rendering is queued; for most AI engines it is the difference between being readable and not existing.
Googlebot crawls a URL, then queues it for rendering in an evergreen, headless Chromium. Google says a page “may stay on this queue for a few seconds, but it can take longer than that,” and the renderer is stateless: it clears local storage and session data between requests. Copy that depends on a cookie-banner click, a logged-in state or a scroll event may never appear to it.
Two limits apply even to Google. Googlebot fetches only the first 2 MB of a page’s HTML, and bytes past the cut-off are “not fetched… not rendered… not indexed.” And a noindex in the initial HTML can stop rendering entirely, so JavaScript written to remove it may never run.
The practical split: keep interactive widgets client-side if you like, but make sure the server HTML already carries everything a crawler needs — the title tag, meta description, canonical tag, robots meta, the main text, internal links as real <a href> elements, visible dates and any JSON-LD.
How do you check whether a page is server-side rendered?#
Check server-side rendering by fetching the raw HTML the way a non-rendering crawler does — with curl or View Source, not the browser’s inspector — and searching it for a sentence from the page’s main content. If the sentence is missing, AI crawlers can’t see it either.
# What ChatGPT's search crawler receives. Use a real bot user agent:# a firewall can serve bots something different from browsers.curl -s -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot" \ https://yoursite.com/pricing | grep -c "Plans start at" # The same check as Claude's live fetchercurl -s -A "Claude-User" https://yoursite.com/pricing | grep -c "Plans start at" # 0 = the text is rendered client-side, or a WAF served a challenge- Use View Source, not Inspect. The element inspector shows the page after JavaScript ran;
view-source:shows what a crawler receives. - Disable JavaScript in your browser’s developer tools and reload. What’s left is roughly what a non-rendering bot reads.
- Compare with Google’s view in Search Console: URL Inspection → View crawled page shows the rendered HTML Googlebot indexed.
- Test each template, not one page. Blog posts, pricing, docs and comparison pages often take different rendering paths.
Common mistakes with server-side rendering#
The most common server-side rendering mistakes are assuming Google’s rendering covers every engine, serving prerendered pages only to bots, and server-rendering the body while still injecting canonicals, schema and links with JavaScript.
Myth
Google renders JavaScript, so SSR no longer matters.
Reality
Google does, with a queue and a 2 MB limit. ChatGPT, Claude and Perplexity don’t — so a client-rendered page can rank on Google and still never be cited by them.
Myth
If the body text is in the HTML, the job is done.
Reality
Canonicals, robots meta, JSON-LD and navigation added by a script or tag manager are just as invisible to non-rendering bots. Google can read injected JSON-LD; a bot that runs no scripts can’t.
Myth
A server-rendered page is always what the bot gets.
Reality
A CDN challenge or bot-protection rule can hand AI crawlers an interstitial instead. Test with their user agents, and check your firewall’s AI-bot settings.
Myth
Rendering fixes are a one-time project.
Reality
A redesign, a new CMS block or a framework upgrade can quietly move copy back to the client. Re-run the raw-HTML check after every front-end release.
Related terms#
- AI crawlersAI crawlersAutomated bots run by AI companies that fetch web pages for one of three jobs — training models, building an AI search index, or retrieving a page live for a user’s question — and because each job uses its own user agent, each can be allowed or blocked separately.Read the entry
- Technical SEOIndexingThe step in which a search engine processes a crawled page and stores it in its searchable database; only indexed pages can rank, or be retrieved for AI answers built on that index, and being crawled does not guarantee being indexed.Read the entry
- AI crawlersOAI-SearchBotOpenAI’s search crawler, the bot that surfaces websites in ChatGPT search answers, which makes it the OpenAI user agent to allow for ChatGPT visibility — unlike GPTBot, which collects content only for model training.Read the entry
- AI crawlersClaudeBotAnthropic’s crawler for collecting web content that may be used to train Claude models, one of three Anthropic bots alongside Claude-SearchBot, which indexes pages for Claude’s search results, and Claude-User, which fetches pages when a user asks.Read the entry
- AI crawlersPerplexityBotPerplexity’s crawler for indexing web pages so they can be surfaced and cited in Perplexity’s answers — Perplexity says it is not used to train foundation models — while a separate agent, Perplexity-User, fetches pages live when a user asks.Read the entry
- CWVTechnical SEOCore Web VitalsGoogle’s three field metrics for page experience — Largest Contentful Paint for loading, Interaction to Next Paint for responsiveness and Cumulative Layout Shift for visual stability — measured from real Chrome users and used as a modest ranking signal.Read the entry
Go deeper
Sources
- 1.Understand the JavaScript SEO basicsGoogle Search Central · developers.google.com ↗
- 2.Dynamic rendering as a workaroundGoogle Search Central · developers.google.com ↗
- 3.Inside Googlebot: demystifying crawling, fetching, and the bytes we processGoogle Search Central Blog · developers.google.com ↗
- 4.Web fetch toolClaude Developer Platform · platform.claude.com ↗
- 5.The rise of the AI crawlerVercel · vercel.com ↗
- 6.AI search and JavaScript renderingGSQi (Glenn Gabe) · gsqi.com ↗
