Dynamic Rendering vs SSR: Key Differences and SEO Trade-offs
Compare dynamic rendering vs server-side rendering (SSR) for JavaScript SEO: how crawlers handle each, cost, server load, Core Web Vitals, and which to choose.
Dynamic rendering vs server-side rendering comes down to who builds the HTML crawlers read, and when. Server-side rendering (SSR) builds a page's HTML on your server, so the first response already has content in it. Dynamic rendering loads the page in a real browser, waits until everything has finished loading, and serves that finished version to crawlers.
Most teams compare the two when a JavaScript site isn't getting indexed or cited, and the options look like a rewrite to SSR or a rendering layer in front of the site. The right pick depends on how the site is built, what loads after the first response, and whether the problem is crawlers or real visitors. Often the answer is both: SSR for the first response and dynamic rendering for everything that arrives later.
Encited runs dynamic rendering on client-side apps and server-rendered sites alike, with no changes to your code.
TL;DR
- Server-side rendering builds the first HTML response for everyone. It helps visitors' load speed and gives crawlers the basics.
- Dynamic rendering serves crawlers the page after it has fully loaded, including client-fetched data, deferred sections and widgets.
- Pick dynamic rendering when the site is a client-side app, a rewrite would take months, or content loads after the first response.
- Pick SSR when you're starting a new build or real visitors' speed is the problem.
- On server-rendered sites, the two work together. AI crawlers, which don't run JavaScript, gain the most from that.
The rendering methods
Client-side rendering (CSR). The server sends a near-empty HTML file and JavaScript files. The browser builds the page. This is the default for React, Vue and Angular single-page apps, and for most AI website builders.
Server-side rendering (SSR). The server runs your app and sends HTML with content in it. The browser then loads the JavaScript and makes the page interactive, a step called hydration. Next.js, Nuxt, SvelteKit, Angular's @angular/ssr, Shopify themes and most CMS platforms work this way.
Static site generation (SSG). Pages are rendered to HTML at build time and served as files.
Dynamic rendering. A rule at your CDN or server detects crawlers by user agent and serves them a snapshot of the page, rendered in a headless browser after all scripts and data have loaded. People get your site as usual.
web.dev's Rendering on the Web covers the trade-offs of the first three for visitors in depth.
How we got here
Early websites were static HTML files, and crawlers read them as is. Server languages like PHP then built each page from a database on request, and crawlers still got complete HTML.
From about 2010, frameworks like Angular and React moved rendering into the browser. Servers sent a near-empty shell and a bundle of JavaScript, and crawlers that didn't run that JavaScript got nothing. Google introduced dynamic rendering in 2018 as a way to serve those apps to its crawler without rebuilding them. Teams ran headless Chrome behind a user-agent rule, often with Google's open-source Rendertron.
Node.js made it possible to run the same JavaScript on the server, and frameworks like Next.js and Nuxt brought rendering back to the server for the first response. Most sites today mix the two: a server-rendered shell, with data, widgets and sections that load in the browser afterwards.
How crawlers handle each method
| Crawler | Client-side rendering | Server-side rendering | Dynamic rendering |
|---|---|---|---|
| Googlebot | Renders later, in a second pass | Reads the first response, renders later for the rest | Reads the fully loaded page right away |
| Bingbot | Renders, less reliably | Reads the first response | Reads the fully loaded page |
| GPTBot, ClaudeBot, PerplexityBot | Empty page | First response only | Fully loaded page, as HTML or Markdown |
| Link previews (LinkedIn, Slack, X) | Default title or nothing | First response only | Fully loaded page |
Googlebot fetches the HTML first and puts JavaScript pages in a render queue. Content that needs JavaScript is indexed after that second pass, which can take a while on large sites.
The crawlers behind ChatGPT, Claude and Perplexity read only the first response. Vercel and MERJ's crawl study found that GPTBot and ClaudeBot download JavaScript files without executing them. For those crawlers, whatever isn't in the first response doesn't exist.
Where server-side rendering stops
On most sites, part of the page loads after the first response:
- Client-fetched data. Prices, stock, ratings, reviews and related products often come from an API after hydration. Server-rendered ecommerce platforms are a common example: the product page is in the HTML, and the reviews and recommendations load in the browser.
- Deferred and lazy content. Below-the-fold sections, tabs, accordions, carousels and "load more" lists render later or only on interaction.
- Third-party widgets. Review platforms, store apps, chat tools and embeds inject their content with scripts.
- Personalization and A/B tools that swap content after load.
Googlebot catches some of this in its rendering pass, after a delay. AI crawlers catch none of it.
Even complete server-rendered HTML can be hard for AI crawlers to read. Content sits inside nested components, inline SVGs, repeated navigation and tracking markup, and a crawler working from that response can parse the layout and miss the content.
What dynamic rendering adds
Dynamic rendering takes its snapshot after the page has settled, so it includes everything SSR left for the browser: the reviews, the prices, the deferred sections and the widget content.
For AI crawlers, Encited also strips the snapshot down to the content, as cleaned HTML or Markdown, so complex layouts don't get in the way of what the page says.
It also handles a few things in one place: real 404s for routes your app answers with a 200, redirect rules served before the app loads, and one routing rule that keeps every crawler covered as new ones appear.
Dynamic rendering vs server-side rendering compared
| Server-side rendering | Dynamic rendering | |
|---|---|---|
| What it builds | The first HTML response | The page after everything has loaded |
| Who gets it | Everyone | Crawlers |
| Content loaded after hydration | Not included | Included |
| Third-party widget content | Not included | Included |
| Implementation cost | Rebuild or migrate the app to a server framework | A DNS change or a middleware rule |
| Running cost | Servers or functions that render every request | A monthly plan (Encited starts at $19 a month), or your own renderer |
| Server load | Your server renders every request, from people and bots | Crawlers get cached snapshots, rendered on a schedule |
| Core Web Vitals for visitors | Can improve load metrics like LCP | No change, since visitors get the same app |
| Crawler support | Whatever is in the first response | Googlebot, Bingbot, link previews and AI crawlers get the full page |
| Crawler response time | Depends on your server, often 15 to 600 ms | About 15 ms from Encited's edge cache |
| AI crawler format | Your full page markup | Full HTML, cleaned HTML or Markdown |
| Works with static hosting and AI builders | No | Yes |
| Google's view | Recommended for building pages | Supported, and treated as cloaking only if content differs |
| Ranking effect | None by itself | None by itself |
On the setup side, Encited's guides cover Cloudflare Workers, AWS CloudFront, Fastly, Next.js, Vercel and a no-code DNS setup.
When to choose dynamic rendering instead of moving to SSR
- The site is a client-side app and a rewrite would take months. Moving a React, Vue or Angular single-page app to Next.js, Nuxt or Angular SSR touches routing, data fetching and every component that reads
window. Dynamic rendering gets crawlers the full page while that rewrite is a decision for later. - The site is built with an AI website builder. Lovable, Bolt, Base44 and similar tools generate client-side apps you can't switch to SSR.
- Key content loads after the first response. If reviews, prices or whole sections arrive in the browser, moving to SSR won't put them in front of crawlers unless you also move that data fetching to the server.
- You need AI crawlers covered now. Dynamic rendering serves them the rendered page, and Markdown if you want it, from the day it's set up.
To make the call, put the SSR migration in engineering weeks next to the cost of a dynamic rendering plan, and test dynamic rendering on a few pages first. A crawler check before and after shows what changed.
When SSR is the better call
- You're starting a new build. With a free choice of framework, render the important content on the server from the start.
- Real visitors' speed is the problem. Dynamic rendering changes only what crawlers get. If Core Web Vitals are poor because the browser builds the whole page, SSR or static generation fixes that, and dynamic rendering doesn't.
- Everything already arrives in the first response. If view-source matches the loaded page, crawlers already get the whole page and there's nothing for dynamic rendering to add.
Using them together
The setups we see most:
Server-rendered site, client-loaded data. Keep SSR for the first response, which helps visitors and gives crawlers the basics fast. Add dynamic rendering so crawlers also get the reviews, prices and deferred sections, and so AI crawlers get a clean version of the page.
Client-side app. Dynamic rendering does the whole job for crawlers, with no changes to the app. This covers React, Vue and Angular single-page apps and sites built with AI website builders.
Mixed site. Marketing pages server-rendered, the app client-side. One routing rule covers both, so every page crawlers request comes back complete.
What Google says
Google's dynamic rendering documentation recommends server-side rendering, static rendering or hydration for building pages, and now says dynamic rendering was a workaround. It also states that dynamic rendering isn't cloaking when crawlers get similar content to what people see.
Google's John Mueller answered this exact question in an r/TechSEO thread on dynamic rendering versus server-side rendering. He said the differences come down to infrastructure setup and maintenance, and that there's no ranking bonus for moving to SSR. Search Engine Journal covered his comments.
Google's guidance covers Google Search. It doesn't address AI crawlers, which is where content loaded after the first response matters most.
Static vs dynamic rendering in Next.js
In the Next.js App Router, static rendering means a route is rendered at build time, or when it revalidates, and the cached result is reused. Dynamic rendering, or dynamic server-side rendering, means the route is rendered on the server for each request, usually because it reads cookies, headers or search parameters. Both are server rendering.
Dynamic rendering for SEO is a separate layer. It applies to Next.js sites the same way it applies to any server-rendered site: anything a Next.js page fetches in the browser after hydration is missing from the first response, and a dynamic rendering snapshot includes it.
How to check what crawlers miss
- View source. Open a page and press Ctrl+U, or Cmd+Option+U on a Mac. This is the first response.
- Compare with the loaded page. Look at the same page in the browser after it settles. Anything visible there and missing from view-source is content crawlers that don't render won't see.
- Check as a crawler. Run
curl -A "GPTBot" https://yoursite.com/pageand look for your reviews, prices and lower sections. - Compare crawlers. Our crawler simulator shows what Googlebot and AI crawlers each receive from a URL.
- Audit the whole site. A free SEO audit crawls your pages and flags the ones that come back empty or incomplete.
FAQ
What is the difference between dynamic rendering and server-side rendering? SSR renders each page on your server for every visitor, so the first response has content. Dynamic rendering serves only crawlers a snapshot of the page taken after it fully loads in a browser, while people get your site as usual.
Do I need dynamic rendering if my site uses SSR? If everything on the page is in the first HTML response, no. If reviews, prices, stock, recommendations or other sections load in the browser afterwards, crawlers that read only the first response miss them, and dynamic rendering captures them.
Is server-side rendering better than dynamic rendering for SEO? They do different jobs. SSR builds the first response and speeds up loads for visitors. Dynamic rendering makes sure crawlers get the complete page. Google has said there's no ranking bonus for one over the other.
Is dynamic rendering cloaking? Not when crawlers get similar content to what people see. Google says serving completely different content can be treated as cloaking. A snapshot of your own page, rendered in a real browser, carries the same text, links and structured data.
Should I use SSR or CSR? For public pages that need search and AI traffic, use SSR, or keep CSR and add dynamic rendering. CSR alone leaves crawlers that don't run JavaScript with an empty page. For logged-in screens that don't need indexing, CSR is fine.
Is SSG better than SSR? For pages that change only when you deploy, like docs and blog posts, SSG is faster and cheaper because the HTML is built once. For pages with data that changes often, or too many URLs to build ahead of time, SSR or incremental regeneration fits better. More in SSR vs SSG vs pre-rendering.
Is React CSR or SSR? React renders in the browser by default. It renders on the server when you use a framework like Next.js or React Router in framework mode. More in dynamic rendering for React, Vue and Angular.
Is Angular CSR or SSR?
Angular renders in the browser unless you add server rendering with @angular/ssr.
Is dynamic rendering still viable in 2026 compared to SSR and SSG? Yes. New builds usually start with SSR or static generation, and dynamic rendering stays the practical choice for client-side apps, headless storefronts and sites built with AI website builders that can't move to SSR. It also serves AI crawlers the content that loads after the first response, as HTML or Markdown.
Can I use dynamic rendering with Next.js, Nuxt or Shopify? Yes. It sits in front of the site and captures content those platforms load in the browser after the first response.
Does dynamic rendering slow down my site? No. Visitors' requests go to your site as before. Crawlers get cached snapshots.
Give crawlers the whole page
Encited serves Googlebot, Bingbot, link previews and AI crawlers the fully loaded version of your pages, on client-side and server-rendered sites, with no code changes. Try it on a few pages before you commit to a rewrite.
More on the SEO side in dynamic rendering and SEO, and on SSR, SSG and prerendering in SSR vs SSG vs pre-rendering.


