Skip to content
Platform-specific · evidenced

Shopify will not let you make most classic technical mistakes. The ones it does let you make, it makes at catalogue scale.

Shopify hands you correct canonicals and a clean sitemap by default, which is why Shopify SEO problems are rarely the ones a generic audit looks for. They are duplication the platform creates on your behalf, feed attributes nobody filled in, and locales that were translated but not localised.

01

The duplication Shopify creates for you

Two URLs, one product

Every Shopify product is reachable at two addresses: /products/handle and /collections/collection/products/handle. The platform sets a canonical to the first, which is the right answer, and this is the part most audits stop at because it comes back green.

The cost is not indexation. It is that every internal link generated by a collection template points at the non-canonical form, so the crawl path the site actually presents disagrees with the canonical it declares. Google resolves it; the crawl budget spent resolving it is still spent, and on a large catalogue that is the difference between a full recrawl and a partial one.

The fix is a theme change, not a settings toggle: emit product links in canonical form from the collection loop. It is a two-line edit that nothing in a crawler report will ever tell you to make.

Canonicalisation, defined

02

Variants, and the parameter that is not a page

?variant= at scale

A product with twelve size and colour combinations generates twelve ?variant= URLs from the picker alone, each one a distinct address that a crawler can reach from the product page itself. They carry the product’s canonical, which is correct — and they are still discovered, fetched, and resolved one at a time.

On the engagement this page draws from, the catalogue was 1,508 products across 297 indexable URLs. The gap between those two numbers is the entire point: a product count and a URL count are different questions, and a proposal that quotes the first as if it were the second has not read the store.

Product variants, defined

03

Tag filters are the faceted navigation problem

Combinatorial by default

Shopify’s tag filtering produces /collections/name/tag1+tag2 and it composes. Three tags on a collection is seven reachable combinations; six tags is sixty-three. Nobody chose that; it is what the URL scheme does when a merchandiser adds tags.

These pages are usually thin, frequently near-duplicate, and always crawlable unless something stops them. They are also occasionally valuable — a genuine "black midi dresses" page can be the right landing page for a real query. The judgement is which handful to keep and index deliberately, and how to stop the rest, and that is a decision per store rather than a rule.

Crawl budget, defined

04

The feed is a separate index, and it fails separately

Approved and earning nothing

Merchant Center approval is not a visibility signal. It means the feed parsed and the policy checks passed. It says nothing about whether the products can be matched to a query.

The clearest single finding from this engagement: 1,508 products approved, 0 disapprovals, and 0 clicks — because 744 of them were missing age_group and gender. Womenswear that does not declare it is womenswear cannot be matched to a gendered query, and the account reports a perfect health score the entire time.

This is the defect class that a rankings report cannot contain and a Merchant Center dashboard reports as green. It is found by reading attribute coverage against the catalogue, which is not a thing any tool prompts you to do.

The Ambar case study

05

Shopify Markets, and translated-but-not-localised

4 locales, 13 countries

Markets generates locale URLs and reciprocal hreflang correctly, which removes the failure mode most international audits are built to find. What it does not do is localise — and the difference is where the actual loss sits.

The store audited here ran 4 locales shipping to 13 countries, all confirmed genuinely translated, alongside 194 stale metadata fields. The body copy was in the right language and the titles and descriptions were not. A locale that is translated at the template level and stale at the metadata level presents correctly to a user and incorrectly to every system reading the head.

The second Markets trap is quieter: a locale enabled with no shipping rate behind it publishes a storefront to a country you cannot fulfil. Reconciling enabled locales against live shipping zones is a ten-minute check that nothing prompts.

International SEO

06

Theme rendering and app cost

What arrives in the HTML

Shopify renders Liquid server-side, so the baseline is sound. What erodes it is apps: a review widget, a size guide, a recommendation block and a currency switcher each inject script, and collectively they move meaningful copy out of the served HTML and into something assembled after load.

The check is render parity per template, not per page — raw HTML against rendered DOM for one product, one collection, one article — and the finding is usually specific and small: one block of copy that exists only after JavaScript. That block is invisible to anything that does not render, which now includes most of the systems assembling answers.

Technical SEO

Shopify surfaces checked — 11
collection URLsproduct canonicalsvariant parameterstag-filtered facetstheme renderingapp script costMerchant Center feedShopify Marketshreflangsitemap paritymetafield templates
07

Common questions

Answer first, then the reasoning

Does Shopify handle SEO on its own?

It handles the structural part well — correct product canonicals, a generated sitemap, server-rendered templates, reciprocal hreflang under Markets. What it does not handle is what it generates on your behalf: collection-path duplicate links, tag-filter combinations, variant parameters, and a product feed whose attribute coverage nothing validates.

Why are my products approved in Merchant Center but getting no clicks?

Approval means the feed parsed and passed policy. It does not mean products can be matched to queries. The usual cause is missing required attributes for the category — on the store audited here, 744 of 1,508 products were missing age_group and gender, which makes gendered matching impossible while the dashboard stays green.

Should Shopify tag-filter pages be indexed?

Some of them, deliberately, and the rest not at all. A filter combination that matches a real query people search is a legitimate landing page; the other sixty are thin near-duplicates the URL scheme generated by itself. The decision is per store and it is a judgement, not a rule a plugin can apply.

Is Shopify Markets enough for international SEO?

For the mechanics, largely yes — locale URLs and reciprocal hreflang come out correct, which is the failure most international audits look for. What it does not do is localise. Translated body copy with stale titles and descriptions reads correctly to a person and incorrectly to every system reading the head.

09

Build visibility

Seven questions · no discovery call

Atlas reads the site before the first conversation. These are the seven things worth knowing first.

Shopify SEO Build visibility