The URL structure is not yours to choose
Shopify forces /products/, /collections/, /pages/ and /blogs/ into every path. You control the handle after them, nothing before. Anyone arriving from WooCommerce or Magento loses every existing URL, which is why a complete redirect map belongs in the migration plan and not in a follow-up ticket.
There is a second issue most stores never notice: every product is reachable at both /products/handle and /collections/x/products/handle. Shopify does set a canonical on the second form, but plenty of themes link internally to it anyway. Crawlers then spend their budget walking thousands of addresses that all resolve to the same page.
- Point internal links at the canonical product URL
- Check the canonical tag in the product template, not just the homepage
- Never link internally with the ?variant= parameter
Collection pages are where the volume is
Category searches carry many times the volume of individual product names, and they land on collection pages. Out of the box a Shopify collection is close to empty: a heading, a filter bar and a product grid. There is nothing for a search engine to rank.
We rebuild collections so they earn the position: a short intro above the grid, a substantial section below it, a topic-specific FAQ and internal links to related collections. It is unglamorous work and it usually moves faster than anything else on the list.
Filters and sorting eat crawl budget
Shopify Search & Discovery generates a distinct URL for every filter combination — ?filter.v.option.colour=blue, ?sort_by=price-ascending, and so on. A single collection becomes several hundred crawlable near-duplicates.
Since Shopify opened up robots.txt.liquid this is fixable: block the sort and filter parameters, keep the canonical pointing at the clean collection. Without that, a large share of your crawl budget goes to pages that were never meant to rank.
- Edit robots.txt.liquid rather than ignoring parameters
- Keep pagination titles unique and self-referencing
- Avoid internal links into filtered views
What Shopify will not let you do with the sitemap
/sitemap.xml is generated automatically and cannot be edited. No priorities, no change frequencies, no manual selection — everything visible on the Online Store channel goes in.
Control therefore happens in two other places: sales-channel visibility and robots.txt.liquid. Beyond that it is Search Console work — submit the sitemap, watch the indexing report, inspect specific URLs when something looks wrong.
Structured data: complete, and honest
Product, Offer, BreadcrumbList and Organization belong on every store. Many purchased themes ship incomplete markup, or emit the same schema twice because an app adds its own. Duplicates show up as errors in Search Console and cost you rich results.
One thing we will not do: AggregateRating without real reviews. Invented stars breach the structured-data guidelines, get caught regularly, and earn a manual action that outlasts the short-term gain by a long way.
International SEO without breaking hreflang
Shopify Markets generates language and country URLs for you. The most common failure is an hreflang set that does not reference itself, or a market left without an x-default. Google then picks a version on its own, usually the wrong one.
We validate the set mechanically: every language version must list all the others, include itself, and point at an indexable URL. Content work per market only pays off after that is clean.
- Self-referencing hreflang on every version
- Set x-default, or Google decides for you
- Currency and shipping cost visible per market
Core Web Vitals are part of this, not separate
LCP on almost any Shopify store is the hero image or the first product image. The second lever is apps: review widgets, popups and tracking scripts load render-blocking and push every measurement back.
We read both lab data from Lighthouse and field data from Search Console, because lab numbers alone flatter. Speed work and SEO work are one project, not two.
What we report, and what we will not promise
Monthly: impressions, clicks, average position and index coverage straight from Search Console, plus whatever technical errors appeared since last time. No rank-tracker screenshots filtered down to the terms that happened to move.
What we will not commit to is a specific position on a specific date. Anyone who guarantees that either does not know the competition or means phrases nobody searches for. Realistically: technical fixes land in 4–8 weeks, on-page work in 2–4 months, content compounds over 6–12.