---
title: "What Is Dynamic Rendering and How Does It Work? | Encited"
url: https://encited.com/dynamic-rendering
description: "Dynamic rendering serves your JavaScript app to people and a rendered HTML snapshot to search engines and AI crawlers. See how it works and how Encited does it."
lang: en
---

Dynamic rendering

# 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 (https://encited.com/blog/dynamic-rendering-vs-server-side-rendering)

Contact sales: https://encited.com/contact-sales?product=dynamic-rendering

The problem

## 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.

1. 01 Executing scripts requires a browser, and most crawlers don't have one
2. 02 Googlebot runs scripts in a separate rendering step, after it crawls the HTML
3. 03 No 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

One page, two readers The browser builds it. Crawlers read what arrives first.

How it works

## 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.

1. 01
   ### Read the user agent
   Every request names its client, such as Chrome, Googlebot or GPTBot.
2. 02
   ### Send people to your app
   Browsers pass straight through to your host and get the interactive page.
3. 03
   ### Send crawlers the snapshot
   Search engines, link previews and AI crawlers get the finished page as HTML or Markdown.
4. 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.

Compared

## 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 |

Google's view

## 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.

Encited

## 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.

1. 01 Load your pages in browsers and wait until everything is loaded
2. 02 Save the source HTML and post-process it into lean HTML and Markdown
3. 03 Store them across 300+ locations and serve them from the one closest to crawlers in milliseconds

Swipe to see the full figure

From empty shell to finished snapshot Done ahead of time, on your schedule

Serving

## 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.

1. 01 Browser requests are passed through to your hosting provider and served interactive pages
2. 02 Search and link preview crawlers get the lean HTML
3. 03 AI crawlers get HTML or Markdown depending on preference

Swipe to see the full figure

One URL, four readers Plays each request in turn

The pipeline

## 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.

The pipeline One page, start to finish

01

### It starts with your refresh rules

Configure re-caching rules and schedules by URL group, each with its own browser profile.

1. 01 Daily, weekly, monthly or quarterly refresh per path
2. 02 Assign each URL group its own locale, time zone and device for fully localized snapshots
3. 03 Built-in manual re-caching for off-schedule refreshes, no more messy scripts

Swipe to see the full figure

One week of refreshes Due pages join the queue

02

### Health check before render

Each page is probed before it renders, and broken pages raise an alert.

1. 01 Page alerts for server errors, redirects and blocked pages
2. 02 Broken pages are never cached or served
3. 03 No render spent on a page that fails its check

Swipe to see the full figure

A healthy page and a failing one Alternates

03

### Then, render fleet visits

Pages are rendered on your configured schedule and attached browser profiles.

1. 01 Desktop or mobile rendering per path
2. 02 Language and time zone per path
3. 03 Localized pages render in their own language

Swipe to see the full figure

Three profiles, one site Active profile in blue

04

### 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.

1. 01 Waits for the network, event loop and content to settle
2. 02 Ignores beacons and connections that never close
3. 03 Honors an explicit “ready” signal from your page

Swipe to see the full figure

From navigation to snapshot Quiet periods in green

05

### No accidental DDoSes allowed

Render speed follows your server's response time and error rate.

1. 01 Speeds up while your server is fast
2. 02 Backs off on slow responses or errors
3. 03 No load spikes for your real visitors

Swipe to see the full figure

Concurrency follows the origin Values for illustration

06

### 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.

1. 01 Strip scripts and style blocks
2. 02 Strip decorative markup
3. 03 Strip inline SVGs
4. 04 Pure content for search engines and AI agents

Swipe to see the full figure

Tokens per page One product page

Frequently asked questions

## Dynamic rendering FAQ

### Is dynamic bot rendering the same as dynamic rendering?

Yes. Dynamic bot rendering and bot routing are other names for the same setup: a rule detects crawlers by user agent and serves them a rendered HTML snapshot, while people get your normal app.

### Is dynamic rendering cloaking?

No, as long as crawlers and people get the same content. Cloaking means showing search engines something different from what visitors see in order to rank for it. A dynamic rendering snapshot is your own page, rendered in a real browser, so its text, links and structured data match what people see.

### Does Google still recommend dynamic rendering?

Google's documentation now says dynamic rendering was a workaround, and points new builds to server-side rendering, static rendering or hydration. It still treats a correct setup as legitimate, not as cloaking. Its guidance covers how the first HTML response is built. Dynamic rendering also covers content that loads after that response, and AI crawlers that don't run JavaScript.

### What is the difference between dynamic rendering and pre-rendering?

Pre-rendering is the step that loads a page in a browser and saves the finished HTML. Dynamic rendering is the serving rule: crawlers get that saved HTML, people get your live app. Most dynamic rendering setups, Encited's included, use both.

### Do AI crawlers run JavaScript?

Most don't. Crawlers such as GPTBot, ClaudeBot and PerplexityBot read the HTML your server sends and don't run scripts, so content that only appears after JavaScript runs is missing for them. A rendered snapshot puts that content in the first response.

### How do I check what crawlers see on my pages?

Run a URL through the free crawler simulator at encited.com/free-tools/crawler-simulator. It fetches the page as Googlebot or an AI crawler and shows the HTML they get back, so you can compare it with what your browser shows.

### Do I need to change my code to use Encited?

No. Encited sits in front of your site after one DNS change, or behind your own middleware through the API. Your app, your builder and your tracking stay as they are.

### How often are snapshots refreshed?

On the schedule you set for each URL group: daily, weekly, monthly or quarterly. You can also re-cache any page by hand when you ship a change.

## Dynamic rendering guides

- Dynamic Rendering for SEO: How It Works, Benefits and Setup: https://encited.com/blog/dynamic-rendering-seo
- Dynamic Rendering vs SSR: Key Differences and SEO Trade-offs: https://encited.com/blog/dynamic-rendering-vs-server-side-rendering
- Dynamic Rendering in React, Vue and Angular for SEO: Example Implementations and Patterns: https://encited.com/blog/dynamic-rendering-react-vue-angular
- How to Implement Dynamic Rendering with Puppeteer and Node.js: https://encited.com/blog/puppeteer-vs-managed-dynamic-rendering
- Dynamic bot rendering and bot routing: setup guide: https://encited.com/docs/domain-setup/dynamic-bot-rendering-bot-routing
- SSR vs SSG vs Pre-rendering for SEO: What Crawlers Actually See: https://encited.com/blog/ssr-vs-pre-rendering
- 5 Best Rendertron Alternatives for Dynamic Rendering: https://encited.com/blog/best-rendertron-alternatives
- Best Prerender.io Alternatives in 2026: https://encited.com/blog/prerender-io-alternatives
- See your page as Googlebot and AI crawlers see it: https://encited.com/free-tools/crawler-simulator

## Get recommended in AI answers

Optimize for Google, AI and humans without compromises.

Talk to sales: https://encited.com/contact-sales

Image: Avatar (https://replymaven.com/api/uploads/Su6Q0nK63iZW0ZFJBRNWpmRuppVDLuab/98df5262-f992-45fa-a750-00a6c919baf9.png)

How can we help?

Get instant answers to your questions or leave a message for an engineer will reach out

Ask AI about Encited

See our docs (https://lovablehtml.com/docs)

Contact support

Leave a message

We'll get back to you soon

Ask AI about Encited

Product questions, troubleshooting and

Thinking

Image: Preview

Drop an image to attach

Powered by ReplyMaven (https://replymaven.com/)

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Is dynamic bot rendering the same as dynamic rendering?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Yes. Dynamic bot rendering and bot routing are other names for the same setup: a rule detects crawlers by user agent and serves them a rendered HTML snapshot, while people get your normal app."
        }
      },
      {
        "@type": "Question",
        "name": "Is dynamic rendering cloaking?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "No, as long as crawlers and people get the same content. Cloaking means showing search engines something different from what visitors see in order to rank for it. A dynamic rendering snapshot is your own page, rendered in a real browser, so its text, links and structured data match what people see."
        }
      },
      {
        "@type": "Question",
        "name": "Does Google still recommend dynamic rendering?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Google's documentation now says dynamic rendering was a workaround, and points new builds to server-side rendering, static rendering or hydration. It still treats a correct setup as legitimate, not as cloaking. Its guidance covers how the first HTML response is built. Dynamic rendering also covers content that loads after that response, and AI crawlers that don't run JavaScript."
        }
      },
      {
        "@type": "Question",
        "name": "What is the difference between dynamic rendering and pre-rendering?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Pre-rendering is the step that loads a page in a browser and saves the finished HTML. Dynamic rendering is the serving rule: crawlers get that saved HTML, people get your live app. Most dynamic rendering setups, Encited's included, use both."
        }
      },
      {
        "@type": "Question",
        "name": "Do AI crawlers run JavaScript?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Most don't. Crawlers such as GPTBot, ClaudeBot and PerplexityBot read the HTML your server sends and don't run scripts, so content that only appears after JavaScript runs is missing for them. A rendered snapshot puts that content in the first response."
        }
      },
      {
        "@type": "Question",
        "name": "How do I check what crawlers see on my pages?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Run a URL through the free crawler simulator at encited.com/free-tools/crawler-simulator. It fetches the page as Googlebot or an AI crawler and shows the HTML they get back, so you can compare it with what your browser shows."
        }
      },
      {
        "@type": "Question",
        "name": "Do I need to change my code to use Encited?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "No. Encited sits in front of your site after one DNS change, or behind your own middleware through the API. Your app, your builder and your tracking stay as they are."
        }
      },
      {
        "@type": "Question",
        "name": "How often are snapshots refreshed?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "On the schedule you set for each URL group: daily, weekly, monthly or quarterly. You can also re-cache any page by hand when you ship a change."
        }
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Home",
        "item": " https://encited.com/"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Dynamic Rendering",
        "item": " https://encited.com/dynamic-rendering"
      }
    ]
  }
]
```