SEOMay 19, 202610 min read

JavaScript Rendering and Ecommerce SEO: What Googlebot Actually Sees

Client-side rendering hides content from Google longer than most store owners realize. Learn how JS rendering affects ecommerce SEO, when dynamic rendering helps, and how to audit your store's crawlability.

StoreVitals Team

Most ecommerce stores today rely heavily on JavaScript — for product filters, dynamic pricing, review widgets, and personalization. The problem: Googlebot does not process JavaScript the same way a user's browser does, and the gap between what users see and what Google indexes is often wider than store owners realize.

This guide covers how Google handles JS rendering in 2026, what that means for ecommerce SEO, and the specific audit checks that surface crawlability issues before they become ranking problems.

How Googlebot Renders JavaScript

Google runs a two-wave rendering process:

  1. First wave (fast) — Googlebot fetches the HTML and indexes what's in the raw response. Any content in the initial HTML is indexed quickly.
  2. Second wave (slow) — Googlebot renders the page in a headless Chromium instance and re-indexes the rendered DOM. This happens asynchronously, with delays ranging from hours to weeks depending on crawl budget and page priority.

The practical consequence: content that only exists in the rendered DOM (client-side rendered content) gets indexed later than server-rendered content, sometimes significantly later. For new products, category pages, and time-sensitive promotions, this delay can mean missed rankings during the window when they matter most.

The Ecommerce JS Rendering Problem Map

Product descriptions rendered by JS

On Shopify stores using headless themes, WooCommerce stores with AJAX product pages, or stores using React/Vue for the product detail page, the product description may only exist in the rendered DOM. If Googlebot indexes the raw HTML, it may see a nearly empty page — or a page whose description is "Loading…".

Check: fetch your product page with curl (or Google's URL Inspection Tool with "Test Live URL" → "View Crawled Page") and compare the raw HTML to what a browser renders. If the description is missing from raw HTML, it's at risk.

Category filters not indexable

Faceted navigation is one of the most important SEO surfaces in ecommerce. Filters for size, color, brand, and price generate high-intent long-tail URLs. But if filtering is implemented with JavaScript state (no URL update, or URL hash instead of query string), Googlebot never generates those URLs — and the pages never get indexed.

Correct approach: every filter combination that should be indexed must update the URL with a real query parameter (?color=red&size=L) and render its content in server-side HTML (or at minimum, in the initial JS payload). JS-only filters with hash-based state are invisible to Google.

Infinite scroll and pagination

Infinite scroll replaces traditional pagination by loading new products as the user scrolls. The problem: Googlebot doesn't scroll. It sees page 1, and only page 1. Products below the fold of the initial load may never be indexed.

Solutions:

  • Maintain a "Load More" button alongside infinite scroll that Googlebot can follow
  • Implement standard paginated URLs (/products?page=2) as the canonical structure, with infinite scroll as a progressive enhancement
  • Ensure paginated pages are linked from the sitemap

Reviews rendered client-side

Third-party review widgets (Judge.me, Yotpo, Okendo, Trustpilot) often inject reviews via JavaScript after page load. If review content is in the rendered DOM but not the raw HTML, Google indexes reviews in the second wave — meaning new products with fresh reviews may take weeks to show review-rich snippets in search results.

For review-rich snippets specifically, Google requires the review structured data (JSON-LD or microdata) to be present in the rendered DOM. If your review app injects structured data via JS, it will eventually be indexed — but with the wave-2 delay.

Price and availability rendered late

Dynamic pricing (personalized prices, sale prices, B2B tier pricing) and real-time inventory checks often render via JS after the initial page load. Google's structured data for Product requires price and availability to be accurate for rich snippet eligibility. If these values are JS-injected and lag behind Googlebot's first-wave HTML, the structured data may be incomplete or stale.

Dynamic Rendering: When It Helps

Dynamic rendering serves different HTML to crawlers versus users — full server-rendered HTML to Googlebot, client-side rendered HTML to browsers. It's a pragmatic workaround for stores that can't easily add server-side rendering to their frontend stack.

Tools for dynamic rendering:

  • Prerender.io — cloud-based, integrates with CDN or reverse proxy
  • Rendertron — open-source Google-maintained headless renderer
  • Cloudflare Workers — detect bot user agents at the edge, serve prerendered HTML

Important: Google's official position is that dynamic rendering is a workaround, not a recommended long-term solution. The preferred architecture is server-side rendering (Next.js, Nuxt, SvelteKit) or static generation. Dynamic rendering buys time while you migrate.

The JS Rendering SEO Audit

Run this checklist on your store's product and category pages:

  1. Raw HTML checkcurl -s https://yourstore.com/products/[slug] | grep -i "product description". Is the content present?
  2. Google URL Inspection — Use Search Console's URL Inspection tool → "View Crawled Page" to see what Google actually rendered. Compare to "View HTML" to see the raw response.
  3. JavaScript errors — Open DevTools Console on product pages. Any JS errors that would prevent rendering also affect Googlebot. Fix JS errors before optimizing for crawling.
  4. Filter URL pattern — Apply a filter. Does the URL change? Does it use query parameters or hash fragments? Hash fragments (#color=red) are invisible to Googlebot.
  5. Pagination structure — Does your category pagination use real URLs? Are paginated pages in the sitemap?
  6. Structured data source — Are Product, Review, and BreadcrumbList JSON-LD blocks in the raw HTML, or injected by JS? If injected, is the data accurate at injection time?
  7. Review widget type — First-party review rendering (embedded HTML) vs. third-party JS widget. Third-party widgets always have wave-2 delay for structured data.
  8. Page load timing — Use WebPageTest or Chrome's Performance panel to measure when your key content appears. Content that appears after 5 seconds is at higher risk of being missed by Googlebot.

Server-Side Rendering: The Permanent Fix

The definitive solution to JS rendering issues is server-side rendering (SSR) or static site generation (SSG). With SSR, every page's full HTML — product descriptions, reviews, prices, structured data — is in the HTTP response body, available to Googlebot on the first wave with no rendering delay.

Modern ecommerce frameworks with strong SSR support:

  • Next.js — Page Router getServerSideProps or App Router server components. Shopify Hydrogen uses Next.js/React Server Components with built-in SSR.
  • Nuxt 3 — Vue-based, strong SSR story with automatic route generation
  • SvelteKit — Excellent SSR performance, smaller bundle sizes than React-based options
  • Astro — Content-first, generates static HTML by default with opt-in server rendering

The migration from a client-rendered SPA to an SSR framework is significant engineering work, but the SEO gains — particularly for large catalogs where many pages compete on long-tail keywords — consistently justify it.

StoreVitals audits check whether your store's key content (titles, descriptions, structured data, product names) is present in the raw HTML response or only visible after JS execution. Stores where critical content is JS-only receive specific recommendations with the pages affected — so you can prioritize SSR migration by the pages with the highest organic traffic risk.

javascript SEOcrawlabilitydynamic renderingecommerce SEOGooglebot

See these issues on your store?

Run a free scan and find out in seconds.

Run Free Scan