E-Commerce SEO: Mechanics of Product and Category Pages
Quick answer. E-commerce SEO is the work of making product and category pages crawlable, comparable and quotable. In practice that means one indexable URL per product or category, complete Product structured data with price and availability, faceted URLs that are deliberately indexed or blocked, unique copy where buying questions are asked, and a feed that matches the page. Measure it by organic revenue per landing-page template.
What matters most
- Every distinct product or category needs one indexable URL; the rest of the catalogue’s URLs exist to be crawled or ignored, not indexed.
- Faceted navigation should be decided one facet at a time — a few deserve their own page and copy, the majority exist only for shoppers.
- Feed parity is an SEO control: price and availability that differ between the merchant feed and the landing page cost visibility in shopping surfaces.
- Category copy wins the broad query and product data wins the specific one; neither substitutes for the other.
- Organic revenue per landing-page template is a more honest measure than average position across a keyword set.
What does e-commerce SEO actually control on a product page?
Most of a product page’s organic performance is decided in the template and the data, not the design. The URL, the title, the H1, the canonical, the structured data block and the internal links pointing at the page do the work. A merchandiser who can change those five things can move organic revenue without touching a stylesheet. This is the layer e-commerce SEO works on, and it is largely the same across Shopify, BigCommerce, Adobe Commerce and headless builds.
Structured data is where product pages fail quietly. Google’s Product markup expects name, image, and offers with price and priceCurrency, plus availability. Brand, sku, gtin13 or mpn, itemCondition, shippingDetails and hasMerchantReturnPolicy make the listing more useful. Every field must describe what the page shows. Two JSON-LD blocks on one template — one from the theme, one from an app — is the most common cause of a mismatch. A hard-coded price that nobody updates is the second.
Reviews are the other trap. An aggregateRating needs ratings collected from customers; self-serving reviews breach Google’s review snippet policy and can cost the page its rich result entirely. If you syndicate reviews from a third party, confirm the markup matches reviews a shopper can actually see.
Variants need a decision. Google supports ProductGroup and hasVariant markup to describe several variants on one URL. Where that is not implemented, one URL per variant with a self-referencing canonical still works, provided colour and size variants do not chase the same query with identical copy.
- gtin13, mpn or sku — whichever your buyers and Google can reconcile
- availability, including pre-order and back-order states
- price and priceCurrency, matching the buy box for the default variant
- itemCondition and priceValidUntil, where you use them
- shippingDetails and hasMerchantReturnPolicy, mirroring the delivery page
- review markup, including whether a widget injects a second aggregateRating
Where to go next
- e-commerce SEO across Shopify, BigCommerce, Adobe Commerce and headless storefronts
- conversion rate optimisation on the same category and product templates
- analytics and attribution for template-level reporting
- platform configuration for catalogue SEO
What should happen to a product page when the SKU stops selling?
Three cases, three answers. Out of stock is temporary: keep the URL live, set availability to OutOfStock in both the page and the markup, and leave it indexable. The page still answers research queries and still passes internal links to related products.
Discontinued with an obvious successor is a redirect. Send the old URL to the replacement product with a 301, not to the parent category. The buyer asked for a specific thing and the replacement is the closest match.
Discontinued with no successor is the hard case. A 301 to the parent category is acceptable. So is a stripped page that states the product is gone and links to three alternatives, which keeps the inbound links and the query relevance. What does not work is a 200 response that reads like an error page; Google may classify it as a soft 404 anyway. Do not noindex the URL and leave it live either — you pay the crawl cost and get nothing back.
Resist bulk-deleting thousands of URLs after a range change. Check organic sessions and inbound links first, then redirect in descending order of traffic.
How do faceted URLs get out of hand, and what actually fixes them?
Every filter a shopper can combine is a URL a crawler can find. A category with six attributes of five values each is not one page; it is thousands. Left alone, Googlebot spends its crawl on permutations and the pages that matter get crawled less often.
The fix is a per-facet decision, not a global rule. Ask three questions of each facet: do people search for it as a phrase, does it hold enough products to fill a page, and does it stay stable for a quarter? Facets that pass all three become indexable landing pages with their own H1 and copy. The rest stay available to shoppers without being pushed into the index.
Then pick the control deliberately. A canonical is a hint, so it will not always stop a URL being indexed. noindex, follow requires the page to be crawlable, so it still costs requests. robots.txt disallow stops crawling but not indexing, and a disallowed URL that other pages link to can still appear in results with no description. Google no longer offers a URL parameters tool, so the control has to live in your templates.
Where that control sits depends on the platform. Shopify’s Search and Discovery filters, BigCommerce’s faceted search settings, Adobe Commerce’s layered navigation attributes and WooCommerce’s attribute archives each expose different switches, and platform configuration decides more of this than any content edit.
| Facet or URL pattern | Example | Treatment | Reason |
|---|---|---|---|
| Single attribute with search demand | /shoes/black | Indexable, self-canonical, own H1 and copy | It can rank for a real query; a duplicate version cannot |
| Stacked or multi-select filters | /shoes/black?size=10&width=wide | Canonical to the single-facet URL, or noindex, follow | Combinations multiply and only a few earn traffic |
| Sort, view and session parameters | ?sort=price_asc | Disallow in robots.txt | No unique content; crawling them wastes requests |
| Price range and slider URLs | ?price=50-100 | Disallow or noindex | Ranges produce near-infinite near-duplicates |
| Internal search result pages | /search?q=running+shoes | noindex, follow; block only if crawl volume becomes a problem | Generated, unstable and rarely useful in the index |
Why does internal search produce better SEO input than a keyword tool?
Your site search is a list of phrases customers typed with buying intent, in their own words, against your catalogue. It costs nothing to collect and it is more specific than an external keyword tool, because you can see whether the query returned anything.
Two uses follow. First, merchandising: zero-result queries mean a missing synonym, a missing product or a missing filter. Second, copy: the phrases people type belong in category H1s, in facet labels and in the paragraphs that explain a range. A support ticket asking whether a part fits a specific model is a paragraph waiting to be written.
The SEO treatment of the search results page itself is simple — noindex, follow. Raw search URLs are unstable, thin and effectively infinite. The exception is a deliberate landing page built from a high-volume query: that is a curated template with fixed copy, links and a canonical, not the live search URL. On Shopify, WooCommerce and BigCommerce the query parameter pattern is what you keep out of the index, not the search box.
What makes category copy earn its place on the page?
Category pages compete for the short, broad query; product pages compete for the specific one. That division of labour is the whole argument for category copy. A grid of sixty products with a five-word introduction gives a search engine nothing to understand the range by, and gives the shopper nothing either.
Useful category copy does three jobs. It states the range — what is in it and what is deliberately not. It answers questions the support team already answers: fitment, sizing, compatibility, delivery. And it uses the vocabulary from internal search and facet labels, which is the vocabulary buyers type.
Place the two most useful sentences above the grid and put the rest below it. Keep the top of the page for the range statement and the buying criteria. Content in tabs and accordions is readable by crawlers, but shoppers often never open it, and the same templates carry your conversion rate optimisation work.
The failure mode is one template paragraph repeated across forty categories with the category name swapped. That is duplication at scale and it is worse than no copy. Write fewer categories properly; leave the long tail to product data and facets.
Why does the product feed matter to organic search?
The feed and the page describe the same product to two different systems, and they have to agree. Google checks that price and availability in a merchant feed match the landing page; a mismatch produces item warnings, disapprovals or worse. The same fields — price, availability, condition, identifier — power the Product markup on the page.
Feed titles and page H1s do different jobs. A feed title is written to match a query and is length-capped; an H1 is written for a shopper already on the page. Keep them different where it helps the buyer, but never let price, availability or the landing URL drift between them.
One rule prevents most incidents: the feed’s link attribute should point at the canonical URL, not a tracking variant or a variant parameter. If the feed points somewhere that canonicalises elsewhere, Google is reconciling two pages for one product.
Feeds are also a cheap content audit. If the feed description for a SKU reads better than the on-page description, the page is the weak link.
How do you measure e-commerce SEO without fooling yourself?
Report by template, not by keyword. Group landing pages into product, category, facet landing page, internal search and editorial, then track organic sessions, revenue and revenue per session for each group. A catalogue can grow organic sessions while revenue per session falls, because the new traffic lands on thin facet pages.
Search Console supplies the other half: index coverage by template using a page grouping pattern, crawl requests per template, and queries by page. It retains sixteen months of performance data and samples what it presents, so treat small week-on-week movements as noise.
Set the baseline before you ship, and change one template at a time. Catalogue-wide changes — a new theme, a new filter app, new canonical rules — land together and cannot be separated afterwards. If you cannot run a proper holdout, say so in the report and compare a matched set of categories rather than the whole site. This is the discipline behind serious analytics and attribution work.
Log files close the loop on crawl behaviour, but verify Googlebot by reverse DNS before trusting a hit. Last-click attribution splits credit between paid and organic on the same query, so template-level reporting will always beat channel-level reporting for this work.
Frequently asked questions
Do product pages or category pages matter more for e-commerce SEO?
They do different jobs. Category pages target the broad query, the phrase someone types when they have a need but no product in mind. Product pages target the specific query, including model numbers and comparisons. Most catalogues lose more revenue on weak category pages than on weak product pages, because category traffic is larger and the copy is thinner. Audit both, but start where revenue per session is already highest.
Should I noindex products that are out of stock?
No, unless the product is never coming back. Keep it indexable with availability set to OutOfStock in the page and the markup, and offer a back-in-stock notice or links to alternatives. The URL keeps its internal links and its query relevance. The exception is a product that will not return: redirect it to a successor, or to the parent category where there is no close replacement.
How many products should a filtered URL show before it deserves indexing?
There is no published threshold, and anyone quoting one is guessing. Set your own rule and apply it consistently. A facet page should hold enough products to look like a real category, target a phrase people search for, and stay stable for at least a quarter. Facets that fail the test stay available to shoppers without being linked into the indexable structure.
Does Product schema still earn rich results?
Product markup earns eligibility, not a guarantee. Google uses it for merchant listings, price and availability annotations and review snippets, and can withhold those when the markup does not match the visible page. The common failures are duplicate blocks injected by apps, stale prices, and review markup with no visible reviews. Validate a sample of templates after every theme or app change.
Can I use manufacturer descriptions on product pages?
You can, but every retailer selling the same SKU has the same text, so the page gives a search engine no reason to prefer it. Rewrite the opening around the questions buyers ask — fitment, sizing, what is in the box, what it replaces — and keep the manufacturer text lower on the page if compliance requires it. Differentiation usually lives at variant level.
How do I measure SEO across a catalogue of thousands of SKUs?
Measure at template level. Group URLs into product, category, facet and search templates, then compare organic sessions, revenue and revenue per session for each group over the same period. Search Console’s page grouping does the same for impressions and clicks. Individual SKU rankings are too noisy to manage; a template that improves by a small margin across four thousand URLs is a real result.
Sources
- Product structured data requirements, including offers, price, availability and review eligibility
- How Google treats canonical hints for duplicate and faceted URLs
- How Google renders JavaScript-dependent category and product content
- Product vocabulary used for variant and offer markup
Start with the pages that already have demand
The audit reviews your product and category templates, structured data, facet rules and feed parity, then ranks the fixes by the revenue at stake. You get a prioritised list a developer can act on, not a score out of ten.