Blog
SEO2026-04-0714 min

How to Audit and Fix JavaScript Rendering Issues That Block Google Indexation

Google processes JavaScript in a delayed second wave that can take hours or days. This guide covers the full diagnostic process using URL Inspection, Screaming Frog JS rendering crawls, and.

Your website looks perfect in a browser. Your content is there, your images load, your navigation works. But Google might be seeing something completely different. When your content depends on JavaScript to render, Google must execute that JavaScript before it can see and index your page. This rendering step is delayed, resource-limited, and sometimes fails entirely. If Google cannot render your JavaScript, your content is invisible to search, and no amount of keyword optimization or link building will fix a page that Google literally cannot see.

JavaScript rendering issues are invisible in traditional SEO audits because those audits look at your pages the same way a browser does: with JavaScript enabled and fully executed. To find rendering problems, you need to compare what Google sees with what users see. The gap between those two views is where your indexation problems live.

TL;DR
  • Google renders JavaScript to see your content, but rendering is delayed (hours to days), resource-limited, and sometimes fails.
  • Compare the rendered HTML in Google Search Console URL Inspection with the live page to find discrepancies.
  • Common rendering issues: lazy-loaded content, client-side routing, third-party script blocking, and infinite scroll without pagination.
  • The fix is usually not abandoning JavaScript but ensuring critical content is available in the initial HTML before JavaScript executes.

How Google Processes JavaScript

Google's crawling and indexing pipeline processes pages in two waves. The first wave fetches the raw HTML returned by the server. If your content is in the HTML at this point, it is immediately available for indexing. The second wave queues the page for JavaScript rendering using a headless Chromium browser. This rendering step executes your JavaScript, waits for the DOM to settle, and then indexes the rendered content.

The problem is the gap between waves. The first wave happens almost immediately when Google discovers or re-crawls a URL. The second wave happens later, sometimes hours later, sometimes days later, depending on Google's rendering queue and your site's crawl budget. During this gap, any content that only appears after JavaScript execution is not indexed. For time-sensitive content (news, product updates, sale pages), this delay can mean missing the ranking window entirely.

Google's rendering resources are also limited. The renderer allocates a fixed amount of time and memory per page. If your JavaScript takes too long to execute, uses too much memory, or depends on external resources that time out, the rendering fails. The page is indexed with whatever content was available at the point of failure, which may be a blank page, a loading spinner, or a partially rendered view.

5-72 hrs
typical rendering delay
between first crawl and JS rendering
13%
of SPA pages
have content Google cannot see
5 sec
render timeout
Google allocates per page

Google Webmaster Conference data and Screaming Frog JS rendering analysis, 2025

The Diagnostic Process

JavaScript Rendering Audit

1
URL Inspection in Search Console

Test individual pages to see Google's rendered HTML. Compare against the live page for content discrepancies.

2
Screaming Frog JS Rendering Crawl

Crawl your entire site with JavaScript rendering enabled. Compare JS-rendered content against HTML-only content per page.

3
Chrome DevTools with JS Disabled

View your pages with JavaScript disabled to see what Google's first wave crawl encounters.

4
Mobile-Friendly Test

Google's Mobile-Friendly Test renders the page and shows a screenshot. Check if content appears in the rendered view.

5
Indexed Page Cache Comparison

Compare Google's cached version of your page with the live version. Missing content indicates rendering failures.

Diagnostic Tool 1: URL Inspection

Google Search Console's URL Inspection tool is the most reliable way to see exactly what Google sees when it renders your page. Enter a URL, click "Test Live URL," and wait for the rendering to complete. The tool shows you the rendered HTML, a screenshot of the rendered page, and any resource loading errors that occurred during rendering.

Compare the rendered HTML with your live page source. Look for specific content that appears on the live page but is missing from the rendered HTML. Key elements to check: main content headings and body text, navigation links (does Google see all your navigation items?), product descriptions and pricing, reviews and testimonials, and dynamic content loaded via API calls.

Also check the screenshot. Sometimes the HTML looks correct but the visual layout is broken, indicating CSS or layout issues during rendering. A page that renders with overlapping text, missing images, or broken layouts may not trigger explicit indexing errors but can affect Google's quality assessment of the page.

Test Multiple Page Types
Do not test just your homepage. Different page types often use different JavaScript frameworks, components, and data loading patterns. Test at least one page from each template type: homepage, product page, blog post, landing page, and category/listing page. Rendering issues are often template-specific, affecting all pages that share the same component architecture.

Diagnostic Tool 2: Screaming Frog JavaScript Crawl

Screaming Frog's crawler can render JavaScript using an embedded Chromium browser, similar to how Google renders pages. Run two crawls: one with JavaScript rendering disabled (HTML-only) and one with JavaScript rendering enabled. Compare the results to identify pages where significant content only appears after JavaScript execution.

Focus on the following metrics in the comparison: word count difference (pages where the JS-rendered version has significantly more text than the HTML-only version are at risk), title and meta description differences (if these are set via JavaScript, they may not be indexed correctly), internal link count differences (links generated by JavaScript may not be discovered during HTML-only crawling), and canonical tag presence (canonical tags set by JavaScript may be ignored during the first crawl wave).

Pages where the HTML-only crawl shows minimal content but the JS-rendered crawl shows full content are your highest-priority fixes. These pages depend entirely on JavaScript rendering, and any rendering failure makes them invisible to Google.

Common Rendering Issues and Fixes

Issue 1: Lazy-Loaded Content Below the Fold

Lazy loading images is an accepted performance optimization. But lazy loading text content is problematic for SEO. If your page loads a product description only when the user scrolls to that section (using Intersection Observer or scroll event handlers), Google's renderer may not scroll to trigger the load. The content remains hidden.

Fix: include all text content in the initial HTML render. Use lazy loading only for images and videos (using the native loading="lazy" attribute, which Google supports). For expandable/accordion content sections, render the content in the HTML and use CSS to control visibility rather than loading it dynamically via JavaScript when the user clicks.

Issue 2: Client-Side Routing (SPA)

Single-page applications (SPAs) using React Router, Vue Router, or similar client-side routing libraries navigate between pages without full page reloads. From Google's perspective, a SPA is a single page with dynamically changing content. If Google's renderer does not navigate to each route, much of your content is invisible.

Fix: implement server-side rendering (SSR) or static site generation (SSG) so that each route returns fully rendered HTML when requested directly. Next.js, Nuxt.js, and similar frameworks handle this automatically for most cases. The key is that navigating directly to yoursite.com/products/widget should return HTML that contains the widget product page content, not an empty shell that loads content via JavaScript.

Issue 3: Third-Party Script Blocking

Google's renderer blocks requests to certain third-party domains (social media embeds, ad networks, some analytics scripts). If your page content depends on a response from a blocked third-party domain, the rendering fails or produces incomplete content. A common example is content loaded from a headless CMS via client-side API call where the CMS domain is occasionally throttled or blocked.

Fix: fetch third-party content server-side and include it in the initial HTML response. If your page displays content from a headless CMS, fetch that content during server rendering rather than making a client-side API call. This eliminates the dependency on Google's renderer being able to reach the third-party domain.

Issue 4: Infinite Scroll Without Pagination

Infinite scroll loads additional content as the user scrolls down the page. Google's renderer does scroll, but only to a limited extent. Content loaded at the bottom of a very long infinite scroll may never be triggered. This is particularly problematic for e-commerce category pages and blog listing pages where hundreds of items load via infinite scroll.

Fix: implement traditional pagination alongside infinite scroll. Create distinct URLs for each page of content (/blog?page=1, /blog?page=2) that Google can crawl independently. Use rel="next" and rel="prev" link elements to indicate the pagination relationship. The infinite scroll can remain as the user experience, but the paginated URLs ensure Google can discover and index all content.

Issue 5: Content Behind User Interaction

Tabs, accordions, modals, and carousels that require a click to display content may not be rendered by Google if the content is loaded dynamically on interaction. A product page with specifications hidden in a tab that loads content via AJAX when clicked will have those specifications invisible to Google.

Fix: render the content of all tabs, accordion panels, and interactive elements in the initial HTML. Use CSS (display:none) or ARIA attributes (aria-hidden) to hide content visually while keeping it present in the DOM. Google indexes content that is in the HTML even if it is visually hidden, though it may weight it slightly less than visible content.

Detect rendering issues automatically

OSCOM's technical SEO module compares Google's view of your pages with the live version and alerts you to rendering discrepancies.

Start your free audit

Server-Side Rendering vs. Dynamic Rendering

For JavaScript-heavy sites, two architectural solutions address rendering issues: server-side rendering (SSR) and dynamic rendering. SSR generates the full HTML on the server for every request. Dynamic rendering detects the user agent (Googlebot vs. regular browser) and serves pre-rendered HTML to bots while serving the JavaScript version to users.

ApproachProsCons
SSRSame content for all users and bots. No cloaking risk. Better initial load performance.Higher server cost. More complex deployment. Can increase TTFB.
Dynamic RenderingDoes not require changing your frontend architecture. Can be added as a proxy layer.Two versions to maintain. Google considers it a workaround, not a solution. Risk of cloaking if versions diverge.
SSG (Static)Fastest load times. Simplest deployment. No server rendering cost per request.Not suitable for frequently changing or personalized content.

Google recommends SSR or SSG as the long-term solution. Dynamic rendering is explicitly described as a "workaround" in Google's documentation. For new projects, start with SSR or SSG. For existing SPAs that cannot be quickly rebuilt, dynamic rendering using tools like Puppeteer or a pre-rendering service (Prerender.io, Rendertron) can be a pragmatic interim solution while you plan the architectural migration.

Dynamic Rendering Is Not Cloaking
Google has explicitly stated that dynamic rendering is acceptable and is not considered cloaking, as long as the pre-rendered content matches the JavaScript-rendered content. However, if the pre-rendered version and the JS version diverge (different content, different links, different metadata), it becomes cloaking, which can result in a manual penalty. If you use dynamic rendering, automate validation that both versions produce identical content.

Building a JavaScript SEO Testing Workflow

JavaScript rendering issues often appear silently and gradually. A new component that loads content via API, a dependency update that changes rendering behavior, or a configuration change that affects server rendering can all introduce indexation problems without any visible error. Build a testing workflow that catches these issues before they affect search performance.

Pre-Deployment Testing

Before deploying any frontend changes, test representative pages from each template type using the Rich Results Test or the URL Inspection tool in Search Console. Compare the rendered output against the expected content. Automate this by integrating a rendering comparison step into your CI/CD pipeline. Puppeteer or Playwright can render pages and compare the output against a baseline.

Weekly Monitoring

Run a weekly Screaming Frog crawl with JavaScript rendering enabled. Compare the results against the previous week's crawl. Flag any pages where the rendered word count dropped by more than 20%, where internal links disappeared, or where titles or meta descriptions changed unexpectedly. These changes may indicate a rendering regression introduced by a recent deployment.

Monthly Index Coverage Review

Review the Index Coverage report in Google Search Console monthly. Watch for increases in "Discovered - currently not indexed" and "Crawled - currently not indexed" pages. A sudden increase in either category may indicate that Google is crawling your pages but failing to render them properly, resulting in content that does not meet the indexation quality threshold.

Framework-Specific Considerations

Next.js

Next.js provides SSR and SSG by default for most page types, making it one of the most SEO-friendly JavaScript frameworks. The main rendering risk with Next.js is client-only components (using "use client" without SSR fallbacks) and dynamic imports without server rendering. Ensure that critical content components are rendered on the server and that client-only interactions (like modals and interactive widgets) have server-rendered placeholders.

React SPA (Create React App)

Plain React SPAs (built with Create React App or similar) render entirely on the client by default. Every page is an empty HTML shell until JavaScript executes. This is the highest-risk architecture for SEO. If you cannot migrate to Next.js, implement dynamic rendering as an interim solution and plan a migration to an SSR-capable framework.

Vue / Nuxt

Nuxt provides SSR similar to how Next.js does for React. Plain Vue SPAs have the same risks as plain React SPAs. If you use Vue, ensure you are using Nuxt or implementing SSR manually. The Vue ecosystem also supports SSG through Nuxt's generate mode, which is ideal for content-heavy pages that do not change frequently.

89%
of Next.js sites
pass JavaScript rendering audits
34%
of React SPA sites
have critical rendering issues
97%
content indexation
achievable with proper SSR/SSG

Screaming Frog JavaScript rendering study across 10,000 sites, 2025

Prioritizing Fixes

Not all rendering issues need the same urgency. Prioritize fixes by the business impact of the affected pages. Product pages and landing pages that drive conversions need immediate fixes. Blog posts that rank for informational keywords are important but less urgent. Navigation rendering issues that affect internal link discovery are critical because they impact the entire site's crawlability.

For each fix, evaluate the implementation effort versus the SEO impact. Some fixes are simple (adding loading="lazy" only to images instead of text sections). Others require architectural changes (migrating from client-side routing to SSR). Start with the high-impact, low-effort fixes and schedule the architectural work for your next major development sprint.

Key Takeaways

  • 1Google renders JavaScript in a delayed second wave. Content that only appears after JS execution may not be indexed for hours or days.
  • 2Use URL Inspection in Search Console to see exactly what Google sees when it renders your page.
  • 3Run Screaming Frog with JS rendering enabled and compare against HTML-only crawls to identify dependent content.
  • 4Common issues: lazy-loaded text, client-side routing, third-party script blocking, infinite scroll without pagination, and content behind interactions.
  • 5SSR or SSG is the recommended long-term solution. Dynamic rendering is an acceptable interim workaround.
  • 6Build pre-deployment testing and weekly monitoring into your workflow to catch rendering regressions before they impact search.
  • 7Prioritize fixes by business impact: conversion pages first, then content pages, then listing pages.

Technical SEO guides for JavaScript-heavy sites

Rendering audits, crawl optimization, and performance fixes for modern web applications. Delivered weekly.

JavaScript rendering is the most common technical SEO issue that goes undiagnosed because teams assume Google sees what they see. It does not. Google sees what its renderer produces, and its renderer has limitations, delays, and failure modes that are invisible to standard QA processes. The diagnostic process takes a few hours. The fixes range from simple CSS changes to architectural decisions. But the impact of ensuring Google can see 100% of your content is immediate and measurable in your indexation coverage, ranking positions, and organic traffic.

Find where you're losing traffic and what to fix first

Oscom SEO scores every keyword across 6 dimensions and shows you the highest-value opportunities you're missing right now.