Rendering

How Google's Web Rendering Service runs your JavaScript to build the page it indexes — plus the rendering options (CSR, SSR, SSG, hydration, ISR, edge, dynamic) and their SEO trade-offs.

First published: Jun 23, 2026 · Last updated: Jul 18, 2026 · Advanced
demand #25 in How Search Works#142 in Technical SEO#194 on the site
1 evidence signal on this page

Rendering is the step where Google runs your JavaScript in an evergreen, headless Chrome — the Web Rendering Service — to build the DOM it indexes. It happens for essentially every page, usually within seconds-to-minutes, so the old 'two waves of indexing' model is largely outdated and there's no per-page render budget. The renderer is stateless, doesn't interact with the page, and caches hard. Your rendering option decides your SEO risk: SSR, static/prerendering, and hydration are safe; full client-side rendering is the risky one; dynamic rendering is a workaround.

TL;DR — Google renders your JS in an evergreen, headless Chromium — the Web RenderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. Service — to build the DOM it indexes. It happens for essentially all pages, usually within seconds-to-minutes, so “two waves of indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.” is largely outdated and there’s no per-page render budget. The WRS is stateless, declines permission prompts, doesn’t interact with the page, and caches aggressively. Your rendering option decides your SEO risk: SSR / static / prerendering / hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers. are low-risk; full CSR is the risky one; dynamic rendering is a workaround Google advises against. For the practical JS problems this creates, see JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript..

Where rendering sits

Google is explicit that JavaScript apps move through three phases: “Google processes JavaScript web apps in three main phases: 1. CrawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. 2. Rendering 3. IndexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed..” Evidence for this claim Google documents crawling, rendering, and indexing as the three main phases for processing JavaScript web apps. Scope: Google Search processing of JavaScript web applications; the phases can overlap operationally. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics Rendering is the bridge. CrawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. fetches the raw HTML; rendering runs the JavaScript to build the finished DOM; indexing reads that rendered DOM, and any new links the renderer finds get fed back into crawling. In Google’s words: “During the crawl, Google renders the page and runs any JavaScript it finds using a recent version of Chrome, similar to how your browser renders pages you visit.”

Rendering is the bridge between fetching a URL and indexing its finished DOM; parity, interaction, state, and timing can break that bridge. Source: JavaScript SEO

Google crawls a URL, renders its JavaScript to build the DOM, and indexes the result. Four practical failure modes branch from rendering: parity when the rendered DOM differs from expectations, interaction when content requires a scroll or click, state when content relies on cleared cookies or storage, and timing when content is deferred behind slow JavaScript.

© Patrick Stox LLC · CC BY 4.0 ·

The Web Rendering Service

Google renders in the Web Rendering Service (WRS) — a headless Chrome that’s evergreen: “While Google Search runs JavaScript with an evergreen version of Chromium…” it tracks current Chrome, so modern JavaScript and CSS features work.

The catch is that the WRS is a peculiar browser, and its quirks cause most real problems:

  • It’s stateless. As I put it in my JavaScript SEO guide, “Google loads each page stateless like it’s a fresh load.” Google’s docs spell out the pieces: “Local Storage and Session Storage data are cleared across page loads” and “HTTP Cookies are cleared across page loads.” Don’t rely on anything persisted client-side to serve your content.
  • It declines permissions. “Expect GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. to decline user permission requests.” Content gated behind a geolocation, notification, or camera prompt won’t render.
  • It doesn’t interact. No scrolling, clicking, or hovering — so content that only loads on one of those events is invisible by default. (This is the root of most lazy-load and infinite-scroll bugs; the fixes live on the JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. page.)
  • It caches aggressively. GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. caches aggressively in order to reduce network requests and resource usage. WRS may ignore cachingCaching stores a copy of a page or resource — in a browser, a CDN edge node, or a search crawler's own cache — so it can be served again without regenerating or re-downloading it. It isn't a direct ranking factor, but it feeds page speed and crawl efficiency. headers.” That means Google can run an outdated version of your JS or CSS. Fix it with file fingerprinting — version your filenames (app.4f2a9c.js) so a content change forces a fresh fetch.

Is “two waves of indexing” still a thing?

For years the mental model was “two waves of indexing”: Google would index the raw HTML first, then come back days or weeks later to render and index the JavaScript content. That model is now largely outdated. Martin Splitt has said the two-waves idea plays less and less of a role, that many pages go through the render phase even when they don’t rely on JavaScript, and that crawling, rendering, and indexing are converging over time.

In practice, rendering happens for essentially every page, and it’s usually fast. Google’s current documentation says a crawled page “may stay on this queue for a few seconds, but it can take longer than that” — there’s no published fixed delay or timeout. Evidence for this claim Google says a crawled page may stay on the rendering queue for a few seconds, but it can take longer than that. Scope: Google's rendering queue for a page that returns a 200 status and is eligible for rendering. The source gives a variable duration, not a fixed timeout or service-level guarantee. Confidence: high · Verified: Google Search Central: rendering-queue duration Supports: A page may remain on the rendering queue for a few seconds or longer. As a historical data point, Google staff (Martin Splitt and Tom Greenaway) once put the figure at a median of about five seconds, with the 90th percentile in minutes — not the “weeks” the old fear implied. I cite that figure in my JavaScript SEO guide, but treat it as a dated conference data point rather than a current published metric — Google hasn’t republished it as an ongoing number, and the queue-timing quote above is the current official framing.

And there’s no render budget in the way people imagine. Google doesn’t track a per-page “how expensive was this to render” score you need to conserve. Rendering is cheap at Google’s scale — optimize for your users and performance, not a phantom render budget.

The rendering options

“Where is the HTML built?” is the question that decides your SEO risk. The full menu:

The useful distinction is where initial HTML is produced and what work remains for the browser. Source: Rendering

Static generation produces HTML at build time. Server-side rendering produces it per request. Client-side rendering relies on browser JavaScript. Hydration attaches client behavior to server or static HTML. Dynamic rendering varies output by requester and is treated as a workaround.

© Patrick Stox LLC · CC BY 4.0 ·

  • Client-side rendering (CSR). The server sends a near-empty shell; the browser (or WRS) runs JavaScript to build everything. This is “the most problematic one … full client-side rendering where all of the rendering happens in the browser.” It can work, but you’re betting everything on the render succeeding, and it’s the slowest to get indexed.
  • Server-side rendering (SSR). The server builds the full HTML for each request. Content is in the raw HTML, so it’s low-risk for search.
  • Static site generation (SSG) / prerendering. HTML is built once at deploy time. Lowest risk — content is in the raw HTML and it’s fast.
  • Hydration (isomorphic / universal). You SSR or SSG the first paint, then JavaScript “hydrates” it in the browser to add interactivity. This is what most modern frameworks do, and it’s low-risk for content — just watch for hydration mismatches that blank out or replace content.
  • Incremental Static Regeneration (ISR). Static pages regenerated on a schedule or on demand. Like SSG, with fresher content — good for large catalogs.
  • Edge rendering. SSR run at CDN edge nodes — same low risk as SSR, with faster time-to-first-byte for a global audience.
  • Streaming SSR. HTML streamed to the browser in chunks as it’s ready. Low-risk, but make sure indexable content isn’t trapped only in a late or deferred chunk.

My bottom line from my JavaScript SEO guide: “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines. Gatsby, Next, Nuxt, etc., are all great.” The framework matters less than the rendering mode you ship — the same Next.js app is safe or risky depending on whether you serve SSR/SSG or full CSR.

Dynamic rendering — a workaround, not a strategy

Dynamic rendering means detecting botsA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. and serving them a prerendered, JavaScript-free version while users get the client-side version. Google is now blunt about it: “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines,” and “Dynamic rendering is a workaround and not a recommended solution, because it creates additional complexities and resource requirements.” Evidence for this claim Google describes dynamic rendering as a workaround and does not recommend it as a long-term solution. Scope: Google Search guidance for JavaScript-generated content; server-side rendering, static rendering, or hydration are the recommended alternatives. Confidence: high · Verified: Google Search Central: Dynamic rendering as a workaround I agree, and I always have — to be honest I never recommended it, and I’m glad Google now recommends against it too. It’s serving different content to bots and users, which is awfully close to cloaking. Reach for SSR, static, or hydration instead.

One wrinkle: Bing still suggests dynamic rendering. Microsoft says bingbotBingbot is Microsoft Bing's primary web crawler — the bot that discovers, fetches, and renders pages to build the Bing index. That index also powers Yahoo, DuckDuckGo, Ecosia, and Microsoft Copilot, so Bingbot's reach is far wider than Bing's own search-market share. is generally able to render JavaScriptMaking sure search engines can crawl, render, and index content that depends on JavaScript. but that doing it at scale is hard, so “we recommend dynamic rendering as a great alternative for websites relying heavily on JavaScript.” The practical takeaway: SSR/SSG keeps both engines happy and sidesteps the whole debate.

What this means for your content

Rendering decides whether Google ever sees your JavaScript content — but seeing it is only half the job. Once the page is rendered, the practical concerns are real <a href> links, field-specific parity between raw and rendered HTML, robots-directive stage order, lazy content, infinite scrollInfinite scroll is a loading pattern where content appears automatically as a user scrolls, instead of via numbered pages. Because Googlebot doesn't scroll or click, indexable infinite scroll needs real per-chunk URLs (paginated loading) that update via the History API — otherwise deep content may never be crawled, or worse, get merged into the wrong page., and soft-404s. Those all live on the JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. page, with the testing workflow (URL Inspection’s rendered HTML, screenshot, and console).

This is the rendering stage of the search pipeline. For the stages around it, see crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. (how pages get fetched) and indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. (what happens to the rendered page next), or the How Search WorksSearch works in three stages — crawling, indexing, and serving (ranking). A page has to clear each one to appear in results: getting crawled doesn't mean you're indexed, and getting indexed doesn't mean you rank. hub for the whole journey.

One audit rule is worth keeping here: rendered is a state, not a universal winner. For body content and crawlable links, the rendered DOM shows what successful JavaScript added or removed. For titles and descriptions, it shows additional inputs, while Google may still generate a title link or snippet from other sources. For robots directives, a raw noindex may prevent rendering, so JavaScript removal is asymmetric. For canonical, Google advises using one source or one JavaScript-set value rather than changing an existing value. And JavaScript cannot change the HTTP response status already received. Keep those columns separate in evidence and use Google’s current JavaScript SEO guidance for the field-specific behavior.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.