
Ecommerce Indexing - Why Google Is Not Indexing Your Products and Categories and How to Fix It
Ecommerce indexing comes down to which sales pages Google has in its index, which ones it skips and why. The rule to start with: calculate the share of categories and products from your sitemap that are indexed. If it is below about 80%, check which status dominates in Search Console. "Discovered - currently not indexed" means Google has not reached the pages (linking, performance, too many URLs), while "Crawled - currently not indexed" means it reached them and judged them low value (duplicates, empty product pages). Keep a temporarily unavailable product live with a 200 status and OutOfStock availability. Redirect a discontinued product that has traffic or links with a 301 to its successor or category, and return 404 or 410 when it has neither.
Why Google is not indexing products and categories: Search Console statuses translated into store causes, Discovered vs Crawled - currently not indexed, unavailable and discontinued products, variants, the sitemaps of 30 Polish stores, a URL Inspection API script and the lastmod pitfall.
/// THIS POST IN SHORT
This post covers how to measure the indexing of sales pages, what each Page indexing report status means in a store, how to tell "Discovered" from "Crawled", what to do with unavailable and discontinued products, how to handle variants, the results of my check of sitemaps in Polish online stores, a script for measuring indexing through the Search Console API and the lastmod pitfall.
Is missing indexing a problem at all - the first decision
Not every unindexed URL is a problem. Google says plainly that most sites have a few unindexed pages and that "Not indexed" is not necessarily bad - the index should hold canonical pages, not every URL in the store. The problem starts only when pages meant to sell are missing.
| What is not indexed | Is it a problem | What to do |
|---|---|---|
| Filter, sorting and internal search URLs | No, if intentional | Nothing; just make sure they are not in the sitemap |
| Variant duplicates with a canonical to the main product | No | Nothing - "Alternate page with proper canonical tag" is fine |
| Removed products without links or traffic (404) | No | Remove them from the sitemap and internal links |
| Categories with traffic and demand | Yes | Diagnose with the status table below |
| Products that sell or have demand | Yes | Diagnose with the status table below |
| New products still missing weeks after launch | Yes, when it affects most new products | Linking, a sitemap with lastmod, server performance |
How to measure the share of indexed sales pages: split the sitemap into separate files for categories and products, submit them in Search Console and filter the Page indexing report by each file. You get indexed and unindexed counts separately for categories and products, instead of one number for the whole site with filters and terms pages mixed in.
Search Console statuses - what they mean in a store and how to fix them
The most important table in the post. I translated every Page indexing report status into typical store causes and fixes.
| Search Console status | What Google says | Typical store cause | Fix |
|---|---|---|---|
| Discovered - currently not indexed | Google knows the URL but has not crawled it yet | Products linked only from deep pagination pages, filter URLs eating crawling, a slow server | Links to products from categories and key pages, a filter clean-up, a faster server |
| Crawled - currently not indexed | Google crawled the page but did not index it | A manufacturer description, an almost empty category, a variant with no differences, a page with no products | Unique content on product pages with demand, merged variants, removing empty pages |
| Duplicate without user-selected canonical | A duplicate with no canonical declared | The same product under several URLs (category in the path, parameters), no canonical | One product URL and a canonical to it |
| Duplicate, Google chose different canonical than user | Google considers another URL a better canonical | A canonical to a page with different content, conflicting signals (links and sitemap point elsewhere) | Align canonical, internal links and the sitemap |
| Alternate page with proper canonical tag | The page correctly points to the canonical | Variants and parameters with a canonical | Nothing - this is correct |
| Excluded by 'noindex' tag | Google found a noindex | A filter plugin, theme or platform setting put noindex on categories or products | Check whether the noindex is intended; remove it from sales pages |
| Not found (404) | The page returns 404 | Removed products | Remove from the sitemap and links; 301 only when there is a successor or traffic |
| Soft 404 | The page looks like an error but returns 200 | An empty category, a product with an "unavailable" notice and no content | Content and alternatives on the page, or a real 404 |
| Page with redirect | The URL redirects elsewhere | Old URLs in the sitemap and links after a migration | Replace URLs in the sitemap and links with the final ones |
| Blocked by robots.txt | The crawler cannot fetch the page | A robots.txt rule also catches sales pages | Fix the rule |
| Indexed, though blocked by robots.txt | Indexed despite the block | Filters blocked after they were indexed | noindex first, block later - covered in the post on [ecommerce faceted navigation](/en/blog/ecommerce-faceted-navigation-seo-filters) |
After a fix, click "Validate fix" in the report. Google says validation usually takes up to about two weeks, sometimes longer.
"Discovered" or "Crawled" - a decision tree
These two statuses sound alike but have different causes and fixes. This is how I diagnose them:
- 1.Do most unindexed products show "Discovered - currently not indexed"? Google has not fetched them yet. Check the Crawl stats report: how many URLs Googlebot fetches a day and the server response time. If the crawler mostly fetches filter and parameter URLs, start there. If response time is rising, the server is the problem.
- 2.Are products linked only from deep pagination pages? Add links from categories, subcategories, a "new arrivals" section and related products. Google recommends linking to every product you want indexed.
- 3.Does "Crawled - currently not indexed" dominate? Google fetched the pages and skipped them. Compare a few such product pages with indexed ones: they usually differ in the length and uniqueness of the description, the number of attributes, photos and reviews, or they are a variant of another product.
- 4.Does "Crawled" affect categories? Check whether the category has enough products and is not almost identical to another one (e.g. two categories with the same listing). Merge or remove empty and duplicated categories.
- 5.Do pages show a "Duplicate" status? That is not a quality problem but a URL problem: the same product under several URLs. Pick one URL and align the canonical, links and sitemap.
I cover how Google allocates crawling resources in more detail in the post about crawl budget.
Unavailable and discontinued products - what to do with the page
The most common question in my work. The answer depends on whether the product will return, whether it has a successor, and whether its page has traffic or external links.
| Situation | What to do with the page | HTTP status | Product data |
|---|---|---|---|
| Temporarily unavailable, will return | Keep the page, show the restock date or a notify-me option | 200 | availability: OutOfStock (or BackOrder, PreOrder) |
| Discontinued, has a successor | Redirect to the successor | 301 | Normal Product data on the successor page |
| Discontinued, no successor, the page has traffic or links | Keep the page with a notice and alternatives, or redirect to the category | 200 or 301 | availability: Discontinued if you keep the page |
| Discontinued, no traffic or links | Remove the page | 404 or 410 | None |
| Seasonal product | Keep the page all year | 200 | OutOfStock out of season |
Two things to remember. First, Google treats all 4xx codes (except 429) the same, so choosing between 404 and 410 makes no practical difference - indexed URLs returning 4xx drop out of the index. Second, redirecting a discontinued product to the home page or an unrelated category often ends up as a soft 404. Redirect only where there is a genuinely similar product.
Product variants - one URL or many
Sizes and colours can multiply the number of URLs. The rule: only a variant that people search for separately gets its own indexable URL (e.g. colour in fashion, storage in electronics). Other variants are a parameter on one product page or separate URLs with a canonical to the main product.
| Variant | Example | Recommendation |
|---|---|---|
| Size | shoes 38, 39, 40 | One product URL, size as a choice on the page |
| Colour with demand | black vs white sneakers of one model | Separate URLs, each with a self canonical and its own photo |
| Colour without demand | 10 shades of a foundation | One URL, or separate ones with a canonical to the main one |
| Storage, version | smartphone 128 GB vs 256 GB | Separate URLs if they differ in price and people search for them |
| Bundle vs single product | coffee machine + coffee | Separate products |
I will show how to describe variants in structured data (ProductGroup, hasVariant) in a separate post in this series.
A sitemap for a large catalogue
A sitemap does not guarantee indexing, but for a store with thousands of products it is the main source of information about new and changed pages. Google's rules: one file holds at most 50,000 URLs or 50 MB, the sitemap should list the canonical URLs you want to see in results, Google ignores priority and changefreq, and it uses lastmod only when it is consistently accurate.
| Element | Good | Bad |
|---|---|---|
| File split | Separate files: categories, products (10,000-50,000 each), guides | One file with the whole store and info pages |
| Contents | Only URLs returning 200, without noindex, with a self canonical | Redirects, 404s, filters, noindex URLs |
| lastmod | The date of the last significant change: price, availability, description | The current date on every sitemap generation |
| Updates | Automatic when a product is added or changed | Manual every now and then |
What Polish store sitemaps showed - my check
How I checked: on 22 October 2026 a script read the sitemaps of 30 Polish online stores (from robots.txt, or from /sitemap.xml when robots.txt listed none). For each store it drew 40 URLs from the product sitemap files and checked the HTTP status (without following redirects), meta robots, the X-Robots-Tag header and canonical. Separately, I checked lastmod dates in up to three sitemap files per store. I could check HTTP statuses in 20 stores (800 URLs) and lastmod dates in 23. The other stores blocked automated fetching or their sitemaps could not be read.
| What I checked | Result | Example |
|---|---|---|
| URLs with a redirect in the sitemap | 43 of 800 (5.4%), in 6 of 20 stores | neonet.pl: 21 of 40 sampled products redirected to a new URL after a product rename |
| URLs with noindex in the sitemap | 5 of 800, in 2 stores | mediamarkt.pl: 3 product pages with noindex; melisa.pl: 2 group pages |
| 404 URLs in the sitemap | 0 of 800 | Stores remove discontinued products from the sitemap |
| Canonical to another page | 0 of 800 | - |
| lastmod set to the current date for (almost) all URLs | 3 of 23 stores | morele.net: 3,000 of 3,000 URLs, neonet.pl: 604 of 604, drogerienatura.pl: 96% |
| One old date for most URLs | 1 of 23 | castorama.pl: 80% of URLs with the same date from April 2026 |
| No lastmod (under 10% of URLs) | 5 of 23 | mediamarkt.pl, kontri.pl, ezebra.pl, melisa.pl, vox.pl |
| Varied, credible lastmod dates | 14 of 23 | including zooplus.pl, sportano.pl, gemini.pl, obi.pl |
Takeaways:
- Large stores rarely have 404s in their sitemaps, but often have redirects. The usual cause is a changed product or category URL without a sitemap update. A single redirect does no harm, but when it affects half the sample, the crawler fetches thousands of URLs a day that will never be indexed, and the "Page with redirect" count in the report keeps growing.
- lastmod is the weakest part of sitemaps. In 9 of 23 stores it is useless: today's date everywhere, the same date everywhere, or missing. Only 14 stores give dates that can actually help Google find changed products.
- noindex in a sitemap is a conflicting signal - the sitemap says "index", the page says "do not index". It was rare in the sample, but in a large catalogue even 1-2% means hundreds of such URLs.
Limitations: this is a sample of 40 URLs per store and up to three sitemap files per store for lastmod, and I checked canonical and noindex in the raw HTML without running JavaScript.
How much work - two scales
An estimate from my quotes (October 2026) for diagnosing and fixing indexing, excluding rewriting product page content.
| Assumption | Store A: 500 products | Store B: 20,000 products |
|---|---|---|
| Sitemap files | 1 file or 2 (categories, products) | categories + 1 product file; several files from 50,000 URLs up |
| Status diagnosis and a URL sample | 4-6 hours | 15-25 hours, including a script and log analysis |
| Technical fixes (canonical, noindex, sitemap, redirects) | 6-12 hours | 30-60 hours |
| Fix validation in Search Console | usually up to 2 weeks | usually up to 2 weeks, longer for large changes |
| When the indexed count changes | 2-6 weeks | 1-3 months |
I run this kind of diagnosis and these fixes for stores as part of my ecommerce SEO work - always starting with a sample of URLs from the sitemap, as in the script below.
Script: the share of indexed products through the Search Console API
The report in the interface shows statuses, but not for a sample of URLs you choose. The script takes URLs from the sitemap, draws a sample and checks each through the URL Inspection API. The API limit is 2,000 inspections a day per property, so for a large store you check a sample, not everything.
# pip install google-api-python-client google-auth requestsimport collections, random, re, requestsfrom google.oauth2 import service_accountfrom googleapiclient.discovery import buildSITE = "sc-domain:yourstore.com"SITEMAPS = {"categories": "https://yourstore.com/sitemap-categories.xml", "products": "https://yourstore.com/sitemap-products-1.xml"}SAMPLE = 200 # per page type; API limit: 2,000 a day per propertycreds = service_account.Credentials.from_service_account_file( "sa.json", scopes=["https://www.googleapis.com/auth/webmasters.readonly"])gsc = build("searchconsole", "v1", credentials=creds)for kind, sm in SITEMAPS.items(): urls = re.findall(r"<loc>\s*([^<\s]+)\s*</loc>", requests.get(sm, timeout=30).text) sample = random.Random(1).sample(urls, min(SAMPLE, len(urls))) states = collections.Counter() for u in sample: res = gsc.urlInspection().index().inspect(body={"inspectionUrl": u, "siteUrl": SITE}).execute() idx = res["inspectionResult"]["indexStatusResult"] states[idx.get("coverageState", "no data")] += 1 ok = sum(v for k, v in states.items() if k.startswith("Submitted and indexed") or k.startswith("Indexed")) print(f"\n{kind}: {len(urls)} URLs in the sitemap, sample {len(sample)}, indexed {ok / len(sample):.0%}") for state, n in states.most_common(): print(f" {n:4d} {state}")
The output is the share of indexed pages separately for categories and products, plus the most common statuses in the sample, which point straight to a row in the status table. Run it monthly and keep the results to see the trend.
Production pitfall: lastmod set to today
The most common mistake in store sitemaps: the generator writes the current date into lastmod every time the sitemap is generated, for all URLs at once. It looks as if the whole catalogue changes every day. In my check, 3 of 23 stores did this. Google uses lastmod only when it is consistently and verifiably accurate, so such a date stops meaning anything, and the store loses the simplest way to point the crawler to new and changed products.
The fix: take lastmod from the store database and update it on changes that matter to the buyer - price, availability, description, photos. A footer change, a copyright year or a stock recount without an availability change are not significant changes.
What not to do
- Do not fight to get every store URL indexed - the index should hold sales pages, not filters and parameters.
- Do not manually submit hundreds of URLs through URL Inspection - it does not fix the cause.
- Do not return 404 for temporarily unavailable products.
- Do not redirect discontinued products to the home page.
- Do not keep redirects, 404 URLs and noindex pages in the sitemap.
- Do not set lastmod to today's date for the whole catalogue.
- Do not click "Validate fix" repeatedly - Google asks you to wait for the result.
FAQ
I describe the order of all store work in the ecommerce SEO strategy. If you want me to diagnose your store's indexing and implement the fixes, see ecommerce SEO.
/// RELATED_SERVICES
Need these concepts implemented? Explore the services related to this topic.
/// SOURCES
- 01Google Search Console Help - Page indexing report
- 02Google Search Central - Build and submit a sitemap
- 03Google Search Central - How HTTP status codes affect Google's crawlers
- 04Google Search Central - Help Google understand your ecommerce site structure
- 05Google Search Central - How to launch an ecommerce website
- 06Google Search Central - How to specify a canonical URL
- 07Google Search Console API - URL Inspection
- 08Schema.org - ItemAvailability
/// RELATED_RECORDS
Ecommerce Faceted Navigation and SEO - Which Filters to Index and Which to Block (noindex, canonical, robots.txt)
Which ecommerce filters to index and which to block: a rule with thresholds, noindex vs canonical vs robots.txt vs nofollow in one table, a check of filters in 11 Polish stores, Shopify, WooCommerce, PrestaShop and IdoSell defaults, URL counts at two scales, robots.txt rules, a script and two pitfalls.
Ecommerce Keyword Research - How to Map Queries to Categories, Filters and Products
How to do ecommerce keyword research and map queries to categories, filters, product pages and guides: a mapping rule with thresholds, a keyword map from 1,109 Google suggestions and real store product counts, Search Console, Keyword Planner, Senuto and Ahrefs with prices, a sheet template and a cannibalisation script.
Ecommerce SEO Strategy - a 3, 6 and 12-Month Roadmap
How to build an ecommerce SEO strategy ranked by revenue: a one-day diagnosis from Search Console, a priority matrix, a 3, 6 and 12-month roadmap with KPIs, SEO vs Google Ads cost at two scales, an audit of product data in 26 Polish online stores and a quick-wins script.
Signal received?
Terminate
Silence
Initiate protocol. Establish connection. Let's build something loud.
