Why Ecommerce Stores Need a JavaScript SEO Audit
Ecommerce stores rely on JavaScript for product filters, dynamic pricing, reviews, and infinite scroll โ all features that search engine crawlers handle differently than a human browser does. When Googlebot renders a page late or incompletely, product pages lose ranking signals, canonical tags go unread, and structured data never reaches the index. A JavaScript SEO audit surfaces exactly where the render pipeline breaks down before it costs organic revenue.
This checklist covers 12 discrete checks across crawlability, renderability, indexability, and performance. Each item has a pass criterion and a fail criterion so the outcome is binary, not interpretive. Run this audit quarterly or after any major front-end deployment.
Crawl and Fetch Checks (Items 1โ4)
**Item 1 โ Raw HTML contains critical text links.** Fetch the page source with `curl` or Google Search Console's URL Inspection tool (raw HTML view). PASS: primary navigation links, category links, and at least one internal link per page appear in raw HTML. FAIL: all links are injected by JavaScript and absent from raw HTML. Googlebot discovers URLs from raw HTML during the crawl phase, before rendering. Missing links mean entire site sections go undiscovered.
**Item 2 โ Robots.txt does not block JavaScript or CSS files.** Download your robots.txt and check for `Disallow` rules targeting `/static/`, `*.js`, or `*.css` paths. PASS: no JS or CSS assets are blocked. FAIL: any render-critical asset is disallowed. Blocked assets prevent Googlebot from rendering the page accurately, which causes it to index a broken, asset-stripped version of content.
**Item 3 โ Sitemap URLs return 200 status codes without JavaScript redirects.** Crawl every URL in your XML sitemap using a tool like Screaming Frog. PASS: every URL returns HTTP 200 with no client-side redirects. FAIL: any URL returns a 3xx, 4xx, or 5xx, or redirects only after JavaScript execution. Client-side redirects are invisible to crawlers until after rendering, delaying or preventing proper indexation.
**Item 4 โ Pagination uses crawlable href attributes, not JavaScript event handlers.** Inspect the HTML source of a paginated category page. PASS: each page link contains a standard `<a href="/category?page=2">` element in raw HTML. FAIL: pagination is triggered by `onclick` handlers or `button` elements with no `href`. Without crawlable pagination links, Googlebot cannot walk through paginated product sets.
Render and Content Checks (Items 5โ8)
**Item 5 โ Rendered HTML matches raw HTML for product titles and prices.** Compare raw HTML against rendered HTML using Google's Rich Results Test or a headless browser. PASS: product name, price, and primary description are identical in both views. FAIL: any critical field appears only in the rendered version. Googlebot indexes the rendered version, but crawl budget and latency mean rendering can lag by days. Content visible only post-render is at risk of not being indexed at all.
**Item 6 โ Meta robots tags and canonical tags appear in raw HTML, not injected by JavaScript.** View page source and locate `<meta name="robots">` and `<link rel="canonical">`. PASS: both tags are present in raw HTML before any script executes. FAIL: either tag is absent from raw HTML and only present after rendering. A canonically injected by JavaScript can be ignored or misread by crawlers, causing duplicate content issues across product variant URLs.
**Item 7 โ Structured data (JSON-LD) is present in raw HTML.** Open page source and search for `<script type="application/ld+json">`. PASS: Product, BreadcrumbList, and any Review schema blocks are present in raw HTML. FAIL: JSON-LD is injected dynamically after page load. Structured data in raw HTML is parsed reliably; dynamically injected structured data depends on successful rendering, which is not guaranteed for every crawl.
**Item 8 โ JavaScript-driven faceted filters do not generate indexable duplicate URLs.** Apply multiple product filters and inspect the resulting URL in the browser address bar. PASS: filter combinations use URL parameters that are either canonicalized to a single parent URL or blocked in robots.txt. FAIL: each filter combination produces a unique, crawlable URL with no canonical tag. Unconstrained faceted navigation can generate thousands of thin duplicate pages that dilute crawl budget and index quality.
Performance and Core Web Vitals Checks (Items 9โ10)
**Item 9 โ Largest Contentful Paint (LCP) element is not lazy-loaded JavaScript.** Use Chrome DevTools Performance tab or PageSpeed Insights to identify the LCP element on key product and category pages. PASS: the LCP element (typically the hero image or product image) loads via standard HTML `<img>` or CSS, not deferred JavaScript. FAIL: LCP element is injected by a JavaScript carousel or lazy-load library that delays its paint. Google uses LCP as a ranking signal; a JavaScript-deferred LCP element directly harms Core Web Vitals scores.
**Item 10 โ Total Blocking Time (TBT) on category pages is under 200ms.** Measure TBT using PageSpeed Insights (lab data) on your top five category pages. PASS: TBT is below 200ms on mobile. FAIL: TBT exceeds 200ms. High TBT indicates long JavaScript tasks blocking the main thread, which degrades Interaction to Next Paint (INP) and signals poor page experience to Google's ranking systems.
Indexation and Schema Integrity Checks (Items 11โ12)
**Item 11 โ URL Inspection confirms Google indexed the rendered version with full content.** In Google Search Console, run URL Inspection on five product pages and click 'View Crawled Page.' Compare the screenshotted rendered page against the live page. PASS: rendered screenshot matches the live page including product images, description, and price. FAIL: rendered screenshot shows blank sections, missing images, or placeholder text. A mismatch means Google is indexing an incomplete version of the page.
**Item 12 โ JavaScript errors do not appear in the browser console on key ecommerce pages.** Open Chrome DevTools Console tab on homepage, a category page, a product page, and the cart. PASS: zero JavaScript errors appear. FAIL: any `TypeError`, `ReferenceError`, or failed network request for a critical script appears. Console errors indicate broken render paths. Even errors that appear minor in the browser can prevent Googlebot's renderer from completing the page, resulting in partial or failed indexation.
Prioritizing Fixes After the Audit
Treat any FAIL on items 1, 6, 7, or 11 as critical: these directly affect what Google indexes and how it interprets canonicalization and structured data signals. Fix these before addressing performance issues. FAIL results on items 2, 3, 4, and 8 are high priority because they expand or distort the crawl scope. Items 5, 9, 10, and 12 address render fidelity and page experience โ resolve these in the second phase.
Document each check result in a shared spreadsheet with the page URL, pass/fail status, the specific symptom observed, and the assigned fix owner. Rerun the full checklist within two weeks of deploying fixes and verify in Google Search Console that previously failing pages are now indexed correctly and show accurate rendered content in URL Inspection.