Ecommerce SEO Audit

How I audit an online store — and why I start with Google Search Console and crawl data, not on-page tweaks. A prioritized, scale-first ecommerce SEO audit framework: crawlability, indexation, duplicate content, on-page at scale, technical, structured data, internal links, out-of-stock handling, and off-page — sorted by impact and effort.

First published: Jun 25, 2026 · Last updated: Jul 29, 2026 · Advanced
demand #15 in Ecommerce SEO#213 on the site

An ecommerce SEO audit isn't a 500-point checklist — it's the work of finding the small set of issues holding a store's rankings and revenue back, then prioritizing them by impact and effort. Because ecommerce sites hit problems at scale, I start the audit in Google Search Console (the Page Indexing report) and crawl data, not on-page tweaks: the biggest wins are usually crawling and indexation issues affecting thousands of URLs at once. Duplicate content from facets, collections, and variants is the #1 ecommerce-specific issue audits uncover; thin category pages are #2. The goal is to fix the stuff that matters most and skip the busywork.

TL;DR — I audit a store in roughly this order: crawlability → indexation → duplicate content → on-page at scale → technical (CWV, HTTPS, canonicals) → structured data → internal links → out-of-stock handling → off-page. I start in the GSC Page Indexing report and a fresh crawl, not on-page, because on a store the highest-leverage problems hit thousands of URLs at once: faceted-nav duplication, accidental sitewide noindex, “Discovered – currently not indexed” at scale, sitemaps full of redirects. The deliverable is a prioritized impact/effort list, not a 500-point report. Most stores never need to worry about crawl budget — but the ones that do really do.

Evidence for this claim Search Console's Page indexing report identifies indexed and non-indexed URLs and groups reasons pages are not indexed. Scope: Google Search Console audit data. Confidence: high · Verified: Search Console Help: Page indexing report Evidence for this claim Google's Rich Results Test and product structured-data requirements can be used to validate product markup eligibility. Scope: Google product structured-data validation. Confidence: high · Verified: Google Search Central: Product structured data

Audit philosophy: client-first, not issue-first

A crawler will hand you 170+ issue types. If you dump all of them into a report, you’ve produced a document, not an audit. The job is to find the handful that move rankings and revenue and ignore the rest.

The starting point isn’t the tool — it’s the pain. As I’ve put it before: “If clients are coming to you asking for an audit, they already have a pain point. Talk to them. Solve that one thing and they’ll be happy with the audit.” On a store the pain is usually concrete: traffic dropped, a category stopped ranking, a migration went sideways, new products aren’t getting indexed. Anchor the audit to that, then expand.

And know when to stop. From our study of over a million domains: “Sometimes, the best course of action is to do nothing because the costs outweigh the benefits.” Not every flagged issue is worth a developer ticket.

Why I start with Search Console and crawl data, not on-page

The instinct to open the audit with title tags and headings is the most common mistake I see. On an ecommerce site the math is against it: tweaking a title helps one page; fixing an indexation pattern helps thousands. The biggest wins on a store are almost always crawling and indexation problems at scale, and the stakes are highest exactly here — “one mistake can keep millions of pages out of the index or remove an entire site from search results.”

So the audit runs in priority order, top to bottom. Here’s the whole thing.


Step 1 — Crawlability

Can bots reach what matters, and are they wasting their time on what doesn’t?

The ecommerce-specific traps:

  • Faceted navigation URL explosion. Filters (color, size, price range) combine into thousands of unique URLs. Google is candid about the cost: “the crawlers will typically access a very large number of faceted navigation URLs before the crawlers’ processes determine the URLs are in fact useless.”
  • Parameter variants — session IDs, tracking codes (?utm_source=), sort orders — multiply the same content across URLs.
  • Crawl traps — internal search results, infinite calendars, unbounded filter stacking.
  • robots.txt over- or under-blocking — accidentally blocking CSS/JS needed to render, or a valid product path; or failing to block a junk parameter space.
  • JS-gated navigation. Google wants real links: “use <a href> tags when creating links to other content. Don’t use JavaScript events on other HTML DOM elements for navigation.”

Audit steps:

  • Fetch and read robots.txt; confirm nothing important is disallowed and that low-value parameter spaces are.
  • In the crawler, pull “Blocked by robots.txt” — any important pages caught?
  • GSC Crawl Stats: look for spikes in crawled URLs against a flat indexed count — that gap is crawl waste.
  • Export all crawled URLs and cluster by path/parameter pattern to size the faceted/parameter problem.

On crawl budget — de-escalate first. Most stores don’t have a crawl-budget problem, and I’ll say so in the audit rather than invent one: “Most sites don’t need to worry about crawl budget, but there are few cases where you may want to take a look.” It becomes real around Google’s thresholds — “Large sites (1 million+ unique pages)…” changing weekly, or 10,000+ pages changing daily — or when “Discovered – currently not indexed” is large. When it is real, you fix it by removing waste, not by asking Google to crawl more. (Deep dive: crawl budget.)

Step 2 — Indexation

Crawlable isn’t indexed. The GSC Page Indexing report is the center of gravity for the whole audit — “see which pages Google can find and index on your site, and learn about any indexing problems encountered.”

The statuses that matter most on a store:

  • Duplicate without user-selected canonical / Google chose a different canonical — the faceted/variant duplication problem, made visible.
  • Crawled – currently not indexed — usually thin product or near-duplicate filter pages.
  • Discovered – currently not indexed — Google knows the URL but hasn’t crawled it; on large catalogs this is a crawl-priority signal.
  • URL marked ‘noindex’ — verify it’s intentional. The accidental sitewide version is the “one mistake” scenario.
  • Soft 404 — a 200 response on a page that’s effectively empty (out-of-stock, zero-result search). Google warns these “will continue to be crawled, and waste your budget.”

Audit steps:

  • Export “Not indexed” URLs by reason; quantify each bucket.
  • Compare GSC indexed count against your known catalog size — a large gap means Google isn’t finding pages.
  • Run URL Inspection on a sample from each reason bucket.
  • Audit the XML sitemap: it should list only canonical, indexable, 200-status URLs. Redirected, noindexed, or canonicalized-away URLs in a sitemap send conflicting signals — pull them.

Step 3 — Duplicate content (the #1 ecommerce issue)

This is the single most common thing an ecommerce audit uncovers, and it’s worth its own step. Google’s Gary Illyes has estimated that roughly 60% of the internet is duplicate content — and stores are overrepresented.

Where it comes from:

  • Faceted navigation?color=blue, ?size=S&color=blue, ?size=S&color=blue&sort=price all serve near-identical content.
  • Parameter-order permutations?color=blue&size=S and ?size=S&color=blue are the same page twice.
  • Product variants as separate URLs?variant=… without a self-referencing canonical or a canonical to the parent.
  • A product living under multiple category paths, both indexable.
  • HTTP/HTTPS, www/non-www, trailing-slash inconsistency that doesn’t 301 to one canonical.

The Shopify gotcha worth calling out by name. Shopify does canonicalize /collections/{collection}/products/{product} to the clean /products/{product} URL — so people assume it’s handled. It isn’t fully: the internal links from collection pages still point at the non-canonical /collections/... version, so the canonical product URL receives no internal link equity through normal navigation, and it can show up as an orphan. Fixes: add an “All products” page that links the canonical /products/ URLs, or edit collection templates to link the canonical URL directly.

Audit steps:

  • GSC: pull both “Duplicate” buckets from Page Indexing.
  • Crawler Content Quality / duplicate-cluster report: find clusters with no canonical specified.
  • Confirm faceted parameter URLs are handled — Google’s recommended prevention is robots.txt blocking of filter parameters, or fragment-based (#) filtering, which “will have no impact on crawling.” Don’t reach for noindex here (see Myths).
  • Spot-check that Shopify /collections/*/products/* URLs canonicalize to /products/* — and that something links the canonical version.

(Background: duplicate content and canonicalization.)

Step 4 — On-page at scale

On a store, on-page is a templating problem, not a copywriting one — you’re auditing patterns, not pages.

The recurring issues:

  • Thin category pages (the #2 ecommerce issue). John Mueller is direct about it: “When the ecommerce category pages don’t have any other content at all, other than links to the products, then it’s really hard for us to rank those pages.” But don’t overcorrect into a wall of text — “maybe 90%, 95% of that text is unnecessary,” and “our algorithms sometimes get confused when they have a list of products on top and essentially a giant article on the bottom.” The target is a short, useful block (sourcing, materials, sizing, popularity) near the top — not filler that buries the grid.
  • Templated title collisionsBuy {Product} | Store patterns that go near-identical across products, or two products sharing a name.
  • Missing/empty H1s and titles at the template level.
  • Meta descriptions — worth doing on your top category and product pages, less worth it on the long tail (Google rewrites them most of the time anyway).

Audit steps:

  • Crawler On-Page report: filter for missing title, missing H1, missing meta description, duplicate titles, duplicate H1s.
  • Flag category pages with little to no unique body copy (thin-content candidates) and cross-reference against “Crawled – currently not indexed.”
  • Export titles and check for template collisions.

A note on what not to spend audit time on: multiple H1s. They’re valid HTML5 and near-irrelevant to ranking — 51.3% of sites have them somewhere, per my own million-domain study. Skip it.

Step 5 — Technical (CWV, HTTPS, canonicals, mobile)

Core Web Vitals. Google’s passing thresholds: LCP < 2.5s, INP < 200ms, CLS < 0.1. Ecommerce failure modes are predictable — unoptimized hero images and third-party scripts (chat, A/B, pixels) hurt LCP; add-to-cart and checkout JS hurt INP; images without explicit dimensions and injected promo bars hurt CLS. Audit by URL group in the GSC CWV report so you can see whether it’s product, category, or checkout templates failing, then confirm on representative templates in PageSpeed Insights. (See Core Web Vitals.)

HTTPS. Everything — product, cart, checkout — on HTTPS, no mixed content (HTTP images/resources on HTTPS pages), and canonicals/redirects pointing at the HTTPS version.

Canonicals. The common ecommerce errors: canonicals pointing at 4XX pages; non-canonical URLs in the sitemap; paginated pages canonicalized to page one (don’t); and — the quiet one — internal links pointing at non-canonical versions so the canonical never accumulates link equity. Multiple rel=canonical tags on one page get ignored.

Mobile-first. Google indexes the mobile version. Make sure the mobile product page isn’t a stripped-down one missing the description, the structured data, or full-size images.

Raw versus rendered product evidence. On representative PDPs, save the initial HTML and a rendered capture after a fresh navigation. Do not treat resizing an already-loaded desktop page as a mobile-rendering test. The raw response should expose the core product identity, selected/default SKU and attributes, price, currency, availability, crawlable variant links where required, and matching Product/Offer data. Then compare the rendered DOM and visible selection. Google may render JavaScript, but other crawlers and agents vary; a successful render also does not cure contradictory product facts.

For each sampled variant, continue the comparison through the feed, cart, and checkout. The URL, visible PDP, rendered JSON-LD, feed item, and transaction should agree on product identity, SKU, group ID, selected attributes, price, currency, and availability. Record intentional location- or customer-specific revalidation separately from unexplained mismatches. See Product Page SEO for the raw/rendered boundary and Product Variant SEO for the full selected-offer contract.

Step 6 — Structured data

For a store, the priority types are Product / ProductGroup, BreadcrumbList, Organization (with return policy), and Review / AggregateRating. Adding more valid properties widens eligibility — Google: “adding the more properties you can add, the more enhancements your page can be eligible for.” (The one myth to keep in your head: schema makes you eligible for rich results; it doesn’t make you rank.)

Audit steps:

  • Run the Rich Results Test on a representative product and category page.
  • GSC Enhancements: check Product Snippets and Merchant Listings for errors/warnings.
  • Check required vs. recommended separately per feature — don’t collapse them. For merchant listings, Google’s required set is name, image, and offers (an Offer, with price, priceCurrency, and availability). For product snippets, name is required and you need at least one of review, aggregateRating, or offers to be eligible — Google lists aggregateRating, offers, and review as recommended, not required, on that feature.
  • Common faults: missing image, missing offers, missing availability, schema prices that don’t match the visible price (a policy violation), breadcrumb schema that doesn’t match the visible trail.

Step 7 — Internal linking

The issues: orphan product pages (classic Shopify symptom, above); important category/product pages buried 5+ clicks deep; internal links pointing at redirects or 404s; best sellers not linked from high-authority hubs. Google: “add links from menus to category pages, from category pages to sub-category pages, and finally from sub-category pages to all product pages.”

Audit steps:

  • Crawler Links report: pull orphan pages and crawl depth; confirm key pages sit within ~3 clicks of the homepage.
  • Pull links to redirects and broken links.
  • Check that your highest-revenue products are linked from the main nav and editorial/hub pages.

Step 8 — Out-of-stock and discontinued products

A genuinely ecommerce-only section. My honest answer here is the SEO cliché for a reason: “though it’s a joke in the SEO community, ‘it depends’ is really the answer when dealing with out-of-stock products.” And “ultimately, there’s no perfect solution.” The decision turns on whether it’s temporary vs. permanent and whether the page has traffic or links:

ScenarioWhat I doWhy
Temporarily OOSKeep the page liveAdd restock dates, waitlist, notify-me; don’t throw away ranking
Permanently discontinued, close replacement301 to the similar productPreserves link equity if they’re genuinely similar
Discontinued, no match, has links/trafficKeep live with “related products”Retains ranking potential; route users onward
Discontinued, no links/traffic404 or 410Clean it up; fix internal links pointing at it

Do not audit availability from the visible label alone. Sample an ordinary in-stock SKU, a temporary stockout, a recently restocked item, one unavailable variant inside an available product group, and a postcode-restricted offer. For each, reconcile the authoritative backend state, selected variant, visible page, Product/Offer markup, merchant feed row, cart line, and checkout outcome. Record the market, postcode, channel, collection time, and feed-processing time so a personalized fulfillment result is not mistaken for the catalog’s general state. The full mapping is in the Product Schema availability contract.

Watch for soft 404s: out-of-stock pages, zero-result searches, or empty cart/account pages returning 200. Pull the Soft 404 bucket in GSC and resolve by pattern. (See out-of-stock products for the full framework.)

Step 9 — Off-page

Lighter for most stores, but worth a pass:

  • GSC Performance: branded vs. non-branded click share — heavy branded reliance means weak non-branded discovery.
  • Backlink profile by page type — are category/product pages earning links, or only the homepage and blog?
  • Find 404 pages that have backlinks and 301 them to the closest live page (reclaim the equity).
  • Competitor link gap on category pages.

How to prioritize the findings

Everything above produces a list. The list is not the deliverable — the sorted list is. I score each finding on an impact/effort matrix: “anything high-impact and low-effort is a quick win, so those tasks should be tackled first.” For a store:

  • High impact / low effort — do first: a stray sitewide noindex; a sitemap full of redirect/noindex URLs; missing canonicals on variant URLs; internal links pointing at redirects; out-of-stock soft 404s.
  • High impact / high effort — plan and schedule: faceted-nav architecture; Core Web Vitals work; rolling Product schema across templates; crawl-depth / architecture fixes.
  • Low impact / low effort — when time allows: meta descriptions on long-tail products; minor title-template tidy-ups.
  • Low impact / high effort — skip: redirect-chain cleanup on zero-traffic pages; Open Graph tags (social, not ranking).

The whole point of the matrix is permission to not do things.

Template patterns make prioritization visible: the same issue can be urgent in one cohort and irrelevant in another.

An illustrative cohort matrix compares thin content, non-canonical pages, deep URLs, and schema errors. Product pages score 22, 11, 36, and 48 percent; category pages 18, 8, 54, and 12 percent; facet URLs 71, 83, 64, and 5 percent; blog pages 9, 3, 14, and 2 percent. These are synthetic rates, not customer or site data.

Common myths to clear up in the report

  • “More indexed pages = better SEO.” No — Google’s own advice is to “eliminate duplicate content to focus crawling on unique content rather than unique URLs.” Inflating the index with thin variant pages usually hurts.
  • “Use noindex to save crawl budget on facets.” No: “don’t use noindex, as Google will still request, but then drop the page… wasting crawling time.” Block the fetch (robots.txt) or use fragment filtering instead.
  • “Shopify handles all canonicalization.” It sets the canonical tag, but it doesn’t fix the internal-linking-to-non-canonical problem. See Step 3.
  • “Crawl budget affects every store.” It doesn’t — most stores never need to think about it.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin an expert quote first.