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