# E-commerce SEO guide: site structure, filters, product pages and product data

> E-commerce SEO makes a store's categories and products crawlable and indexed once each: site structure, filter URLs, canonicals, product markup and stock.

- URL: https://computese.com/e-commerce-seo/
- Author: Duong Quan Nguyen, CEO, Computese
- Published: 2024-06-14
- Updated: 2026-09-25
- Topics: SEO, Web development

## In short
- E-commerce SEO is getting category and product pages crawled, indexed under one URL each and understood: link every product from crawlable category pages and give each product one canonical URL.
- Faceted navigation can generate endless filter URLs. Google recommends blocking filter URLs you do not need in search with robots.txt, and returning 404 for filter combinations with no results.
- Product pages need original copy, crawlable images and visible reviews, plus Product markup in the server HTML. Merchant listings require an Offer with a price above zero and a currency; add availability too.
- Add a Merchant Center feed alongside the markup: it lists products crawling might miss, is required for the Shopping tab, and powers free listings across Search, Images, Lens, Maps, YouTube and Gemini.
- Keep temporarily out-of-stock pages live and marked out of stock; 301 a discontinued product to a real successor, or return 404 or 410. Check the results in Search Console's Page indexing and Shopping reports.

E-commerce SEO is the work of getting an online store's category and product pages found, crawled, indexed once each and shown with accurate product data. In practice that means linking every product from crawlable category pages, keeping filter URLs from multiplying, giving each product one canonical URL, and describing it with structured data and a Merchant Center feed.

A store differs from a brochure site in scale and in how often it changes: filters, sort orders and variants multiply URLs, prices and stock move daily, and products are discontinued. This guide follows Google's own [ecommerce documentation](https://developers.google.com/search/docs/specialty/ecommerce), with notes for Shopify and WooCommerce; choosing the platform itself, with payments, accounting and email around it, is covered in [software tools for starting an online business](https://computese.com/software-tools-for-starting-an-online-business/). If crawling and indexing are new to you, read [how Google Search works](https://computese.com/how-google-search-engine-works/) first. Links and authority work for a store as they do for any site; [how Google determines a website's authority](https://computese.com/how-google-determines-a-website-authority/) covers them.

## What makes SEO for an online store different

A store is a handful of templates (home, category, product, cart) that together produce thousands or millions of URLs. Every filter, sort order, variant and tracking parameter can add another address for content Google has already seen. Google defines a site's crawl budget as the set of URLs it can and wants to crawl, and its [crawl budget guide](https://developers.google.com/crawling/docs/crawl-budget) is written for sites with over a million pages that change weekly, or over 10,000 pages that change daily. A catalogue of 10,000 products with daily price and stock changes already fits the second description.

So the first decision is which page types should be indexed, and which searches each one should answer:

| Page type                              | Searches it should answer                                  | Index it?                                       |
| -------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------- |
| Category (collection) page             | Broad product searches: "trail running shoes"              | Yes                                             |
| Filtered listing                       | Specific combinations: "waterproof trail running shoes"    | Only the few with real demand, as curated pages |
| Sorted listing (price, newest)         | None: the same products in another order                   | No                                              |
| Product page                           | Brand and model names, part numbers                        | Yes, under one canonical URL per product        |
| Buying guide or comparison             | Questions asked before buying: "how to choose trail shoes" | Yes, with links to categories and products      |
| Internal search results, cart, account | None                                                       | No                                              |

Google's [advice on ecommerce content](https://developers.google.com/search/docs/specialty/ecommerce/where-ecommerce-data-can-appear-on-google) matches this split: product descriptions that use the words shoppers search with, and category descriptions for less specific queries. Deciding which page answers which search is the same exercise as planning a topic cluster, which our [semantic SEO guide](https://computese.com/semantic-seo/) walks through step by step.

## Build a site structure that links to every product

Google works out what matters on a site from its links, not from its URL folders. According to its [site structure guidance](https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure), it considers how many links it has to follow to reach a page and how many links point to it; the more internal links a page has, the more important it looks relative to the rest of the site. For a store, that means four things:

1. **Link every product from browsable categories.** Menus link to categories, categories to subcategories, and subcategories to every product. Googlebot generally does not type into search boxes, so a product reachable only through on-site search may not be found by crawling at all. Where linking every product is impossible, list them in an XML sitemap or a Merchant Center feed.
2. **Use real links.** Navigation should be `<a href>` elements with meaningful anchor text, such as the product name. Googlebot may not detect navigation done with JavaScript events on other elements, and it does not click buttons.
3. **Promote what sells.** Link best sellers and priority categories from the home page, buying guides and other prominent pages. The extra internal links tell Google those pages matter more than the rest of the catalogue.
4. **Add breadcrumbs.** A visible trail (Home > Shoes > Trail running) adds links up the hierarchy on every product page, and [`BreadcrumbList` structured data](https://developers.google.com/search/docs/appearance/structured-data/breadcrumb) describes that hierarchy to Google, which shows breadcrumb rich results on desktop.

### Design URLs that crawl cleanly

Google's [URL guidance for ecommerce sites](https://developers.google.com/search/docs/specialty/ecommerce/designing-a-url-structure-for-ecommerce-sites) prevents two failures: different pages that Google treats as one, and one page it crawls again and again under different URLs. Most platforms already follow it, but check your theme, apps and custom code:

- Put descriptive words in paths: `/product/black-t-shirt-with-a-white-collar`, not `/product/3243`.
- If the server treats upper and lower case the same, convert every URL to one case.
- Use `?key=value` parameters (`?color=green`), not bare values (`?green`), and never repeat a parameter; combine the values instead (`?type=candy,sweet`).
- Keep session IDs, tracking codes and relative values such as `location=nearby` out of internal links.
- Never use fragments to show different content. Google ignores everything after `#`, so `/product/t-shirt#black` and `/product/t-shirt#white` are one page to it.
- Use exactly the same URL in internal links, sitemaps and `rel="canonical"` tags.

## Make category pages worth ranking

Category pages carry the broad searches, and they are often the thinnest pages on a store: a heading and a grid of products. Give each one enough text to help someone choose: what separates the products in it, sizing or compatibility notes, and links to subcategories and buying guides. A short introduction above the grid and more detail below it both work. A block of repeated keywords helps nobody.

Keep empty categories out of the index. Google recommends a `noindex` robots meta tag on a category that has no items, and a 404 status code if your site automatically removes empty categories from browsing and search.

### Paginate long categories

When a category holds more products than fit on one page, shoppers get numbered pages, a "load more" button or infinite scroll. Google's [pagination guidance](https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading) explains that its crawlers follow the URLs in the `href` of `<a>` elements and do not click buttons or trigger scripts that need a user action. Whichever pattern shoppers see, crawlers need paginated links behind it:

1. Link each page to the next one with an `<a href>`, and consider linking every page back to page one, which hints that page one is the best landing page.
2. Give each page its own URL, such as `?page=2`, and its own canonical URL. Do not point the canonical of pages 2 and onward at page one: they list different products.
3. Do not use fragments (`#page=2`) for page numbers. Google may skip the link, thinking it has already fetched that page.
4. Reuse the same title and description across the sequence if you like; Google says paginated pages do not need distinct titles.

Google no longer uses `rel="next"` and `rel="prev"` link elements, although other search engines may. Sorted versions of the same list (`?order=price`) should stay out of the index, with a `noindex` tag or a robots.txt rule.

## Keep faceted navigation from flooding the crawl

Faceted navigation, the filters for brand, colour, size, price and so on, is where a store's URL count usually gets out of hand. Google's [faceted navigation guide](https://developers.google.com/crawling/docs/faceted-navigation) notes that its most common implementation, URL parameters, can generate infinite URL spaces: a few filters with a handful of values each can produce more URLs than the store has products. The guide names two costs. Crawlers overcrawl, because they cannot tell a useless filter URL from a useful one without fetching it, and discovery slows down, because the time spent on filter URLs is not spent on new products.

![One category page branches through an orange locked gate into a pile of near-identical filtered pages; only two branches continue to clean pages marked with check marks.](https://computese.com/images/blog/e-commerce-seo/facets.4a23db67a8-1536.webp)

*Filters multiply URLs faster than products, so choose the few combinations worth a page and keep crawlers out of the rest.*

Google offers two routes, and a store can use both, for different facets.

**Facets you do not need in search: stop the crawl.** The most reliable method is robots.txt, leaving the unfiltered category and the product pages crawlable:

```text
User-agent: *
Disallow: /*?*color=
Disallow: /*?*size=
Disallow: /*?*price=
Disallow: /*?*sort=
```

Filters kept in the URL fragment (`#color=green`) stay out of the crawl too, since Google generally ignores fragments. A `rel="canonical"` from each filtered URL to the unfiltered page, or `rel="nofollow"` on filter links, is weaker: Google calls both generally less effective in the long term, and nofollow only works if every link to the URL carries it.

**Facets worth indexing: make them clean.** Some combinations match real searches, such as a brand within a category. Give those a stable URL, a unique title and a paragraph of copy, and link them from navigation like any other category. For facet URLs that stay crawlable, Google asks for three things:

- Separate parameters with `&`. Commas, semicolons and brackets are hard for crawlers to recognize as separators.
- If filters live in the path (`/shoes/trail/waterproof/`), keep their order fixed and never allow the same filter twice.
- Return a real 404 for combinations with no results, duplicate or nonsensical filters and page numbers past the end. Serve it at the URL that was requested; do not redirect to a shared "not found" page.

> [!IMPORTANT]
> `noindex` and robots.txt do different jobs. `noindex` keeps a URL out of the index, but Google still has to crawl the page to see the tag, which spends crawl budget. A robots.txt rule stops the crawl, but a blocked URL can still be indexed without its content when links point to it, and Google [never sees a `noindex`](https://developers.google.com/search/docs/crawling-indexing/block-indexing) on a page it is not allowed to fetch. Pick one per URL pattern.

## Write product pages that deserve to rank

Product pages carry the most specific searches, often a brand and a model number, and they compete with every other shop that sells the same item. What separates your page from theirs is information, not keywords.

### Descriptions

Manufacturer copy appears on every site that stocks the product. Google's guidance on [helpful content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) asks whether a page provides original information, and whether it avoids simply copying or rewriting its sources. Keep the manufacturer's specifications, then add what only you know: fit and sizing notes, compatibility, what is in the box, care instructions and answers to the questions customers ask your support team. Put the full product name, brand and model in the title and the `h1`, with the attribute that distinguishes this item, such as size, colour or capacity.

### Images

- Use `<img>` elements with a `src` attribute, including inside `<picture>`. Google's [image guidelines](https://developers.google.com/search/docs/appearance/google-images) are explicit that it does not index images set in CSS.
- Give files short, descriptive names (`trail-shoe-blue-side.jpg`, not `IMG_0042.jpg`) and write alt text that describes what the photo shows.
- Provide several high-resolution photos. For product markup, Google recommends images of at least 50,000 pixels (width multiplied by height) in 16:9, 4:3 and 1:1 aspect ratios, and the image URLs must be crawlable and indexable.

### Reviews

Customer reviews help shoppers decide and can add star ratings to your results, under [rules Google enforces](https://developers.google.com/search/docs/appearance/structured-data/review-snippet):

- The reviews and the aggregate rating you mark up must be visible on the page.
- They must be about this specific product, not a category or a list of products.
- Do not aggregate reviews or ratings from other websites.
- No fake reviews, and no reviews given in exchange for money, discounts or free products without clear disclosure.

Google's restriction on self-serving reviews applies to pages that review your own business with `LocalBusiness` or `Organization` markup, not to customers' reviews of the products you sell.

### Shipping and returns

State shipping costs, delivery times and the return policy on the product page, or one click from it. Google lists clear shipping and return policies among the things that build shopper trust, and merchant listings can show both next to your products.

## Handle variants and duplicate URLs with canonicals

On most stores the same product page is reachable at several URLs: with tracking parameters from ads and email (`?gclid=`), through category paths, with a variant preselected, in different letter case. Google groups duplicates and picks one canonical URL to show. You steer that choice with [signals that add up](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls):

| Signal                                         | Strength | Use it for                                                           |
| ---------------------------------------------- | -------- | -------------------------------------------------------------------- |
| 301 redirect                                   | Strong   | Duplicate URLs you are retiring                                      |
| `rel="canonical"` link element or HTTP header  | Strong   | Duplicates that stay reachable: parameters, variants, category paths |
| Listing only canonical URLs in the XML sitemap | Weak     | Supporting the other two                                             |

Put a self-referencing canonical on every indexable page, link internally to canonical URLs only, and never let signals disagree, such as a sitemap listing one URL and the canonical naming another. Set the canonical in the HTML source and do not let JavaScript change it. Do not use robots.txt or `noindex` to choose a canonical: a blocked duplicate can still be indexed without its content, and `noindex` removes the page from Search entirely.

### Product variants

Variants (sizes, colours, materials) are the duplicate problem no store can avoid, and Google's [product variant documentation](https://developers.google.com/search/docs/appearance/structured-data/product-variants) sets specific rules for them:

- Every variant needs a URL that preselects it: the right image, price and availability, and an add-to-cart that adds that variant. A path segment (`/t-shirt/green`) or a query parameter (`/t-shirt?color=green`) both work.
- When all variants live on one page and are selected with query parameters, the base URL without parameters (`/coat`) is the single canonical for the whole group.
- When variants are split across pages (`/coat/lightblue`, `/coat/green`), there is no single canonical for the group, and each page carries complete markup for the variants it shows.
- Mark the group up with `ProductGroup`: a `productGroupID` for the parent, `variesBy` for the attributes that change (`https://schema.org/size`, `https://schema.org/color`) and `hasVariant` listing each variant as a `Product` with its own unique `sku` or `gtin`. In a Merchant Center feed, the same grouping is the `item_group_id` attribute, identical across the variants, as the [product data specification](https://support.google.com/merchants/answer/7052112) describes.

![Four small copies of the same product page, differing only by a tag or a link symbol, each send an arrow to one larger product page marked with an orange star, the canonical URL.](https://computese.com/images/blog/e-commerce-seo/canonical.bd5b282251-1536.webp)

*Duplicate URLs are normal on a store; what matters is that links, sitemaps and markup all name the same canonical.*

## Add product structured data for merchant listings

Structured data states exactly what a product page offers: name, price, currency, availability and identifiers. Google [splits product markup](https://developers.google.com/search/docs/appearance/structured-data/product) into two uses:

- **Product snippets**, for pages where the product cannot be bought directly, such as editorial reviews.
- **Merchant listings**, for pages where a shopper can buy from you. These feed the shopping knowledge panel, popular products, Google Images and product snippets, with price, availability, shipping and returns.

A product page that meets the merchant listing requirements is generally eligible for product snippets as well. The [merchant listing rules](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing) that matter:

1. **Required properties.** `name`, `image` and `offers`. Merchant listings need an `Offer` with a `price` above zero and a `priceCurrency` in three-letter ISO 4217 format. Product snippets also accept `AggregateOffer`; merchant listings do not.
2. **Recommended properties.** `availability` (one value), the most specific `gtin` that applies, `brand.name`, `sku`, `itemCondition`, and `aggregateRating` and `review` where you have them. Google recommends declaring your store-wide shipping and return policies once, under `Organization` markup, and using `shippingDetails` or `hasMerchantReturnPolicy` on an offer only to override them.
3. **One product per page.** Markup belongs on product pages, not on category listings. A product sold in several currencies needs a separate URL for each currency.
4. **Server HTML.** Google recommends putting product markup in the initial HTML. Markup generated by JavaScript can make Shopping crawls less frequent and less reliable, which hurts the data that changes fastest: price and availability.

A minimal example for a product page:

```html
<script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Trail running shoe, blue, size 10",
    "image": [
      "https://example.com/photos/1x1/trail-shoe-blue.jpg",
      "https://example.com/photos/4x3/trail-shoe-blue.jpg",
      "https://example.com/photos/16x9/trail-shoe-blue.jpg"
    ],
    "description": "Lightweight trail running shoe with a rock plate and a gusseted tongue.",
    "sku": "TR200-BLU-10",
    "brand": { "@type": "Brand", "name": "ExampleBrand" },
    "offers": {
      "@type": "Offer",
      "url": "https://example.com/products/trail-shoe?color=blue&size=10",
      "price": 129.0,
      "priceCurrency": "CAD",
      "availability": "https://schema.org/InStock",
      "itemCondition": "https://schema.org/NewCondition"
    }
  }
</script>
```

Validate each template with the Rich Results Test, check a live product with the URL Inspection tool, then watch the Shopping reports in Search Console after every release.

## Send your catalogue to Google Merchant Center

Structured data describes the products Google finds by crawling. A Merchant Center feed tells Google about your products directly. Google [recommends doing both](https://developers.google.com/search/docs/specialty/ecommerce/share-your-product-data-with-google), for reasons that matter to stores:

- Crawling is not guaranteed to find every product; a feed lists them all.
- You control the timing. Feeds can update weekly, daily or hourly, while Google does not guarantee how quickly it processes changes it finds by crawling.
- A feed can carry data your pages do not show, such as inventory by physical store.
- Merchant Center is required to appear in the Shopping tab.

[Free listings](https://support.google.com/merchants/answer/13889434) are the unpaid side of Merchant Center. Eligible products can appear at no cost on Google Search, the Shopping tab, Google Images, Google Lens, Google Maps, YouTube and Gemini, and new Merchant Center accounts are opted in by default. Free listings bring shoppers to product pages, not to your home page, policy pages or category pages. In many countries, including Canada, the United States, the United Kingdom, Australia, Germany and Japan, you also need shipping settings in Merchant Center or shipping costs in the feed.

There are four ways to get products in:

| Method                            | Fits                                  | Keep in mind                                                                                                                                    |
| --------------------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Found automatically on your store | Smaller catalogues that change rarely | [Google reads your structured data](https://support.google.com/merchants/answer/12158480); a product you also upload replaces the copy it found |
| Uploaded feed file                | Most stores                           | Schedule it at least as often as prices and stock change; titles are limited to 150 characters, descriptions to 5,000                           |
| Platform integration              | Shopify and WooCommerce stores        | Shopify's Google & YouTube channel and the Google for WooCommerce extension sync products for you                                               |
| Merchant API                      | Large or fast-changing catalogues     | The Content API for Shopping [was sunset on August 18, 2026](https://developers.google.com/merchant/api); the Merchant API replaces it          |

### Keep the page, the markup and the feed in agreement

Merchant Center checks your feed against your landing pages. For [availability](https://support.google.com/merchants/answer/6324448), the value must match across the landing page, the structured data, the checkout and the data source, and a mismatch in any one of them gets the product disapproved.

![A product page and a product feed sheet both send arrows to an orange balance scale, which weighs their price tags before a product card with a check mark appears in a search results window.](https://computese.com/images/blog/e-commerce-seo/sync.6411bf8b19-1536.webp)

*Google checks your feed against your pages, and a price or stock mismatch can get a product disapproved.*

[Automatic updates](https://support.google.com/merchants/answer/12157888) narrow the gap between feed uploads. When they are on (the default), Google corrects price, sale price, availability and condition from your pages' structured data when it finds a mismatch. They are a safety net, not a replacement for frequent feed updates: Google warns they may not work for products whose price or availability changes more than once a day, and such products can be disapproved instead of updated.

## Handle out-of-stock and discontinued products

Stock changes are routine on a store, and each state needs a different response from the URL, the markup and the feed:

| Situation                      | What the URL does                                                  | Structured data availability                          | Merchant Center                                                                    |
| ------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Temporarily out of stock       | Stays live (200) with its content, a restock date and alternatives | `OutOfStock`, or `BackOrder` if you still take orders | `out_of_stock`, or `backorder` with an `availability_date`; do not delete the item |
| Not yet released               | Live (200), with the release date visible                          | `PreOrder`                                            | `preorder` with an `availability_date`                                             |
| Discontinued, with a successor | 301 redirect to the successor product                              | Removed with the page                                 | Remove the item                                                                    |
| Discontinued, no successor     | 404 or 410, with internal links to it removed                      | Removed with the page                                 | Remove the item                                                                    |
| Category with no products      | `noindex`, or 404 if the site removes it automatically             | None                                                  | Not applicable                                                                     |

Keep a temporarily unavailable product live. Google [drops URLs that return a 4xx status code](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes) from its index, so a 404 on a product that is back next month means it has to be crawled and indexed again when stock arrives. In Merchant Center, deleting an item is also slow to undo: Google says adding an offer back after deletion takes a significant amount of time, so mark it `out_of_stock` instead.

Keep the page's content, too. A product page stripped down to "sold out" risks being treated as a [soft 404](https://developers.google.com/search/docs/crawling-indexing/troubleshoot-crawling-errors): a URL that returns 200 but looks like an error or an empty page. Google excludes those from Search and lists them in Search Console. A page that keeps its description, specifications and reviews, says when stock returns and links to alternatives does not look like an error.

When a product is gone for good, a 301 to a real successor, such as the next model of the same product, sends shoppers and signals to the right place. Without a successor, return 404 or 410. Google treats the two the same: the URL leaves the index, and Google crawls it less and less often over time.

> [!WARNING]
> Do not bulk-redirect discontinued products to the home page or any other page that is not a real replacement. Google's [site move guidance](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes) says redirecting many old URLs to one irrelevant destination can be treated as a soft 404, and shoppers who clicked a specific product land on a page that does not answer their search.

## Keep product and category templates fast

Core Web Vitals measure what shoppers experience on real devices, and Google says good scores [align with what its core ranking systems seek to reward](https://developers.google.com/search/docs/appearance/core-web-vitals). The three metrics and their "good" thresholds, measured at the 75th percentile of page loads on mobile and desktop, from [web.dev](https://web.dev/articles/vitals):

| Metric                          | What it measures on a store                                              | Good                     |
| ------------------------------- | ------------------------------------------------------------------------ | ------------------------ |
| Largest Contentful Paint (LCP)  | Loading: when the main content, often the product photo, appears         | 2.5 seconds or less      |
| Interaction to Next Paint (INP) | Responsiveness to taps and clicks: filters, variant pickers, add to cart | 200 milliseconds or less |
| Cumulative Layout Shift (CLS)   | Visual stability: whether the page jumps while it loads                  | 0.1 or less              |

INP replaced First Input Delay as a Core Web Vital in 2024. Stores usually lose these metrics in three places:

- **LCP and the product photo.** Never lazy-load the main product image: [web.dev's LCP guide](https://web.dev/articles/optimize-lcp) says a lazy-loaded LCP image always adds unnecessary delay. Give it `fetchpriority="high"`, on one or two images per page at most, because a high priority on many images stops helping.
- **CLS and late content.** Images without `width` and `height`, and review widgets, banners and embeds injected after load, are [common causes of layout shift](https://web.dev/articles/optimize-cls). Set image dimensions and reserve space for anything that arrives later.
- **INP and third-party scripts.** Review widgets, chat, personalization and tag managers all run JavaScript, and scripts busy on the main thread [delay the response to a tap](https://web.dev/articles/optimize-inp). Test the filters, the variant picker and the add-to-cart button on a mid-range phone.

Search Console's [Core Web Vitals report](https://support.google.com/webmasters/answer/9205520) uses field data from real users and groups similar pages, so a slow product template shows up as one group of URLs rather than thousands of separate problems. Fix the template and every product that uses it improves. Our [web design and development](https://computese.com/services/web-design-development/) team builds with Core Web Vitals budgets enforced in CI and Schema.org structured data per template.

## Platform notes: Shopify, WooCommerce and custom builds

Platforms handle the basics and leave the decisions in this guide to you. Each has a full guide of its own: [Shopify SEO](https://computese.com/shopify-seo/) and [WordPress SEO](https://computese.com/wordpress-seo/), which covers WooCommerce's underlying settings. How AI shopping and agent checkout change the rest of the store is in [the future of e-commerce](https://computese.com/the-future-of-ecommerce-business/).

### Shopify

- Every store [generates `sitemap.xml` automatically](https://help.shopify.com/en/manual/promoting-marketing/seo/find-site-map), linking products, primary product images, pages, collections and blog posts. Submit it in Search Console. Current Shopify themes also include product structured data (price, availability, reviews) by default.
- Shopify ships a default robots.txt. To change it, add a [`robots.txt.liquid` template](https://help.shopify.com/en/manual/promoting-marketing/seo/editing-robots-txt) and edit the rules with Liquid, which keeps Shopify's future updates. Replacing it with plain text is strongly discouraged, and Shopify Support does not help with edits to the file.
- The [`structured_data` Liquid filter](https://shopify.dev/docs/api/liquid/filters/structured_data) outputs a product as a `Product`, or as a `ProductGroup` when it has variants.
- The [`within` filter](https://shopify.dev/docs/api/liquid/filters/within) builds collection-aware product URLs such as `/collections/sale/products/trail-shoe`. Shopify's own documentation warns that these show the same content as the standard product URL; link product grids to the standard URL and check the canonical your theme prints.
- The [Google & YouTube sales channel](https://help.shopify.com/en/manual/online-sales-channels/marketplaces/google), managed by Google, syncs products to Merchant Center.

### WooCommerce

- With pretty [permalinks](https://woocommerce.com/document/permalinks/) on, product URLs default to `/product/<name>` and category URLs to `/product-category/<name>`. The "Shop base with category" option adds the category to product URLs. Decide before launch: changing the base later changes every product URL, and each old URL then needs a 301.
- WordPress has generated a [sitemap at `/wp-sitemap.xml`](https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/) since version 5.5, covering public post types and taxonomies. The WordPress settings that decide what gets indexed, from permalinks to archives, are in our [WordPress SEO guide](https://computese.com/wordpress-seo/).
- WooCommerce core [prints `Product` JSON-LD](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/includes/class-wc-structured-data.php) on product pages. For a variable product whose variations have different prices, it describes the parent with an `AggregateOffer` price range, which product snippets accept and merchant listings do not. Test variable products in the Rich Results Test.
- The [Out Of Stock Visibility setting](https://woocommerce.com/document/configuring-woocommerce-settings/products/) hides out-of-stock items from the catalogue, which also removes the category links to them. For short stock gaps, leaving products visible and marked out of stock keeps them linked.
- The [Google for WooCommerce](https://woocommerce.com/products/google-listings-and-ads/) extension syncs product data to Merchant Center.

### Custom and headless builds

A custom or [headless storefront](https://computese.com/headless-cms/), in Next.js or anything else, owns every rule in this guide. Render product markup, canonical tags and category links in the server HTML, return real 404 and 301 status codes from the server rather than from client-side routing, and test each template with URL Inspection before launch.

## Measure e-commerce SEO in Search Console and Merchant Center

Read the reports by page type and template, not one URL at a time.

**Page indexing report.** The [statuses](https://support.google.com/webmasters/answer/7440203) that matter most on a store:

| Status                                                | What it means                                                              | What to check                                                        |
| ----------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| Duplicate, Google chose different canonical than user | Google indexed a different URL from the one your canonical names           | Variant and parameter canonicals; whether links and sitemaps agree   |
| Duplicate without user-selected canonical             | Duplicates with no canonical declared; Google chose one                    | Add `rel="canonical"` to the template                                |
| Discovered - currently not indexed                    | Google found the URL but postponed the crawl to avoid overloading the site | Crawl spent on filter and sort URLs; server response times           |
| Crawled - currently not indexed                       | Google crawled the page but has not indexed it                             | Thin or near-duplicate product and category copy                     |
| Soft 404                                              | The page returned 200 but looks like an error                              | Out-of-stock pages stripped of content; empty categories and filters |

**Shopping reports.** Under Shopping in Search Console, the Merchant listings and Product snippets [rich result reports](https://support.google.com/webmasters/answer/7552505) count valid and invalid product items (items, not pages) and the issues behind them. Check them after every template release: a fall in valid items without a rise in invalid ones often means the markup stopped being output.

**Performance report.** Group by [Search appearance](https://support.google.com/webmasters/answer/7576553) to separate clicks from rich product results, and by page to compare category and product templates.

**URL Inspection.** For a single product, it shows the canonical Google selected and the rendered page, which tells you whether markup and links survive rendering.

**Merchant Center.** The Needs attention tab on the Products page lists items with problems, and the Performance page can be filtered to free listings to show what unpaid listings bring in.

If you want a second pair of eyes on all of this, our [SEO service](https://computese.com/services/seo/) starts with a technical audit of crawling, rendering, indexing, speed and structured data, covers canonicals, parameters and product and merchant markup, and reports from Search Console, server logs and field data.

## Key terms
- **Faceted navigation**: Filters on a listing page (brand, colour, size, price) that change which products are shown. When each combination gets its own URL, a store can produce far more URLs than it has products.
- **Crawl budget**: The set of URLs Google can and wants to crawl on a site. It matters most on large or fast-changing sites, and filter and sort URLs are a common way to waste it.
- **Canonical URL**: The one URL you want indexed for a set of duplicate or near-duplicate pages, signalled with redirects, rel="canonical" and sitemap inclusion. Google treats these as signals and makes the final choice.
- **Product variant**: One version of a product that differs by attributes such as size or colour. Google groups variants with ProductGroup markup (productGroupID, variesBy, hasVariant); Merchant Center uses item_group_id.
- **Merchant listing**: Google's shopping results built from pages where a shopper can buy from you, such as the shopping knowledge panel and popular products. They need Product markup with an Offer, a price above zero and a currency.
- **Product snippet**: A search result enhanced with product details such as ratings, price and availability. Unlike merchant listings, it also covers pages where the product cannot be bought, such as editorial reviews.
- **Google Merchant Center**: Google's service for sending product data through uploaded feeds, platform integrations, automatic website crawling or the Merchant API. It is required for the Shopping tab and controls free listings.
- **Free listings**: Unpaid product listings built from Merchant Center data that can appear on Google Search, the Shopping tab, Images, Lens, Maps, YouTube and Gemini.
- **Soft 404**: A URL that returns 200 (success) but shows an error, an empty page or almost no main content. Google excludes such pages from Search and lists them in Search Console's Page indexing report.
- **Core Web Vitals**: Google's three field metrics for page experience: Largest Contentful Paint (loading), Interaction to Next Paint (responsiveness) and Cumulative Layout Shift (visual stability).

## Common questions

### What is e-commerce SEO?

E-commerce SEO is search engine optimization for online stores: making category and product pages crawlable, indexed under one URL each and clearly described to Google, with structured data and a Merchant Center feed. It differs from SEO for other sites mainly in scale, because filters, variants and stock changes create far more URLs to manage.

### Should I noindex or delete out-of-stock product pages?

Not if the product is coming back. Keep the page live with its description, mark it out of stock in the structured data and the feed, and suggest alternatives, so it does not look like an empty error page. Only a product that is gone for good should redirect to its successor with a 301, or return 404 or 410 when there is none.

### How do I stop faceted navigation from creating duplicate content?

Decide which filter combinations deserve an indexable page, usually the few that people actually search for, and give those clean URLs and their own copy. Block crawling of the remaining filter and sort parameters in robots.txt, and return 404 for combinations with no results. Google describes rel="canonical" and nofollow as generally less effective for this in the long term.

### Do I need Google Merchant Center if my product pages already have structured data?

Not to appear in ordinary search results, but you do for the Shopping tab, and Google recommends using both. A feed tells Google about products its crawler might miss and updates price and stock on your schedule, while the markup helps Google check the feed against your pages.

### Can I use the manufacturer's product descriptions?

You can, but every other retailer can too, so the text gives Google no reason to prefer your page. Keep the specifications and add what only you know: fit and sizing notes, compatibility, what is in the box, your own photos and answers to the questions customers ask your support team.

### Does Shopify or WooCommerce handle e-commerce SEO for me?

They handle the basics. Shopify generates a sitemap, a default robots.txt and product markup in its themes; WordPress has generated its own sitemap since version 5.5 and WooCommerce prints Product markup on product pages. Neither decides which filter pages deserve indexing, writes original product copy or chooses what happens to discontinued products.

## Sources
1. [Best practices for ecommerce sites in Google Search](https://developers.google.com/search/docs/specialty/ecommerce), Google Search Central
2. [Crawl budget management](https://developers.google.com/crawling/docs/crawl-budget), Google Crawling Infrastructure
3. [Where ecommerce content can appear on Google](https://developers.google.com/search/docs/specialty/ecommerce/where-ecommerce-data-can-appear-on-google), Google Search Central
4. [Help Google understand your ecommerce website structure](https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure), Google Search Central
5. [Breadcrumb (BreadcrumbList) structured data](https://developers.google.com/search/docs/appearance/structured-data/breadcrumb), Google Search Central
6. [Designing a URL structure for ecommerce websites](https://developers.google.com/search/docs/specialty/ecommerce/designing-a-url-structure-for-ecommerce-sites), Google Search Central
7. [Pagination, incremental page loading, and their impact on Google Search](https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading), Google Search Central
8. [Managing crawling of faceted navigation URLs](https://developers.google.com/crawling/docs/faceted-navigation), Google Crawling Infrastructure
9. [Block Search indexing with noindex](https://developers.google.com/search/docs/crawling-indexing/block-indexing), Google Search Central
10. [Creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content), Google Search Central
11. [Image SEO best practices](https://developers.google.com/search/docs/appearance/google-images), Google Search Central
12. [Review snippet (Review, AggregateRating) structured data](https://developers.google.com/search/docs/appearance/structured-data/review-snippet), Google Search Central
13. [How to specify a canonical URL with rel="canonical" and other methods](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls), Google Search Central
14. [Product variant structured data (ProductGroup, Product)](https://developers.google.com/search/docs/appearance/structured-data/product-variants), Google Search Central
15. [Product data specification](https://support.google.com/merchants/answer/7052112), Google Merchant Center Help
16. [Introduction to Product structured data](https://developers.google.com/search/docs/appearance/structured-data/product), Google Search Central
17. [Merchant listing (Product, Offer) structured data](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing), Google Search Central
18. [Share your product data with Google](https://developers.google.com/search/docs/specialty/ecommerce/share-your-product-data-with-google), Google Search Central
19. [Free listings for products](https://support.google.com/merchants/answer/13889434), Google Merchant Center Help
20. [Add products automatically from your online store](https://support.google.com/merchants/answer/12158480), Google Merchant Center Help
21. [Merchant API](https://developers.google.com/merchant/api), Google for Developers
22. [Availability [availability]](https://support.google.com/merchants/answer/6324448), Google Merchant Center Help
23. [Allow Merchant Center to update product information automatically](https://support.google.com/merchants/answer/12157888), Google Merchant Center Help
24. [How HTTP status codes affect Google's crawlers](https://developers.google.com/crawling/docs/troubleshooting/http-status-codes), Google Crawling Infrastructure
25. [Troubleshoot Google Search crawling errors](https://developers.google.com/search/docs/crawling-indexing/troubleshoot-crawling-errors), Google Search Central
26. [Site moves and migrations](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes), Google Search Central
27. [Understanding Core Web Vitals and Google search results](https://developers.google.com/search/docs/appearance/core-web-vitals), Google Search Central
28. [Web Vitals](https://web.dev/articles/vitals), web.dev (Google Chrome)
29. [Optimize Largest Contentful Paint](https://web.dev/articles/optimize-lcp), web.dev (Google Chrome)
30. [Optimize Cumulative Layout Shift](https://web.dev/articles/optimize-cls), web.dev (Google Chrome)
31. [Optimize Interaction to Next Paint](https://web.dev/articles/optimize-inp), web.dev (Google Chrome)
32. [Core Web Vitals report](https://support.google.com/webmasters/answer/9205520), Search Console Help
33. [Finding and submitting your sitemap](https://help.shopify.com/en/manual/promoting-marketing/seo/find-site-map), Shopify Help Center
34. [Editing robots.txt.liquid](https://help.shopify.com/en/manual/promoting-marketing/seo/editing-robots-txt), Shopify Help Center
35. [Liquid filters: structured_data](https://shopify.dev/docs/api/liquid/filters/structured_data), Shopify Developers
36. [Liquid filters: within](https://shopify.dev/docs/api/liquid/filters/within), Shopify Developers
37. [Google & YouTube](https://help.shopify.com/en/manual/online-sales-channels/marketplaces/google), Shopify Help Center
38. [Permalinks](https://woocommerce.com/document/permalinks/), WooCommerce
39. [New XML Sitemaps Functionality in WordPress 5.5](https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/), Make WordPress Core
40. [class-wc-structured-data.php (WooCommerce source code)](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/includes/class-wc-structured-data.php), WooCommerce on GitHub
41. [Configuring WooCommerce settings: Products](https://woocommerce.com/document/configuring-woocommerce-settings/products/), WooCommerce
42. [Google for WooCommerce](https://woocommerce.com/products/google-listings-and-ads/), WooCommerce
43. [Page indexing report](https://support.google.com/webmasters/answer/7440203), Search Console Help
44. [Rich result report overview](https://support.google.com/webmasters/answer/7552505), Search Console Help
45. [Performance report (Search results): overview and basic setup](https://support.google.com/webmasters/answer/7576553), Search Console Help
