Ecommerce SEO Strategy - a 3, 6 and 12-Month Roadmap
RETURN_TO_BLOG
Updated: AI & SEO 15 min

Ecommerce SEO Strategy - a 3, 6 and 12-Month Roadmap

Paweł Wiszniewski
Paweł Wiszniewski
SEO & GEO Specialist · AI Engineer

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

Ecommerce SEO strategy - where to start

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 situationWhere to startSEO at this stage
New store, up to 100 products, new domainMerchant Center (free listings), Google Ads, good product pagesBasics: indexing, Product data, unique descriptions of the best products
Store with traffic, but organic sales come from a few productsCategories and internal linkingMain growth channel
Thousands of products, traffic flat despite a growing rangeAudit of indexing, filters and variantsTechnical work first, content second
Store after a platform migration with a traffic dropRedirects and a comparison of URLs before and after the migrationRepair first, growth later
Brand that also sells through marketplacesCategories and brand queries, Merchant CenterA 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).

NumberWhere to find itWarning thresholdWhat it means
Share of categories and products indexedSearch Console - Pages, filtered by sitemapbelow about 80%Indexing problem: start with technical work
Indexed URLs with parameters and filtersSearch Console - Pages, example URLs; site: is not enoughmore than the number of productsFilters and sorting eat crawl and duplicate categories
Categories' share of organic clicksSearch Console - Performance, URL groups by patternbelow about 30%Traffic goes to products and the blog, categories do not rank
Category queries at positions 4-20Search Console - Performance, query + pagemany impressions, few clicksFastest wins: improve categories and internal links
Products with errors in the product reportSearch Console - Product snippets and Merchant listingsabove about 10% of productsMissing price, availability or shipping in Product data
Organic revenue per 1,000 sessionsGA4 - acquisition, Organic Search channelclearly lower than paid searchTraffic 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).

TaskTypical potentialEffort (1-5)When
Clean-up of filters, sorting and parameterslarge with thousands of URLs3-40-3 months
Fixing Product data (price, availability, shipping, returns)medium, fast effect in product results20-3 months
Merchant Center and free product listingsmedium, traffic from the Shopping tab and Images20-3 months
Titles, headings and content of categories with queries at positions 4-20large, the fastest growth in clicks20-3 months
New categories and indexable filters for queries with demandlarge in the medium term33-6 months
Internal linking: menu, breadcrumbs, related categoriesmedium2-33-6 months
Unique descriptions of best-selling productsmedium, mostly conversion23-6 months
Guides for comparison and problem queriessmall to medium, long term26-12 months
Links from industry sites to categories and guidesmedium to large, slow46-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.

StageWorkStage KPIsTypical result
0-3 months: foundationTechnical 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-20Share of sales pages indexed, fewer parameter URLs in the index, 0 critical errors in the product report, category CTRA cleaner index, first growth in category clicks
3-6 months: categories and productsNew 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 productsCategory clicks and revenue, number of queries in the top 10, organic revenue per 1,000 sessionsTraffic growth on category queries
6-12 months: scale and authorityGuides for comparison queries, links from industry sites, long-tail category expansion, visibility in AI Mode and ChatGPT shopping, competitor and content gap analysisOrganic revenue and transactions, organic share of sales, visibility for broad queriesSEO 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 pageStores 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 Offer22 (85%)in every store with JSON-LD
Availability20 (77%)
Brand and image21 (81%)
GTIN (EAN) code15 (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 together9 (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 itself25 (96%)
Sitemap listed in robots.txt19 (73%)
Parameters blocked in robots.txt24 (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 typeQuery intentExample queryTime to effectScale in a storeMain risk
Categorytransactional, broadwomen's running shoes1-3 months after changestens to hundreds of pagescannibalisation with filters
Indexable filter (e.g. brand + category)transactional, specificasics women's running shoes2-4 monthsdozens to a few hundred selectedindexing every combination
Product pagetransactional, specific modelasics gel-nimbus 27 women'sweeks after indexinghundreds to tens of thousandsmanufacturer descriptions, duplicate variants
Guideinformational, comparisonbest running shoes for asphalt3-9 monthsa dozen to a few dozentraffic without sales if it does not link to categories
Merchant Center (free listings)transactional, visualresults in the Shopping tab, Images, Lensdays to weeks after approvalthe whole catalogue from the feedproducts 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):

AssumptionStore A: 500 productsStore B: 20,000 products
Categories and indexable filters40600
SEO work per month (estimate from my quotes, Oct 2026)15-20 hours40-60 hours
Additional organic clicks after 9-12 months (target)3,000/month30,000/month
Average Google Ads CPC for these queries (assumption)PLN 1.50PLN 1.20
Value of these clicks at ad pricesPLN 4,500/monthPLN 36,000/month
Conversion rate 1.5%, average order PLN 20045 orders, PLN 9,000 revenue/month450 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.

MonthWorkWhat I measure
1Store crawl, Search Console export, keyword map to categories, list of filters with demandBaseline: indexing, category clicks, organic revenue
2Rules for filters and sorting (noindex first, then links without parameters), canonicals, Product data fixesNumber of parameter URLs in the index, errors in the product report
3Merchant Center, titles and headings of the 20 categories with the most potentialCTR and clicks of those 20 categories
4-5Category template: content below the listing, FAQ, links to subcategories; 10-15 indexable brand + category filtersQueries in the top 10, traffic to the new filters
6Descriptions of the 100 best-selling products, handling of out-of-stock productsRevenue from product pages, share of 404s with traffic
7-9Guides for comparison queries linking to categories, internal linkingTraffic from guides and clicks through to categories
10-12Links from industry sites, long-tail category expansion, competitor analysisOrganic 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.

quick_wins.py
# 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. 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. 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. 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.

/// AUTHOR
Paweł Wiszniewski – AI & Web Engineer

Paweł Wiszniewski

SEO & GEO Specialist & AI Engineer

SEO/GEO specialist (10 years) and AI engineer (3 years). I build search visibility, AI systems and automations that reduce costs and improve operational efficiency.

Signal received?

Terminate
Silence

Initiate protocol. Establish connection. Let's build something loud.

> WAITING_FOR_INPUT...