Is Dynamic Rendering Still Recommended by Google?
Dynamic rendering β detecting bots by user agent and serving them a prerendered snapshot while users get the live single-page app β was once Googleβs official suggestion for JavaScript-heavy sites. That guidance changed: Google now calls it a workaround, not a long-term recommendation, because Googlebot reliably renders JavaScript and because the user-agent split invites content drift that edges toward cloaking. This page explains what changed and how to decide whether to keep, replace, or migrate away from it, within the dynamic rendering and bot prerendering cluster.
What changed, and what to do about it
-
Understand the reclassification. The original premise β bots cannot run JavaScript β is no longer true for Google. Dynamic rendering still functions, but it is now framed as a bridge, not a destination.
β Old mental model: "Bots can't run JS, so serve them a snapshot." β Current model: "Googlebot runs JS; serve identical HTML to users and bots."
-
Audit for cloaking drift. The biggest live risk is the bot snapshot and the user app diverging over time. Compare them on representative URLs and fix any content the snapshot shows but users do not.
-
If you keep prerendering, serve it to everyone. Universal prerendering removes the user-agent branch, so there is no divergence and no cloaking exposure β a safe interim state.
// β No user-agent branch: same prerendered HTML for users and bots app.get('*', (req, res) => res.send(snapshotFor(req.path))); -
Plan the migration to SSR/SSG/ISR. For routes that matter most, schedule a move to a rendering mode that produces HTML natively, using the rendering-strategy decision guide. Migrate highest-traffic routes first.
Validation
- Parity audit: GSC URL Inspection rendered HTML matches the live user view on sampled URLs.
- Search Console Manual Actions report shows no cloaking flags.
- Coverage report: prerendered URLs are indexed with correct titles and descriptions.
- Post-migration: routes moved to SSR keep their rankings and index without the snapshot layer.
Cloaking is not a binary switch; it is a spectrum of how far the bot response can drift from the user response. The safest strategies serve one document to everyone, while bot-only dynamic rendering starts safe but slides toward risk as the two paths diverge.
Decision reference
Keep dynamic rendering (bot-only) β only as a short-lived bridge; audit parity often
Switch to universal prerendering β safe interim; no cloaking risk, infra cost remains
Migrate to SSR / SSG / ISR β preferred end state for rankable routes
Leave as CSR β only for non-indexable, authenticated routes
The same reference read as a decision tree makes the branch order explicit: try to render HTML natively first, fall back to universal prerender, and reserve the bot-only split for routes you cannot yet touch.
Frequently Asked Questions
Did Google deprecate dynamic rendering? Google did not remove support, but it reclassified dynamic rendering as a workaround rather than a recommended long-term solution. Googlebot renders JavaScript, so the original justification β that bots could not execute JS β no longer holds for Google.
What should I use instead of dynamic rendering? Server-side rendering, static generation, or incremental regeneration are preferred because they serve identical HTML to users and bots. Universal prerendering β serving the same snapshot to everyone β is an acceptable middle step that avoids the cloaking risk of user-agent branching.
Related
- Set up prerendering for a React SPA β the universal-prerendering implementation.
- CSR, SSG, SSR & ISR Rendering Strategies β the migration targets.
- Understanding Googlebotβs Rendering Pipeline β why Google can render JS in the first place.
β Back to Dynamic Rendering & Bot Prerendering