# Ecommerce SEO audit: the technical checks every online shop needs

> An ecommerce SEO audit checks what a normal site audit misses in a shop: filter and sort URLs, products in several categories, variants, out-of-stock pages, product schema and category page speed.

Updated 2026-09-26 · Technical SEO · HTML version: https://getreport.app/guides/ecommerce-seo-audit

An ecommerce SEO audit is a technical SEO audit adapted to an online shop: besides the usual checks, it tests the things only shops have, such as filter and sort URLs, products listed under several categories, variants, out-of-stock and discontinued products, and product structured data. Shops fail differently from other sites because their templates multiply: one category with five filters can produce thousands of URLs, and one bug in the product template repeats on every product. This guide is the shop-specific layer on top of the general [SEO audit checklist](https://getreport.app/guides/seo-audit-checklist), in the order that matters. For the background on crawling and indexing, start with the [technical SEO guide](https://getreport.app/guides/technical-seo).

## Quick answer

- **Compare what Google indexed with what you sell.** Search Console's Pages report against your number of products and categories shows at once whether the shop is under- or over-indexed.
- **Control the filters.** Sort, view and most filter combinations should not be indexed; a few filters people search for can be real landing pages.
- **One URL per product,** whatever category path the visitor came through, with a self-referencing canonical.
- **Category pages are your main landing pages:** unique titles, some real text, self-referencing canonicals on page 2 and beyond, and no `noindex`.
- **Decide what happens to out-of-stock and discontinued products** before Google decides for you.
- **Product structured data must match the page:** the same price, currency and availability the visitor sees.
- **Audit speed on the product and category templates,** where the large image and the product grid live.

## Why a shop needs its own audit

A brochure site has a few dozen pages that people wrote by hand. A shop has a handful of templates that generate hundreds or thousands of pages, plus URL parameters that generate many more. That changes where problems come from:

- **URL multiplication.** Filters, sorting, pagination, tracking parameters and internal search each create new URLs showing overlapping content. Google's documentation on faceted navigation says crawling these URLs can cost sites large amounts of computing resources and slow down the discovery of new pages.
- **Duplicate products.** The same product reached through `/shoes/runner-x` and `/sale/runner-x`, or a manufacturer's description copied word for word across hundreds of shops.
- **Lifecycle.** Products sell out, come back and are discontinued, and each state needs a different answer.
- **Rich results.** Price, availability and review stars in search depend on structured data that must stay in sync with the page.

The audit below follows the path a searcher takes: category, filter, product.

## 1. Indexation: what Google has against what you sell

Start with numbers. Count your live products and categories, then open Search Console → Indexing → Pages.

- **Far fewer indexed pages than products:** products are blocked, canonicalised elsewhere, `noindex`, or not linked well enough to be crawled. Check a few product URLs with URL Inspection.
- **Far more indexed pages than products and categories:** parameter, filter or internal search URLs are being indexed.
- **Read the "Why pages aren't indexed" table.** Large numbers under "Duplicate without user-selected canonical" or "Alternate page with proper canonical tag" point at variants and parameters; "Crawled – currently not indexed" on products often means thin or duplicate descriptions.

Then check that the XML sitemap lists every product and category URL you want indexed, and nothing else: no filtered URLs, no redirected or deleted products.

> **Check: The page can be indexed.** To appear in search, a page must return HTTP 200, carry no noindex directive and be allowed in robots.txt. If any of the three fails, the page is invisible to searchers.
>
> 1. Open the technical detail to see which condition fails, then fix that one; the individual findings above have the steps.
> 2. After the fix, request indexing in Google Search Console to speed things up.

## 2. Filters, sorting and parameters

Open a category and use every filter and sort option. Note the URLs they create.

- **Sort and view parameters** (`?sort=price`, `?view=grid`) show the same products in another order. Their canonical should point at the unsorted category.
- **Filter combinations** (`?colour=red&size=42&brand=x`) usually have no search demand. Google's faceted navigation documentation recommends preventing crawling of these URLs with robots.txt when you do not need them indexed, and returning a 404 for filter combinations with no results rather than an empty page.
- **Filters people search for** ("red trekking shoes", "women's trail shoes") deserve a real landing page: a clean, static URL, its own title and H1, a line of text, a self-referencing canonical and a link from the category.
- **Filter order.** If `?colour=red&size=42` and `?size=42&colour=red` both work, the same page has two URLs. Always build parameters in one order.

The full per-parameter table, with what to canonicalise, what to `noindex` and what to block, is in [faceted navigation and parameter URLs](https://getreport.app/guides/faceted-navigation-and-parameter-urls). Do not combine a robots.txt block with a canonical or `noindex` on the same URLs: Google cannot read tags on a page it may not crawl.

## 3. Category pages

Category pages usually rank for the broad, high-volume searches, so audit them as landing pages.

- **Unique title and H1** that name the category in searchers' words: "Women's waterproof trekking shoes", not "Category 14".
- **Some real text:** a short intro that helps choose, placed where it does not push products out of view. A category with 40 products and 30 words is normal and fine; one with 2 products and no text may be thin.
- **Pagination:** page 2 and beyond have their own URL, a self-referencing canonical, "Page 2" in the title and normal `<a href>` links. Pointing every page's canonical at page 1 hides the products that only appear deeper. See [pagination after rel=prev/next](https://getreport.app/guides/pagination-after-rel-prev-next).
- **Empty categories:** either fill them, `noindex` them temporarily, or remove them and redirect.
- **Breadcrumbs** on every category and product, with BreadcrumbList markup.

> **Check: Pagination links are in place.** rel="prev" and rel="next" mark this page as part of a series. Google no longer uses them for indexing, but browsers and other search engines still read them, and they do no harm.
>
> 1. Keep them if your CMS emits them; make sure each paginated page also has its own canonical URL and links to the next page in the HTML.

> **Check: Breadcrumb navigation found.** Breadcrumbs show visitors where they are and let Google show a readable path instead of the URL in desktop results. Most useful on shops and sites more than two levels deep.
>
> 1. Add a breadcrumb trail in a <nav aria-label="Breadcrumb"> and describe it with BreadcrumbList structured data.

## 4. Product pages

Audit one product from each product type, and one that is out of stock.

- **One canonical URL.** A product in three categories has one address, usually `/products/runner-x` or `/shoes/runner-x`. Category paths either redirect to it or carry a canonical pointing at it, and internal links use it.
- **Unique content.** A manufacturer's description appears on every shop that sells the product. Add what only you have: sizing notes, your own photos, use cases, real questions from customers.
- **Titles with the product name and a key attribute:** "Alpina Pro trekking shoe, waterproof · Outdoor Shop".
- **Images** with descriptive alt text and file sizes that do not delay the page; the main product image is usually the Largest Contentful Paint element.
- **Reviews** in the HTML, not only in a widget that loads after the page.

> **Check: Canonical tag points to a valid URL.** The canonical tag asks Google to index that URL instead of this one. If it points to another site, appears twice or leads to an error page, your ranking signals are given away or ignored.
>
> 1. Point the canonical at this page's own clean URL (same scheme and host, no tracking parameters), and make sure it returns 200.
> 2. Keep exactly one canonical tag; if a plugin and the theme both add one, disable one of them.

> **Check: Every image has an alt attribute.** Alt text is how Google Images and screen readers understand a picture. Missing alt text loses image traffic and fails accessibility.
>
> 1. Describe each meaningful image in a short alt attribute ("Blue running shoe, side view").
> 2. Give purely decorative images an empty alt="" so screen readers skip them.

### Variants

Colours and sizes can live on one product URL with a selector, or on separate URLs per variant. Both work in Google Search; what matters is that you choose one pattern and apply it consistently. With separate URLs, each variant URL either has its own title and a self-referencing canonical, or canonicalises to the main product. Google's product variant structured data (`ProductGroup` with `hasVariant` and `variesBy`) describes the relationship in either case.

## 5. Out-of-stock and discontinued products

This is where shops lose rankings quietly. Check what your platform does today, then set a rule.

| Situation | What to do |
| --- | --- |
| Temporarily out of stock | Keep the page live and indexable, show when it returns and offer alternatives; set `availability` to `OutOfStock` in the schema |
| Discontinued, with a successor | 301 redirect to the successor |
| Discontinued, no replacement | 301 to the closest category, or return 404 or 410 |
| Seasonal, returns every year | Keep the URL; update the page when it is back |

Do not redirect every removed product to the home page: Google often treats that as a soft 404. [404 vs 410 vs redirect](https://getreport.app/guides/404-vs-410-vs-redirect-what-to-do-with-removed-pages) covers the choice, and the [out-of-stock fix page](https://getreport.app/learn/woocommerce-out-of-stock) has the WooCommerce steps.

> **Check: Out-of-stock products are handled.** A product page that says "out of stock" still ranks and still gets clicks, and every one of them bounces. If the product comes back, keep the page and say when; if it is gone for good, redirect it to its replacement or category, or noindex it.
>
> 1. Temporarily out of stock: keep the page indexable, show the expected date and a "notify me" button, and keep the Product schema's availability accurate.
> 2. Permanently gone: 301 to the closest product or the category (WooCommerce → Products → Trash plus a redirect rule), or set the page to noindex in your SEO plugin.

## 6. Product structured data

Product markup makes a product eligible for price, availability and review stars in results. Check one product of each type with a schema validator:

- **Required properties present** for Product and its Offer, such as the name, image and price, per Google's product structured data documentation, plus availability, which Google recommends.
- **Values match the visible page:** the same price, the same currency, the same stock state. Stale prices in the schema are a common result of caching.
- **One Product block per product.** A theme, an SEO plugin and a reviews app each printing their own gives Google two or three conflicting products.
- **Ratings only from reviews shown on the page.**

> **Check: Required schema properties.** Google shows a rich result (price, stars, breadcrumb, event date) only when the entity carries the properties it requires. Without them the block is valid but earns nothing in search.
>
> 1. Open the technical detail for the full list, one line per entity type and property.
> 2. Add each property to the JSON-LD block. In WooCommerce, Yoast or Rank Math this usually means filling in the price, image or author field on the item itself.

> **Check: Rich result eligibility.** Rich results (price, stars, breadcrumbs or event dates under your listing) make it bigger and earn more clicks than a plain blue link. An entity with missing required properties does not qualify.
>
> 1. Make every JSON-LD block parse first; Google ignores a block with a syntax error completely.
> 2. Then add the required properties Google lists for each type (the report names any that are missing); eligibility follows automatically.
> 3. Test the page with Google's Rich Results Test after the change.
> 4. FAQPage is not counted: Google stopped showing FAQ rich results for every site on 7 May 2026. The markup is still valid, but it earns no rich result.

> **Check: WooCommerce Product schema has price, availability and rating.** Google shows the price, stock state and stars in results only when the Product block carries offers.price, offers.availability and a rating. WooCommerce outputs them when the product has a price, stock management and reviews; a theme, builder or SEO plugin replacing the block often drops them.
>
> 1. Fill in the product's regular price and stock status; enable reviews if you have them. If an SEO plugin or builder outputs its own Product block, let WooCommerce's (or the plugin's, not both) be the single source.
> 2. Check the result in Google's Rich Results Test after saving.

[Product schema: price, availability and reviews](https://getreport.app/guides/product-schema-price-availability-reviews) shows the complete markup, including shipping, returns and variants.

## 7. Speed on product and category templates

Shops carry the heaviest pages on the web: large images, product grids, reviews, chat, tracking and recommendation scripts. Audit speed per template, not on the home page:

- **Product page:** the main image is usually the LCP element. It should be in the HTML, correctly sized and not lazy-loaded.
- **Category page:** a grid of 24 to 48 images. Only the first row should load eagerly; the rest lazy-load with width and height set to avoid layout shift.
- **Third-party scripts:** reviews, chat, personalisation and several analytics tags often cost more than the shop itself.

Google's Core Web Vitals thresholds are the target: LCP of 2.5 s or less, INP of 200 ms or less and CLS of 0.1 or less, at the 75th percentile of real visits. [Core Web Vitals for e-commerce product and category pages](https://getreport.app/guides/core-web-vitals-for-e-commerce-product-and-category-pages) goes template by template.

> **Check: Largest Contentful Paint.** LCP is when the biggest thing on screen — usually the hero image or headline — finishes loading. Visitors judge "is this site slow?" on it, and Google uses it for ranking.
>
> 1. Find the LCP element (named in your report) and make it lighter, earlier or both — a compressed WebP/AVIF, sized to the screen, without lazy loading.
> 2. Preload it with <link rel="preload" as="image"> or add fetchpriority="high" on the <img>.
> 3. Cut what comes before it — render-blocking CSS/JS and slow server responses push LCP back.

## 8. Cart, checkout, account and internal search

These pages have no value in search results. Keep them out:

- **Cart, checkout and account pages:** `noindex`, not in the sitemap. On WooCommerce they must also never be cached, or visitors see each other's carts.
- **Internal search results** (`/search?q=…`): `noindex`, and consider blocking the path in robots.txt if Googlebot spends many requests there. Spam searches linked from other sites can otherwise create indexed pages with your brand next to unwanted text.
- **Login and wishlist links:** fine to mark `rel="nofollow"`.

## How getReport checks it

> **Free tool:** [Free SEO checker and SEO audit for any page](https://getreport.app/tools/seo-audit): Free SEO audit of any page: titles, headings, canonical, robots.txt, sitemaps, indexability and broken links, each with a plain-language fix. No sign-up.

Run the report on a category page, a product page, an out-of-stock product and the home page. Each report checks indexability, the canonical, pagination links, breadcrumbs, image alt text and broken links, plus the structured data module (required properties and rich result eligibility) and the speed module with Core Web Vitals. On WooCommerce stores, the [WooCommerce checker](https://getreport.app/tools/woocommerce-checker) adds the Product schema fields, out-of-stock handling, cart fragments and whether the cart and checkout are cached. The [schema validator](https://getreport.app/tools/schema-validator) shows every structured data block on a product page.

To check many URLs at once, export the product URLs from your sitemap and paste up to 1,000 of them into the [bulk URL checker](https://getreport.app/tools/bulk-url-checker): it shows the status, redirect chain, canonical and `noindex` of each, which finds deleted products still in the sitemap and category paths that do not canonicalise. A full crawl of the shop is a funded unlock.

## Platform notes

**WooCommerce.** Check that out-of-stock products are handled on purpose (WooCommerce → Settings → Products → Inventory), that only one plugin prints Product schema, and that cart and checkout are excluded from the page cache. The [WooCommerce store checklist](https://getreport.app/guides/woocommerce-store-checklist) covers the speed side.

**Shopify.** Shopify generates canonicals, the sitemap and robots.txt. Products linked through collections (`/collections/shoes/products/runner-x`) canonicalise to `/products/runner-x`; check your theme links to the canonical URL directly. Filter URLs from Shopify's storefront filtering carry parameters, and robots.txt can be edited through the `robots.txt.liquid` template. See [Shopify: what you can fix and what you cannot](https://getreport.app/guides/shopify-what-you-can-and-cannot-fix).

**Magento and Adobe Commerce.** Layered navigation creates the most parameter URLs of any platform; check the "Use Categories Path for Product URLs" and canonical settings under Stores → Configuration → Catalog → Catalog → Search Engine Optimization.

## Common mistakes

- **Auditing the home page of a shop.** Categories and products bring the search traffic; audit their templates.
- **Indexing every filter combination.** Thousands of thin, near-duplicate pages compete with your categories.
- **Canonical from every paginated page to page 1.** Products deeper in the list stop being found.
- **Deleting sold-out products without a redirect,** or redirecting them all to the home page.
- **Schema prices that lag behind the page** after a sale starts or ends.
- **Manufacturer descriptions on every product.** The same text on hundreds of other shops gives Google little reason to pick yours.

## Questions people ask

### What is an ecommerce SEO audit?

An ecommerce SEO audit is a technical SEO audit of an online shop that adds the checks shops need: how filter, sort and parameter URLs are handled, whether each product has one canonical URL, how category pages and pagination are set up, what happens to out-of-stock products, and whether product structured data matches the visible price and availability. It ends in a prioritised list of template fixes.

### Should filter pages be indexed on an online shop?

Most should not. Sort orders and multi-filter combinations duplicate your categories and waste crawling, so canonicalise or block them. The exception is a filter people actually search for, such as a colour or a brand within a category. Give those a clean URL, their own title, H1 and short text, a self-referencing canonical and a link from the category.

### Should product variants have their own URLs?

They can, but they do not have to. One URL with a colour and size selector is simplest. Separate URLs per variant help when people search for a specific variant, such as a colour. Either way, be consistent: each variant URL needs its own title and canonical, or a canonical to the main product, and product variant structured data can describe the group.

### How do I audit SEO for a Shopify store?

Check the parts Shopify leaves to you: that the theme links to `/products/` URLs rather than collection paths, that product and collection titles and descriptions are unique, that filter parameters are not indexed, that apps do not add duplicate Product schema or slow scripts, and that sold-out products are handled on purpose. Shopify handles the sitemap, canonicals and robots.txt by default.
