Rendering: SSR vs CSR & JavaScript SEO
Before a search engine can rank your page, it has to see it. But what Googlebot "sees" depends entirely on how your page is rendered — that is, how raw HTML, CSS, and JavaScript get turned into the final content. Choosing between server-side rendering (SSR) and client-side rendering (CSR) is one of the most consequential technical SEO decisions you can make. This guide explains the rendering models, how Googlebot processes JavaScript, and how to make sure your content actually gets indexed.
1. What Is "Rendering" in SEO?
Rendering is the process of taking the resources of a web page — the HTML document, the CSS, and any JavaScript — and turning them into the Document Object Model (DOM): the live, in-memory representation of the page that a browser (or a search engine) can read and index.
The crucial distinction for SEO is between two states of the page:
- The raw HTML source: exactly what the server sends back in its initial response. This is what you see when you click "View Source". No JavaScript has run yet.
- The rendered DOM: the final structure after the browser has executed JavaScript, fetched data, and modified the page. This is what you see in the "Inspect" / Elements panel of your developer tools.
When these two are identical, life is easy: everything a crawler needs is in the initial response. When they differ — because JavaScript injects the title, the headings, the body copy, or the internal links — the search engine has to do extra work to discover that content, and sometimes it never does.
2. Client-Side Rendering (CSR)
In client-side rendering, the server sends a nearly empty HTML shell, and the browser builds the actual content using JavaScript. This is the default model for Single Page Applications (SPAs) built with frameworks like React, Vue, and Angular.
The initial HTML response often looks like this:
<!DOCTYPE html>
<html>
<head>
<title>Loading...</title>
</head>
<body>
<div id="root"></div>
<script src="/static/js/bundle.js"></script>
</body>
</html>
All of the real content — headings, paragraphs, links, meta tags — is injected into that
empty <div id="root"> only after bundle.js downloads, parses, and runs.
The advantages of CSR:
- Snappy, app-like navigation after the first load (no full page reloads).
- Reduced server load — rendering work is offloaded to the user's device.
- A clean separation between a back-end API and a front-end client.
The SEO risks of CSR:
- The initial HTML is essentially empty of content. Any crawler that does not execute JavaScript sees nothing of value.
- All indexable content depends on successful JS execution. A single script error, a blocked resource, or a slow API call can leave the page blank in the eyes of a crawler.
- Critical SEO elements (title, meta description, canonical, structured data) are frequently added by JavaScript, which delays or risks their discovery.
Caution: "It works in my browser" is not proof that it works for crawlers. Your browser is a top-of-the-line rendering engine with no time limit. Search bots, social scrapers, and AI crawlers often have strict budgets — or no JavaScript engine at all. Pure CSR can mean your most important pages are functionally invisible to a large slice of the web.
3. Server-Side Rendering (SSR)
In server-side rendering, the server runs the JavaScript and assembles the complete HTML before sending it to the client. The content is present in the very first response, so a crawler receives a fully populated page immediately — no JS execution required.
The initial response from an SSR page looks much more like a traditional website:
<!DOCTYPE html>
<html>
<head>
<title>Best Running Shoes for Beginners in 2026 - ShoeStore</title>
<meta name="description" content="Our hand-picked guide to...">
</head>
<body>
<div id="root">
<h1>Top 10 Running Shoes for Beginners</h1>
<p>Choosing your first pair of running shoes...</p>
<a href="/reviews/nike-pegasus">Read our Nike review</a>
</div>
<script src="/static/js/bundle.js"></script>
</body>
</html>
Notice that the heading, paragraph, and internal link are all present in the raw HTML. JavaScript can still "hydrate" the page afterwards to add interactivity, but the content does not depend on it for indexing.
SSR is the safest choice for SEO. Popular frameworks that make it accessible include Next.js (React) and Nuxt (Vue), both of which let you keep the developer experience of a modern SPA while serving real HTML on the first request.
4. SSG, ISR & Dynamic Rendering
SSR and CSR are the two poles of a spectrum. Several hybrid strategies sit in between:
- Static Site Generation (SSG): Pages are rendered to plain HTML files at build time, then served from a CDN. This is the fastest and most crawler-friendly option, ideal for content that doesn't change per-request (blogs, docs, marketing pages).
- Incremental Static Regeneration (ISR): A hybrid where statically generated pages are re-built in the background on a schedule or on demand. You get the speed of SSG with the freshness of SSR — popularized by Next.js.
- Hydration: The process of attaching JavaScript event handlers to server-rendered HTML so it becomes interactive. The content is already there; hydration just "wakes it up". Watch out for hydration mismatches, which can cause flickering or duplicated content.
- Dynamic Rendering: A workaround where the server detects a bot's user-agent and serves it a pre-rendered HTML snapshot, while real users get the normal CSR app.
Caution: Dynamic Rendering is now officially deprecated by Google. It was always intended as a temporary band-aid, it is brittle to maintain, it can drift into cloaking territory, and modern alternatives (SSR/SSG/ISR) solve the problem properly. Do not build a new site around it — reach for true server-side rendering instead.
5. How Googlebot Renders JavaScript
Google does render JavaScript — but not in a single step. Its pipeline has three distinct stages:
- Crawl: Googlebot requests the URL and reads the raw HTML response. It discovers links and queues new URLs from this stage.
- Render queue: If the page needs JavaScript to display its content, the URL is placed into a render queue, where it waits for resources from the Web Rendering Service (a headless Chromium instance).
- Index: Once rendered, the final DOM is parsed and the discovered content and links are indexed.
This split creates the well-known "two waves of indexing" concept. In the first wave, Google indexes whatever is in the raw HTML. In the second wave — which can arrive seconds, hours, or even days later — it indexes the JavaScript-rendered content. If your content only exists in that second wave, it is indexed late, and any links discovered only after rendering are crawled even later.
Two practical realities make this worse:
- Render budget & latency: Rendering JavaScript at web scale is expensive. Google allocates a finite budget, so heavy or slow pages may be deprioritized or rendered incompletely.
- Other crawlers are far worse at JS: Bing renders some JavaScript but less reliably. Social scrapers (Facebook, LinkedIn, X), and many AI crawlers (the bots feeding LLMs and AI search) frequently do not execute JavaScript at all. For them, your raw HTML is your page.
6. Why SSR vs CSR Matters for SEO
The rendering model touches nearly every pillar of technical SEO:
- Indexability: Content that isn't present in the rendered DOM at index time simply will not be indexed. With CSR, a JS failure means lost content; with SSR, the content is guaranteed in the response.
- Crawl efficiency: When links live in the raw HTML, Google discovers and crawls your site faster. CSR sites force Google through the slow render queue just to find internal links, wasting crawl budget.
- Performance & Core Web Vitals: CSR ships large JS bundles that delay First Contentful Paint and hurt Largest Contentful Paint and Interaction to Next Paint. SSR/SSG deliver visible content faster, improving the vitals that feed into the page-experience signals.
- Social & AI visibility: Because social scrapers and AI bots often skip JS, SSR is essential for rich link previews and for being represented in AI-generated answers.
Pro Tip: Rank-O-Saur runs a side-by-side SSR vs CSR comparison for any page. It fetches the raw server HTML and compares it against the fully rendered DOM, then shows you exactly which elements are present in the server response versus added later by JavaScript — SEO tags (title, description, canonical), headings, body content, links, images, and structured-data markup. If a critical element only appears in the rendered column, you've found a rendering risk before Google does.
7. How to Check Your Rendering
You don't have to guess how your page renders. Here are the fastest ways to inspect it:
- View Source vs. Inspect: Right-click and choose "View Page Source" to see the raw HTML the server sent. Then open DevTools and look at the "Elements" tab to see the rendered DOM. If your content is in the second but missing from the first, it's being added by JavaScript.
- The URL Inspection Tool: In Google Search Console, inspect a live URL and view the "Tested page" HTML and screenshot. This shows you what Google actually rendered — the ground truth.
- Disable JavaScript: Use DevTools (Command Palette → "Disable JavaScript") and reload the page. Whatever disappears is content that a non-JS crawler would never see.
- Search a unique string: Take a sentence that only appears on the rendered page and search Google for it in quotes. If it doesn't surface, that content may not be indexed.
8. Best Practices
- Prefer SSR or SSG for critical content: Anything that must rank — product pages, articles, category pages — should be rendered on the server or statically generated, never left to client-side JavaScript alone.
- Put key SEO elements in the initial HTML: The title tag, meta description,
canonical link, structured data,
<h1>, and primary copy should all be present in the raw server response, not injected after load. - Use real, crawlable links: Internal navigation should use proper
<a href>anchors in the HTML, notonclickhandlers that only work after JS runs. - Don't hide content behind interactions: Content revealed only on click, scroll, or hover may be ignored. Ensure indexable text exists in the DOM by default.
- Don't block your resources: Make sure
robots.txtdoes not block the JS and CSS files Google needs to render the page. - Test the rendered output regularly: Rendering can break silently after a deploy. Make SSR-vs-CSR comparison and URL inspection part of your routine QA.