Skip to main content
Checklist

JavaScript SEO Checklist: 12 Items Every Ecommerce Store Should Audit

By ยท Updated ยท 7 min read

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.

Frequently asked questions

How often should an ecommerce store run a JavaScript SEO audit?

Run this checklist quarterly and immediately after any major front-end deployment โ€” framework upgrades, new theme launches, or changes to product page templates. JavaScript SEO issues introduced by a single deployment can suppress rankings for weeks before they appear in Search Console data, so post-deploy audits catch regressions early.

Does Googlebot execute all JavaScript on every crawl?

Googlebot does render JavaScript, but rendering is queued separately from crawling and can be delayed by hours to days. Raw HTML is processed first. Content or tags that exist only in the rendered DOM may not be seen on every crawl cycle. Critical SEO elements โ€” canonicals, meta robots, structured data, and navigation links โ€” must be present in raw HTML to guarantee consistent indexation.

What is the difference between a JavaScript crawl issue and a JavaScript render issue?

A crawl issue means Googlebot cannot discover the URL or access its assets โ€” for example, because robots.txt blocks a JS file or links are absent from raw HTML. A render issue means Googlebot fetches the page but the rendered output is incomplete or incorrect โ€” missing content, broken layout, or absent structured data. Both harm indexation but require different fixes.

Can JavaScript-injected canonical tags cause duplicate content problems?

Yes. If a canonical tag is absent from raw HTML and only injected by JavaScript, Googlebot may process the page before rendering completes and treat the URL as self-canonical or ignore the canonical entirely. This is especially problematic on product variant pages where the intended canonical points to a parent product URL. Place canonical tags directly in the `<head>` in server-rendered HTML to avoid this.

Does infinite scroll hurt SEO compared to numbered pagination?

Infinite scroll hurts SEO when it loads products exclusively through JavaScript with no crawlable href links to subsequent page states. Googlebot cannot click or scroll; it follows links. If page 2 through page N of a category are only reachable by scrolling, those products are effectively invisible to search engines. The fix is to implement a paginated fallback with standard anchor tags or use a 'Load More' button that appends a crawlable URL parameter.

MG
Written by

Matt is the founder of RunOctopus. He built All Angles Creatures from zero to page-1 rankings in reptile feeder insects in under 60 days using exactly this method โ€” turning a hard, entrenched niche into RunOctopus's proof store for programmatic SEO and AI search citation.

Connect on LinkedIn →

See what Otto would build for your store

Free architecture preview. No card required. Five minutes.

Generate Preview →