What is dynamic rendering and how does it work?
Dynamic rendering, also called dynamic bot rendering or bot routing, serves one page in two forms. People get your site as usual. Search engines, link previews and AI crawlers get the same page as finished HTML, rendered ahead of time in a real browser after everything has loaded, so they read all of your content without running a single script. It works on client-side apps and alongside server-side rendering.
In Next.js and Vulkan, dynamic rendering means something else: rendering a route on each request, or drawing without render pass objects. This page is about serving rendered pages to crawlers. How the Next.js meaning differs
Why crawlers miss content on JavaScript sites
A client-side app sends a near-empty HTML file first. Even a server-rendered page leaves data, deferred sections and widgets for the browser to load. Crawlers mostly read what arrives first.
- 01Executing scripts requires a browser, and most crawlers don't have one
- 02Googlebot runs scripts in a separate rendering step, after it crawls the HTML
- 03No crawler interacts with the page: no clicks to open or dismiss a modal, switch tabs or open FAQ accordions
Swipe to see the full figure
How dynamic rendering works
Every request to your site passes one check: who is asking. The answer decides which version of the page goes back.
- 01
Read the user agent
Every request names its client, such as Chrome, Googlebot or GPTBot.
- 02
Send people to your app
Browsers pass straight through to your host and get the interactive page.
- 03
Send crawlers the snapshot
Search engines, link previews and AI crawlers get the finished page as HTML or Markdown.
- 04
Render ahead of time
A headless browser loads each page on a schedule and saves the result, so no crawler waits for a render.
The routing rule in code
const CRAWLERS =
/googlebot|bingbot|gptbot|claudebot|perplexitybot|linkedinbot/i;
async function handle(request) {
const ua = request.headers.get("user-agent") ?? "";
if (CRAWLERS.test(ua)) {
// Rendered ahead of time
return getSnapshot(request.url);
}
// People get your app as usual
return fetch(request);
}
The rule is the simple part. The work is in the snapshots: rendering every page in a real browser, keeping them fresh, and serving them fast enough that crawlers never wait.
Dynamic rendering vs server-side rendering, static generation and client-side rendering
Each approach answers the same question: who builds the HTML, and when. Server-side rendering and static generation build the first response. Dynamic rendering captures the page after everything has loaded. On a client-side app it does the whole job. On a server-rendered site it adds what loads after the first response: client-fetched data, deferred sections and widgets.
| Approach | Who builds the HTML | What crawlers get | Changes to your app |
|---|---|---|---|
| Client-side rendering | The visitor's browser, after scripts run | A near-empty HTML shell | None |
| Server-side rendering | Your server, on every request | The first response, without content the browser loads later | Move the app to a server framework |
| Static generation | Your build step, ahead of time | Full HTML | A static build; content changes need a rebuild |
| Dynamic rendering | A headless browser, ahead of time, for crawlers only | The fully loaded page as HTML, or Markdown for AI crawlers | None; one routing rule in front of the site |
Is dynamic rendering cloaking?
No. Cloaking means showing search engines different content from what people see, in order to rank for it. Google treats dynamic rendering as legitimate when the snapshot carries the same content as the page people get.
Google's documentation now says dynamic rendering was a workaround, and points new builds to server-side rendering, static rendering or hydration. That guidance is about how the first HTML response gets built. It doesn't cover content that loads after that response, or AI crawlers, most of which don't run JavaScript at all. For them, a rendered snapshot is the only complete version of the page.
How Encited dynamically renders your pages
Encited manages a fleet of thousands of browsers to do the rendering for crawlers beforehand, and serves the most optimal version of your pages to both search and AI crawlers.
- 01Load your pages in browsers and wait until everything is loaded
- 02Save the source HTML and post-process it into lean HTML and Markdown
- 03Store them across 300+ locations and serve them from the one closest to crawlers in milliseconds
Swipe to see the full figure
Request-response cycle for crawlers and humans
The ideal page for humans, search crawlers and AI crawlers is not the same. With Encited, you can treat each of them as a first-class audience.
- 01Browser requests are passed through to your hosting provider and served interactive pages
- 02Search and link preview crawlers get the lean HTML
- 03AI crawlers get HTML or Markdown depending on preference
Swipe to see the full figure
One page, start to finish
Below is the full process, from the Encited pre-rendering fleet visiting your pages to post-processing and caching them.
It starts with your refresh rules
Configure re-caching rules and schedules by URL group, each with its own browser profile.
- 01Daily, weekly, monthly or quarterly refresh per path
- 02Assign each URL group its own locale, time zone and device for fully localized snapshots
- 03Built-in manual re-caching for off-schedule refreshes, no more messy scripts
Swipe to see the full figure
Health check before render
Each page is probed before it renders, and broken pages raise an alert.
- 01Page alerts for server errors, redirects and blocked pages
- 02Broken pages are never cached or served
- 03No render spent on a page that fails its check
Swipe to see the full figure
Then, render fleet visits
Pages are rendered on your configured schedule and attached browser profiles.
- 01Desktop or mobile rendering per path
- 02Language and time zone per path
- 03Localized pages render in their own language
Swipe to see the full figure
Load and wait until page is settled
Before taking the snapshot, Encited makes sure your page is in its fullest form, with no data left out.
- 01Waits for the network, event loop and content to settle
- 02Ignores beacons and connections that never close
- 03Honors an explicit “ready” signal from your page
Swipe to see the full figure
No accidental DDoSes allowed
Render speed follows your server's response time and error rate.
- 01Speeds up while your server is fast
- 02Backs off on slow responses or errors
- 03No load spikes for your real visitors
Swipe to see the full figure
Plain rendered HTML is hard to read, though
On average, modern web pages are 70%+ non-HTML, non-content. Scripts, styles, inline SVGs and decorative markup make the real content hard to read and extract.
- 01Strip scripts and style blocks
- 02Strip decorative markup
- 03Strip inline SVGs
- 04Pure content for search engines and AI agents
Swipe to see the full figure
Dynamic rendering FAQ
Dynamic rendering guides
- Dynamic Rendering for SEO: How It Works, Benefits and Setup
- Dynamic Rendering vs SSR: Key Differences and SEO Trade-offs
- Dynamic Rendering in React, Vue and Angular for SEO: Example Implementations and Patterns
- How to Implement Dynamic Rendering with Puppeteer and Node.js
- Dynamic bot rendering and bot routing: setup guide
- SSR vs SSG vs Pre-rendering for SEO: What Crawlers Actually See
- 5 Best Rendertron Alternatives for Dynamic Rendering
- Best Prerender.io Alternatives in 2026
- See your page as Googlebot and AI crawlers see it


