Setting Up Dynamic Rendering for JavaScript Sites (Rendertron/Puppeteer)

If your site's content is assembled on the browser side, search engines see an empty page — and rankings drop. We set up Dynamic Rendering turnkey: the search bot receives a ready-made version of the page, while the visitor gets the same interface as before. Indexing speeds up significantly, and search traffic stops depending on how fast the bot can execute scripts.

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Frequently Asked Questions

Why Dynamic Rendering breaks indexing of JavaScript sites

The classic failure looks like this: in the server logs, the robot dutifully fetches the HTML shell of the page, but in the search results it remains empty — the title, texts, product cards, and links are loaded in the browser via client-side rendering.

The robot receives markup without content, puts the page in the queue for re-crawling, and leaves with nothing.

The owner sees a drop in rankings for commercial queries, a decline in traffic, and sections "dropped" from the index, even though visually the site works flawlessly.

The reason is not that robots "can't" execute JavaScript, but rather the crawl budget. Rendering a page in a headless browser costs an order of magnitude more than reading ready-made HTML, so crawl depth and re-crawl frequency for such pages drop.

The heavier the client bundle and the later the content appears in the DOM, the higher the chance that the robot will capture an intermediate state — a skeleton, a spinner, or an empty container.

A separate pain point is dynamic meta tags and canonical: if they are generated on the client, the robot may see default values and merge different pages into one.

Dynamic Rendering was conceived as a workaround: the server identifies the robot by User-Agent and serves it a pre-rendered static version, while serving the regular app to humans. The scheme works, but it comes at a cost.

The prerender becomes stale relative to the live app, the cache needs to be invalidated on every deploy, and the discrepancy between the version served to the robot and the human version is already content substitution, for which the search engine lowers trust in the site as a whole.

Plus, this layer by itself does not solve the root problem: the content is still born on the client.

That is precisely why Dynamic Rendering should correctly be viewed not as a final solution, but as a temporary patch for the migration period.

A sustainable result comes from moving critical content and metadata into the server response — then the robot receives ready-made markup from the first request, and client-side rendering remains only for interactive blocks. Let's break down how this can be closed without losing the speed and logic of the application.

What Implementation Delivers: Measurable Business Effects

Indexing Speed and Visibility Growth

The search robot receives ready-made markup immediately, without waiting for scripts to execute — pages enter the index in hours, not weeks.

This directly expands visibility: content that previously remained invisible to crawling begins to participate in search results, and the share of indexed URLs grows predictably, not "someday."

Reduced Server Load

Rendering is moved to a separate layer with caching of ready-made pages, so search crawls no longer trigger a full rendering cycle on the main application.

The server serves static content from cache, delivery speeds up, and peak crawls stop competing with real users for resources.

Elimination of a Class of Failures

An entire class of failures related to invisible content disappears: empty pages in the index, duplicates, lost metadata, incorrect canonical URLs. The robot sees the same version as a human — discrepancies between served and rendered markup cease to be a source of errors.

Predictability of the Effect

Each of these changes is measurable: time to index, share of indexed URLs, response time, number of crawl errors. We record these metrics before and after implementation so that the effect is visible in numbers, not in words.

Comparing approaches: Dynamic Rendering and alternatives

The choice between Dynamic Rendering and alternatives is not a question of "what is more modern," but a question of how much the content depends on JavaScript execution and how often it changes.

Dynamic Rendering serves the search robot ready-made HTML rendered on the fly, while regular visitors get the same JavaScript interface. This is a compromise: it does not require rewriting the frontend, but it adds a layer that needs to be maintained and cached.

Server-side rendering (SSR) moves markup generation to the server — the page arrives already assembled, without waiting for scripts to execute.

This is the most predictable option for search, but it requires restructuring the architecture and careful handling of state on the server.

Prerendering is simpler: pages are assembled in advance and served as static files — fast and cheap, but it handles frequently changing content and personalization poorly.

Hybrid schemes combine approaches: static sections are served prerendered, dynamic ones — via server-side rendering or Dynamic Rendering.

Option When it fits Limitations
Dynamic Rendering JS interface, changing the frontend is expensive, content changes moderately A rendering layer, cache, and monitoring are needed; risk of version mismatch for the robot and the user
Server-side rendering A stable SEO result is important, content is personalized Architecture restructuring, server load, more difficult with state
Prerendering Content is static or changes rarely, there are few pages Scales poorly to thousands of pages and frequent updates
Hybrid scheme Heterogeneous content: part static, part dynamic Harder to maintain, clear routing by page types is needed

In practice, the choice is dictated not by fashion, but by the content profile and the cost of rework. If the frontend already runs on JS and there are no resources to rewrite it — Dynamic Rendering solves the task faster.

If search traffic is critical and the architecture can be changed — server-side rendering gives a more sustainable result in the long run. We analyze your case and propose a scheme for a specific page profile, not a universal template.

Stages of turnkey Dynamic Rendering implementation

Implementation begins with an audit: we map out the routes, look at which pages deliver content only after scripts are executed, and which ones already come ready-made.

In parallel, we check how search engine robots see the current markup — where headings, metadata, and links are lost. The output is a list of templates for which rendering is mandatory, and those where it will only add load.

Next, we design the scheme: we determine the criterion by which to separate users and robots, how to serve the prerendered version, and what to do with pages that are already ready.

Here we also fix the caching rules and the behavior when the renderer is unavailable, so that the site does not serve empty responses.

  1. Audit of routes and current output — a map of pages, a list of templates for rendering, points of content loss.
  2. Designing the separation scheme — rules for identifying a robot, logic for serving versions, scope of application.
  3. Renderer setup — we deploy the prerendering service, connect the queue, set timeouts and limits.
  4. Caching and fault tolerance — rules for storing ready-made versions, behavior on failure, fallback serving scenario.
  5. Output verification — we check that the robot receives full content and the user receives the regular page; we test edge-case routes.
  6. Monitoring and metrics — we track the share of successful renders, response time, and the growth of indexed pages.
  7. Handover and training — documentation on the scheme, configurations, and a change management policy for your team.

Verification is not formal: we compare what the robot sees and what the user sees at the same address, and we run through dynamic sections and pages with lazy loading. If the renderer serves incomplete markup, it is caught at this stage, not after reindexing.

At handover, we provide a working scheme, configurations, instructions for adding new templates, and a clear change management policy. Your team can maintain and extend the solution without us — or we stay on for support.

What the client receives: configurations and regulations

The deliverable is not a "working website" but a package your team can use to operate and evolve the solution without us.

Everything we configure is documented in configurations and regulations: deployment is reproducible on a clean environment, behavior is predictable, and changes don't break output.

  • Configuration files for rendering: request routing rules, timeouts, concurrent task limits, behavior when a source is unavailable — with comments explaining what changes and why.
  • Infrastructure diagram: how the web server, renderer, and cache are connected, where the failure points are, how it scales under peak load.
  • Access policies: separation of rights for configurations, secrets, and service endpoints, key rotation, who can change what without approval.
  • Caching regulations: page time-to-live, invalidation on content updates, handling of dynamic blocks — so search engines receive the current version.
  • Documentation: description of rendering logic, list of dependencies, instructions for deploying from scratch, and the procedure for rolling back to a previous version.
  • Operations instructions: typical failures and what to do, how to read logs, which metrics to monitor daily.
  • Acceptance checklist: a set of checks confirming that rendering returns correct markup for the required page types.

We deliver the package in your format — repository, wiki, or shared drive. We also conduct a separate knowledge transfer: engineers walk through each artifact and answer questions so that support doesn't depend on a single person.

Case study: how Dynamic Rendering accelerated indexing 3x

The client is an online store built on React with a catalog of several tens of thousands of product cards.

Content was rendered on the client side, and when crawling, the search bot saw an empty page skeleton: only a small share of the catalog made it into the search results, new items waited weeks for indexing, and some already indexed pages dropped out after the next release.

The marketing department saw a drop in organic traffic, but the cause lay in the architecture, not in the content.

We did not install Rendertron "head-on" — first we took metrics from bot logs and crawling. It turned out that the bot was spending its crawl budget on duplicates and parametric URLs, and rarely reached the actual product cards.

We assembled a combination: Dynamic Rendering on Puppeteer with a cache of rendered HTML, User-Agent-based serving rules, cleanup of parameters via canonical links and a sitemap, and separate cache warming for new and updated product cards.

What changed after implementation

Metric Before After
Share of indexed product cards ~40% ~95%
Average time to appear in the index 3–4 weeks 5–7 days
Positions for commercial queries below top-30 top-10 for the core
Share of pages with correctly rendered HTML ~55% ~99%

The key effect came not from rendering itself, but from the combination with caching and warming: the bot stopped waiting for a response from the server and received ready-made markup instantly.

Two months after launch, the share of indexed pages more than doubled, and new arrivals began appearing in search results within a week instead of a month.

We also set up monitoring separately: alerts for growth in the share of rendering errors, cache lagging behind releases, and a drop in indexing coverage. This made it possible to catch regressions after deployment within an hour, rather than after the fact of traffic decline.

If you have a JavaScript site with a similar picture — describe the task, and we will come back with an estimate and a plan.

How Does Dynamic Rendering Differ from Server-Side Rendering?

Server-side rendering delivers ready-made markup to everyone at once: the application assembles the page on the server, and the search crawler and the visitor receive the same response.

Dynamic Rendering works differently — the server distinguishes who has arrived, and for the crawler it serves a pre-rendered version, while for the browser it serves the regular client-side application. The difference is not in the result, but in where and for whom the rendering is performed.

This is where the different selection scenarios come from. SSR wins where first-paint speed matters for everyone: catalogs, feeds, pages with personalization, content sites with high traffic.

Dynamic Rendering is chosen when the application already works as a client-side one, and rewriting it for full-fledged server-side rendering is expensive and risky — online stores on heavy frontend frameworks, personal accounts, pages with deferred data loading.

Combining is a working option, not a compromise. Some routes can be served via server-side rendering, while complex dynamic sections can be covered by pre-rendering for crawlers.

The key condition is that the content in both versions must match: if the crawler sees one thing and the visitor sees another, that is already cloaking, not optimization, and it leads to penalties.

The choice ultimately comes down to three questions: how critical delivery speed is for the visitor, how much it costs to move the application to server-side rendering, and how often the content changes. If pages are updated rarely, pre-rendering is cheaper and simpler.

If the content is live and personalized, server-side rendering is more reliable in the long run. We analyze a specific project and say directly which path will deliver results without rewriting working code.

Technical concerns: questions and answers

Before the start, clients usually ask the same questions: will rendering break the existing setup, will the load on servers increase, who and how gets access to the pages.

Below is an analysis of typical technical concerns regarding security, load, and compatibility with the current infrastructure.

Are we serving content to search engine robots differently than to people?

No. Rendering serves the same markup that the user sees after scripts are executed — this is a requirement of search engines, not our own discretion.

The robot receives ready-made HTML, the visitor receives a regular page; a discrepancy in content between them is considered a violation and is monitored at the acceptance stage.

Will the load on servers increase?

Rendering is triggered only for search engine robot requests, not for all traffic, so the share of processed requests remains small. The result is cached, and repeated crawls serve a ready-made copy without re-launching the browser. We offload the load onto a separate node so that it does not affect the main application.

Is this compatible with our infrastructure and current stack?

Rendering is installed alongside the application and does not require rewriting the frontend or changing hosting. It works on top of existing routes and serves the result through a reverse proxy.

If the application is behind authorization or on a closed environment, we agree on the access scheme separately at the design stage.

How does this affect security?

Rendering is isolated from the main system: it has no access to the database or internal services, only to public pages. It runs in a restricted environment without unnecessary privileges, and incoming requests are filtered by a list of search agents. There is no data leakage or authorization bypass through rendering.

What happens if rendering is unavailable?

The application continues to work as usual — rendering only supplements page delivery, it does not replace it. If the node fails, requests go directly to the application, and the search engine robot receives the previous response. A rendering failure does not bring down the site or block users.

Can the changes be rolled back?

Yes. Rendering is enabled at the routing level, so a rollback is a return to the previous rules without editing the application code. Before launch, we record the current configuration so that it can be returned to its original state in a single operation.

Let's discuss your task and propose an implementation plan

To propose an implementation plan rather than generalities, we need to understand your current setup: what the frontend is built on, how content is served, which search engine bots and partner crawlers visit you.

Dynamic rendering is not a "set it and forget it" thing: it's important to correctly determine which bots to send to prerender and which to leave on client-side rendering, otherwise you'll get duplicates and discrepancies in search results.

Describe the task in free form — we'll come back with a timeline estimate and a work plan. Let's discuss at the start:

  • which pages and sections are served via JavaScript and which of them are critical for indexing;
  • how the bot is currently identified: by user-agent, by IP, or via a reverse proxy, and where this breaks;
  • whether a cache of prerendered pages is needed and by what rule to invalidate it when content is updated;
  • how the renderer will fit into the current stack — a separate service, a container next to the application, or a layer on the load balancer;
  • what to do with dynamic blocks (personalization, cart, authorization) that cannot be cached;
  • how to set up monitoring: share of pages served by the renderer, response time, rendering errors;
  • a rollback plan in case response speed for live users drops after enabling.

On our side, we'll fix the readiness criteria: the bot receives fully rendered HTML, the user gets the same speed as before, and the content in the index matches what people see. Next — approval of stages, access to environments, and launch.

Tell us about your case — what stack, how many pages, what you've already tried. That's enough to come back with a concrete next step.

Our competencies:

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1393
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1368
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1139
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1152
  • Website development for SBH Partners
    Website development for SBH Partners
    1231
  • Website development for Red Pear
    Website development for Red Pear
    641