Understand that Googlebot renders JavaScript using a headless Chromium-based Web Rendering Service (WRS), but rendering is deferred and happens asynchronously after the initial crawl
Identify rendering failures by comparing the 'HTTP response' snapshot with the 'Rendered page' in the URL Inspection tool — missing content in the rendered view indicates WRS problems
Check for the 2 MB HTML size limit: Google's WRS stops processing HTML that exceeds approximately 2 MB; split large pages or move secondary content to lazy-loaded sections that are acceptable to leave unindexed
Avoid API calls that require authentication or CORS-blocked endpoints during render — WRS cannot pass credentials and will see empty content where auth-gated data would appear
If you must use dynamic rendering as a workaround, serve pre-rendered static HTML to Googlebot's user-agent while serving the JS app to regular users, but use it as a temporary measure not a permanent architecture
Prefer SSR or static site generation as the durable solution; dynamic rendering is documented by Google as a workaround, not a recommended long-term pattern
Known gotchas
Dynamic rendering that serves meaningfully different content to Googlebot vs users can be classified as cloaking, which violates Google's spam policies — only render the same content, not curated or inflated versions
AI crawlers (GPTBot, ClaudeBot, PerplexityBot) do not execute JavaScript at all — they read only the initial HTML response, so dynamic rendering does not help for AI discoverability
Google's WRS uses a version of Chromium that may lag the current stable release; features available in modern browsers may not be available during rendering, causing silent JS errors
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp