
Ecommerce SEO Strategy - a 3, 6 and 12-Month Roadmap
An ecommerce SEO strategy is an order of work ranked by revenue, not a list of everything that could be improved. The rule to start with: if Search Console shows fewer than about 80% of the category and product URLs from your sitemap as indexed, or filters produce more indexed URLs than you have products, spend the first 3 months on technical work. If indexing is fine and your categories have queries at positions 4-20, start with categories, because that is where traffic grows fastest. With fewer than about 100 products and a new domain, SEO supports Merchant Center and ads rather than being the main sales channel.
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.
/// THIS POST IN SHORT
This post covers how to set priorities from Search Console data in one day, how to calculate the potential of each page group, a 3, 6 and 12-month roadmap with KPIs for every stage, where to invest (categories, product pages, filters, guides or Merchant Center), what it costs at two store sizes and how SEO compares with Google Ads. It also includes the results of my audit of product data in Polish online stores, a script for finding quick wins and the pitfall that can stall a filter clean-up for months.
Does your store need an SEO strategy at all - the first decision
Not every store should start with SEO. Organic results come with a delay, so at the start what matters is whether you have the time and the range of products on which organic traffic can actually make money.
| Store situation | Where to start | SEO at this stage |
|---|---|---|
| New store, up to 100 products, new domain | Merchant Center (free listings), Google Ads, good product pages | Basics: indexing, Product data, unique descriptions of the best products |
| Store with traffic, but organic sales come from a few products | Categories and internal linking | Main growth channel |
| Thousands of products, traffic flat despite a growing range | Audit of indexing, filters and variants | Technical work first, content second |
| Store after a platform migration with a traffic drop | Redirects and a comparison of URLs before and after the migration | Repair first, growth later |
| Brand that also sells through marketplaces | Categories and brand queries, Merchant Center | A complement that reduces dependence on commissions |
The most common mistake at this stage is a strategy copied from a company blog: a few articles a month and links to the home page. In a store, categories and product pages make the revenue, so they set the order of work.
A one-day diagnosis: 6 numbers that set the priorities
Before you plan anything, collect these numbers. All of them are in Search Console, GA4 and a crawl of the store (Screaming Frog, Sitebulb or your own script).
| Number | Where to find it | Warning threshold | What it means |
|---|---|---|---|
| Share of categories and products indexed | Search Console - Pages, filtered by sitemap | below about 80% | Indexing problem: start with technical work |
| Indexed URLs with parameters and filters | Search Console - Pages, example URLs; site: is not enough | more than the number of products | Filters and sorting eat crawl and duplicate categories |
| Categories' share of organic clicks | Search Console - Performance, URL groups by pattern | below about 30% | Traffic goes to products and the blog, categories do not rank |
| Category queries at positions 4-20 | Search Console - Performance, query + page | many impressions, few clicks | Fastest wins: improve categories and internal links |
| Products with errors in the product report | Search Console - Product snippets and Merchant listings | above about 10% of products | Missing price, availability or shipping in Product data |
| Organic revenue per 1,000 sessions | GA4 - acquisition, Organic Search channel | clearly lower than paid search | Traffic lands on the wrong pages or product pages do not sell |
The thresholds are my rules from store audits, not values from Google. They set the order of work, not a verdict on whether the store is good. More on filter indexing is in the post about crawl budget, and on product data in the structured data guide.
The priority matrix: revenue together with effort
You score each task with two numbers: how much revenue it can add and how much work it takes. I calculate revenue from Search Console data, not from general estimates:
potential (per month) = impressions × (target CTR - current CTR) × conversion rate × average order value
The target CTR is the median CTR of your own queries at positions 1-3 for the same page type. I do not use general CTR studies, because in ecommerce product results, ads and AI Overviews change click-through differently for every query. I score effort from 1 to 5 (1 = a change in the admin panel, 5 = a template rebuild with a developer).
| Task | Typical potential | Effort (1-5) | When |
|---|---|---|---|
| Clean-up of filters, sorting and parameters | large with thousands of URLs | 3-4 | 0-3 months |
| Fixing Product data (price, availability, shipping, returns) | medium, fast effect in product results | 2 | 0-3 months |
| Merchant Center and free product listings | medium, traffic from the Shopping tab and Images | 2 | 0-3 months |
| Titles, headings and content of categories with queries at positions 4-20 | large, the fastest growth in clicks | 2 | 0-3 months |
| New categories and indexable filters for queries with demand | large in the medium term | 3 | 3-6 months |
| Internal linking: menu, breadcrumbs, related categories | medium | 2-3 | 3-6 months |
| Unique descriptions of best-selling products | medium, mostly conversion | 2 | 3-6 months |
| Guides for comparison and problem queries | small to medium, long term | 2 | 6-12 months |
| Links from industry sites to categories and guides | medium to large, slow | 4 | 6-12 months |
The rule: first the top-right corner (high potential, low effort), then tasks that unlock others (indexing before content), and the long term last.
An ecommerce SEO roadmap for 3, 6 and 12 months
Below is the plan I write for stores with a few hundred to tens of thousands of products. The order follows the dependencies: there is no point writing category content that Google barely indexes, or earning links to pages that will change URLs next month.
| Stage | Work | Stage KPIs | Typical result |
|---|---|---|---|
| 0-3 months: foundation | Technical audit and keyword map, rules for filters, sorting and pagination, canonicals, Product data with price, availability, shipping and returns, Merchant Center, improving categories with queries at positions 4-20 | Share of sales pages indexed, fewer parameter URLs in the index, 0 critical errors in the product report, category CTR | A cleaner index, first growth in category clicks |
| 3-6 months: categories and products | New categories and filters for queries with demand, a rebuilt category template (content, FAQ, links to subcategories), internal linking, descriptions of top products, handling of out-of-stock products | Category clicks and revenue, number of queries in the top 10, organic revenue per 1,000 sessions | Traffic growth on category queries |
| 6-12 months: scale and authority | Guides for comparison queries, links from industry sites, long-tail category expansion, visibility in AI Mode and ChatGPT shopping, competitor and content gap analysis | Organic revenue and transactions, organic share of sales, visibility for broad queries | SEO as a steady sales channel |
A series of posts on ecommerce SEO covers this plan in detail: keyword research, filters and faceted navigation, indexing, Product and Offer structured data, pagination and competitor analysis. I described the overall picture of SEO and GEO in ecommerce in the post on store visibility in Google and AI shopping.
What my audit of product data in Polish online stores showed
On 11 October 2026 I checked 48 large and mid-sized Polish online stores (electronics, drugstores, pharmacies, fashion, books, home and garden, pet supplies). A script in a Chromium browser opened one product page in each store and read the structured data after rendering, the way Google sees it. For comparison, it also fetched the raw HTML and robots.txt. I have complete results for 26 stores. The other 22 showed the automated browser a "are you human" check, denied access, or no product page could be found.
| Element on the product page | Stores with the element (n = 26) | Notes |
|---|---|---|
| Product data (JSON-LD or microdata) | 23 (88%) | 3 stores without any Product data on the page checked |
| Price and currency in Offer | 22 (85%) | in every store with JSON-LD |
| Availability | 20 (77%) | |
| Brand and image | 21 (81%) | |
| GTIN (EAN) code | 15 (58%) | missing in 7 of 22 stores with JSON-LD |
| Shipping cost and time (shippingDetails) | 11 (42%) | |
| Return policy (hasMerchantReturnPolicy) | 10 (38%) | |
| Shipping and returns together | 9 (35%) | |
| Rating (aggregateRating) | 9 (35%) | some stores show reviews on the page, but without markup |
| Breadcrumbs (BreadcrumbList) | 22 (85%) | |
| Canonical pointing to the product page itself | 25 (96%) | |
| Sitemap listed in robots.txt | 19 (73%) | |
| Parameters blocked in robots.txt | 24 (92%) | from 0 to 236 Disallow rules |
What this means for strategy:
- The basics are done; the gaps are in the data that helps win a comparison. Almost every store has a price, but fewer than half include shipping and returns in product data, and a third of the stores with JSON-LD are missing GTIN. These are exactly the details Google shows in product results and uses to match an offer with other stores selling the same product. A caveat: return and shipping policies can also be set in Merchant Center or in store-wide Organization markup (Google recommends the latter for returns), so a gap on the product page does not always mean a gap in Google. Check your Merchant Center before changing the template.
- In no store did Product data appear only after JavaScript ran. Where I could compare, the JSON-LD was already in the raw HTML. That is good practice: Google renders JavaScript, but not every AI crawler does.
- Bot protection belongs in the strategy. 16 of 48 stores (one in three) showed the automated browser a check, a denial or an empty page. This usually does not affect Googlebot, but check your server logs to make sure the rules do not also block the AI search crawlers used by ChatGPT or Perplexity, if you want to be visible in AI shopping.
Limitations: this is one product page per store and a sample of 26 stores, so the results show a direction, not an exact picture of the market. I did not check Merchant Center data or markup on other pages.
Categories, product pages, filters, guides or Merchant Center - where to invest
Each page type answers a different intent and scales differently. This comparison helps split the budget.
| Page type | Query intent | Example query | Time to effect | Scale in a store | Main risk |
|---|---|---|---|---|---|
| Category | transactional, broad | women's running shoes | 1-3 months after changes | tens to hundreds of pages | cannibalisation with filters |
| Indexable filter (e.g. brand + category) | transactional, specific | asics women's running shoes | 2-4 months | dozens to a few hundred selected | indexing every combination |
| Product page | transactional, specific model | asics gel-nimbus 27 women's | weeks after indexing | hundreds to tens of thousands | manufacturer descriptions, duplicate variants |
| Guide | informational, comparison | best running shoes for asphalt | 3-9 months | a dozen to a few dozen | traffic without sales if it does not link to categories |
| Merchant Center (free listings) | transactional, visual | results in the Shopping tab, Images, Lens | days to weeks after approval | the whole catalogue from the feed | products rejected over inconsistent prices |
In most stores I have audited, the most traffic to recover was in categories and selected filters, not in the blog. Guides pay off only once categories are ready for the traffic they send.
SEO or Google Ads - cost at two scales
SEO and ads are calculated differently: ads cost money per click, SEO has a fixed cost and clicks grow with a delay. An example for two stores, based on my assumptions (plug in your own data from Google Ads and Search Console):
| Assumption | Store A: 500 products | Store B: 20,000 products |
|---|---|---|
| Categories and indexable filters | 40 | 600 |
| SEO work per month (estimate from my quotes, Oct 2026) | 15-20 hours | 40-60 hours |
| Additional organic clicks after 9-12 months (target) | 3,000/month | 30,000/month |
| Average Google Ads CPC for these queries (assumption) | PLN 1.50 | PLN 1.20 |
| Value of these clicks at ad prices | PLN 4,500/month | PLN 36,000/month |
| Conversion rate 1.5%, average order PLN 200 | 45 orders, PLN 9,000 revenue/month | 450 orders, PLN 90,000 revenue/month |
The takeaway: in a small store SEO pays back slowly, because the fixed cost of work is spread over few clicks, so ads and Merchant Center should carry sales for the first months. In a large store the same work is spread over hundreds of categories and thousands of products, so the advantage of SEO grows every month. The curves usually cross when the value of the additional organic clicks at ad prices exceeds the monthly cost of SEO. Track that threshold in reports instead of rankings alone.
An example roadmap for a store with about 2,000 products
This is how I plan the first year for a typical store on WooCommerce, PrestaShop or Shopify with about 2,000 products, 80 categories and filters by brand, size, colour and price.
| Month | Work | What I measure |
|---|---|---|
| 1 | Store crawl, Search Console export, keyword map to categories, list of filters with demand | Baseline: indexing, category clicks, organic revenue |
| 2 | Rules for filters and sorting (noindex first, then links without parameters), canonicals, Product data fixes | Number of parameter URLs in the index, errors in the product report |
| 3 | Merchant Center, titles and headings of the 20 categories with the most potential | CTR and clicks of those 20 categories |
| 4-5 | Category template: content below the listing, FAQ, links to subcategories; 10-15 indexable brand + category filters | Queries in the top 10, traffic to the new filters |
| 6 | Descriptions of the 100 best-selling products, handling of out-of-stock products | Revenue from product pages, share of 404s with traffic |
| 7-9 | Guides for comparison queries linking to categories, internal linking | Traffic from guides and clicks through to categories |
| 10-12 | Links from industry sites, long-tail category expansion, competitor analysis | Organic revenue and transactions year over year |
In month 2 I do not start with a robots.txt block but with noindex, for the reason described below in the production pitfall.
Script: quick wins from Search Console
This script pulls the last 90 days of data from the Search Console API, splits URLs into page types by URL pattern and calculates, for each page, the potential additional clicks from queries at positions 4-20. It calculates the target CTR from your own data for each page type.
# pip install google-api-python-client google-auth pandasimport re, datetime as dtimport pandas as pdfrom google.oauth2 import service_accountfrom googleapiclient.discovery import buildSITE = "sc-domain:yourstore.com"# URL patterns - adjust to your platformTYPES = [("product", r"/p/|/product/|-p\d+|\.html$"), ("category", r"/k/|/category/|/c/"), ("guide", r"/blog/|/guide/")]creds = service_account.Credentials.from_service_account_file( "sa.json", scopes=["https://www.googleapis.com/auth/webmasters.readonly"])gsc = build("searchconsole", "v1", credentials=creds)end = dt.date.today() - dt.timedelta(days=3)rows, start_row = [], 0while True: body = {"startDate": str(end - dt.timedelta(days=90)), "endDate": str(end), "dimensions": ["page", "query"], "rowLimit": 25000, "startRow": start_row} batch = gsc.searchanalytics().query(siteUrl=SITE, body=body).execute().get("rows", []) rows += batch if len(batch) < 25000: break start_row += 25000df = pd.DataFrame([{"page": r["keys"][0], "query": r["keys"][1], **{k: r[k] for k in ("clicks", "impressions", "ctr", "position")}} for r in rows])df["type"] = df["page"].map(lambda u: next((t for t, p in TYPES if re.search(p, u)), "other"))# target CTR = median CTR of your queries at positions 1-3 for that page typetarget = df[(df.position <= 3) & (df.impressions >= 50)].groupby("type")["ctr"].median()q = df[(df.position.between(4, 20)) & (df.impressions >= 100)].copy()q["extra_clicks"] = (q["type"].map(target).fillna(0.1) - q["ctr"]).clip(lower=0) * q["impressions"] / 3out = (q.groupby(["type", "page"]).agg(extra_clicks=("extra_clicks", "sum"), queries=("query", "count"), top_query=("query", "first")) .sort_values("extra_clicks", ascending=False).round(0))print(target.round(3))print(out.head(30).to_string())out.to_csv("quick_wins.csv")
The output is a list of pages sorted by additional clicks per month (I divide by 3 because the data covers 90 days). Multiply them by the conversion rate and average order value of that page type and you get the "potential" column for the priority matrix. Two notes: the API leaves out some rare queries (anonymisation), so totals will be lower than in the interface, and URLs with parameters should be normalised before the analysis, otherwise one category splits into a dozen rows.
Production pitfall: robots.txt before noindex
The most common mistake in a filter clean-up: the store has thousands of filter URLs in the index, so someone adds a Disallow rule for parameters to robots.txt and waits. Those URLs will not disappear. Google cannot fetch a blocked page, so it will not see noindex or a canonical on it, and the URLs stay in the index with the status "Indexed, though blocked by robots.txt". Google states plainly that robots.txt is not a way to remove pages from search results.
The correct order:
- 1.Add a meta robots noindex (or an X-Robots-Tag header) to filter URLs without demand, and remove links to them from product listings or turn them into elements that are not links.
- 2.Wait until the number of these URLs in the Search Console Pages report drops clearly. In a large store this usually takes a few weeks.
- 3.Only then block crawling of them in robots.txt, if they still eat crawl. Google recommends a robots.txt block for faceted navigation URLs that should not appear in results.
The same logic applies to canonicals: a canonical on a blocked URL does nothing, because Google cannot read it.
What not to do at the start
- Do not start with a blog if categories do not rank and are not ready for traffic.
- Do not index every filter combination - only the ones people search for (brand + category, sometimes type or material).
- Do not copy manufacturer descriptions to your most important products. For the rest of the catalogue, improve attributes, photos and Product data instead.
- Do not return 404 for out-of-stock products with traffic and links without thinking - it is often better to keep the page with a notice and alternatives, or redirect to the successor.
- Do not measure success by the rankings of a few queries. Measure organic revenue, category clicks and the number of products without errors.
- Do not buy link packages at the start. Links make sense only to pages that are technically ready.
FAQ
If you want me to write this kind of plan for your store from your Search Console data, see ecommerce SEO.
/// RELATED_SERVICES
Need these concepts implemented? Explore the services related to this topic.
Technical SEO
Technical SEO that makes your site fast, crawlable and easy to understand — for Google and for AI search engines. Audits, Core Web Vitals, Schema.org, migrations and link building.
View serviceServiceE-commerce & AI for Online Stores
I grow online stores with AI and data: automated product descriptions, recommendations, order automation, conversion rate optimization (CRO) and store audits. Shopify, WooCommerce and BaseLinker.
View service/// SOURCES
- 01Google Search Central - Ecommerce SEO best practices
- 02Google Search Central - Share your product data with Google
- 03Google Search Central - Help Google understand your ecommerce site structure
- 04Google Search Central - Managing crawling of faceted navigation URLs
- 05Google Search Central - Merchant listing structured data
- 06Google Search Central - Introduction to robots.txt
- 07Google Search Console Help - Page indexing report
- 08Google Search Console API - Search Analytics: query
- 09Vercel - The rise of the AI crawler (December 2024)
/// 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.
Allegro and Amazon in the AI Era - How to Increase Product Visibility on Marketplaces
Allegro's AI Assistant has been open to everyone since 7 May 2026, more than 300 million customers used Amazon's Rufus in 2025, and Amazon blocks ChatGPT's bots. How Allegro relevance works, how to prepare listings for AI assistants, why to combine a marketplace with your own store and how to keep one source of product data.
Signal received?
Terminate
Silence
Initiate protocol. Establish connection. Let's build something loud.
