SEO for Shopify.
Crawl, parse, rank.
Whether conventional search engines can crawl, parse, and rank the catalogue. Shopify generates the sitemap and the default robots.txt. It cannot generate the catalogue data an index sorts on, and a theme can undo what the platform gets right.
- Target
- TGT-01 · SEO · Search engine optimisation
- Checks
- 9 in pillar layer v1.0
- Weight sum
- 100 — relative within this pillar; not rescaled to 100
- Heaviest
- Title length and uniqueness · sitemap.xml validity (14 each)
- Fix classes
- 0 automatic · 6 assisted · 3 guided — the design
- Crawler rule
- 6 points per fully disallowed search crawler (Googlebot, Bingbot), capped at 30. Search-crawler blocks never touch the composite.
- Composite
- A separate layer (rubric v1.0). Pillars do not sum to it.
- Fixes
- Planned automatic · Planned assisted
- Verify · rollback
- Planned · Planned
Not in the running.
A product with no type joins no comparison set — it is not ranked badly, it is not in the running. Where several URLs serve the same item with no canonical to settle it, an index picks one and drops the rest, so variants a shopper searches for are simply not there.
Three owners.
One surface.
The platform, the theme and the merchant each write part of what a search crawler reads.
On a Shopify store the SEO surface has three owners. The platform generates /sitemap.xml — links to products, their primary images, pages, collections and blog posts, split into child sitemaps by type — and a default robots.txt, which a theme customises through the robots.txt.liquid template. The theme renders what a crawler reads at the top of every product page: the title element, the meta description, the canonical link and the heading structure. The merchant owns the record: title, product type, tags, handle, image alt text.
That split is why one SEO number is not enough. A missing canonical is a template problem, a blank product type is a catalogue problem, and a broken sitemap is configuration the app cannot write at all. So every SEO check carries a fix class naming who can change it: 6 of the 9 are native Shopify fields, 3 live in the theme or the platform.
It is also why SEO comes first. Google documents Googlebot’s robots.txt rules as the control for how a site is crawled for Google Search — AI Overviews and AI Mode included. On Google, the conventional crawl is the door to the generative features too.
Crawler, index,
platform, theme.
Search crawlers
Googlebot and Bingbot fetch pages, follow links and read sitemaps. Google documents Googlebot as the crawler for Google Search, Discover and the AI features inside Search.
The index
Keeps one version of each page it judges canonical and files products into the result sets they can compete in. It sees the storefront, never the Shopify admin.
Shopify’s platform files
/sitemap.xml and the default /robots.txt, generated by Shopify. Changes to robots.txt go through the robots.txt.liquid template; the sitemap is not writable.
The theme
Liquid templates render the title element, meta description, canonical link and H1 of every product page. A head problem on one product page is usually a template problem on all of them.
One product,
several addresses.
What a canonical link settles — and what Rank Sniper’s canonical check does and does not test.
A Shopify product can resolve at more than one address: its own /products/ path, a collection-scoped path where a theme links products from inside a collection, and either of those with a ?variant= query when a shopper picks an option. To an index these are separate URLs serving near-identical pages.
/products/linen-throw /collections/bedding/products/linen-throw /products/linen-throw?variant=<variant-id> <link rel="canonical" href="https://example.com/products/linen-throw">
The canonical link is how a page names the address it wants indexed. Where nothing settles it, the index chooses — and the URL it keeps is not necessarily the one a shopper’s search should land on.
What the check tests
Canonical tags (weight 10) passes a sampled product page that declares a canonical link in absolute form. It does not compare that URL with the page’s own address, and it does not crawl collection paths looking for duplicates: the public scan reads at most three product pages, so it can see whether a canonical is declared, not whether it names the right page. The tag lives in the theme template, which is why the fix class is guided.
Product type and tags.
How a product joins the running.
The two catalogue fields that decide what a product is compared with.
Shopify defines product type as a category the merchant defines, one per product, and tags as searchable keywords attached to it. Type is the catalogue’s own statement of what a thing is. Tags carry the use-case, occasion and material vocabulary a category name leaves out. Where automated collections select products by conditions on those fields, a blank value also keeps a product off the collection page — the indexable page that lists it beside its peers.
Rank Sniper scores both over every product in the public listing. Product type set (weight 12) passes a product with a non-blank product_type; Tag richness (weight 10) passes a product with three or more tags. Both are catalogue checks, so a failing result carries a count and example product titles — something a merchant can open in the admin, not a statistic.
Shopify also assigns a product category from its Standard Product Taxonomy. No check in this pillar reads it.
What a crawler
can actually see.
Read from the served storefront, not from the Shopify admin — raw HTML, no JavaScript.
- Page head
- The title element, the meta description and the canonical link in the raw HTML of each sampled product page — before any script runs.
- Headings
- How many non-empty H1 elements a product page carries. One says what the page is; two or none leave it open.
- Images
- The alt attribute on every image of the sampled pages, counted per image. Images marked role="presentation" or aria-hidden are decorative and skipped.
- sitemap.xml
- Whether /sitemap.xml answers, parses as a sitemap or sitemap index, and lists URLs. Shopify serves an index of child sitemaps; the scan validates the index and does not follow it down. Shopify states the sitemap is not readable by crawlers while a store is password-protected.
- Catalogue record
- product_type, tags and handle for every product in the storefront’s public product listing.
- robots.txt
- The groups that apply to Googlebot and Bingbot, parsed per group with path matching — the same parser the scan uses for AI agents.
Alt text is read from the page, because the image objects in the public product listing carry no alt field. When the sampled pages have no images to judge, Alt-text coverage is an unscored check — excluded from the pillar, not scored zero. The same rule holds for every input the scan could not read.
9 checks.
One weight each.
The SEO pillar as the scorer runs it today, read from the live derivation.
| Weight | Shareif all scored | Fix classdesign | What the scan reads | |
|---|---|---|---|---|
| Title length and uniqueness | 14 | 14% | Assisted | The title element of each sampled product page: its length, and whether titles differ across pages |
| sitemap.xml validity | 14 | 14% | Guided | GET /sitemap.xml — presence, a parseable sitemap or sitemap index, URLs listed |
| Meta description | 12 | 12% | Assisted | The meta description of each sampled page, and its length |
| Product type set | 12 | 12% | Assisted | product_type on each product in the public listing |
| Canonical tags | 10 | 10% | Guided | A canonical link in absolute form on each sampled page |
| H1 structure | 10 | 10% | Guided | Exactly one non-empty H1 per sampled page |
| Tag richness | 10 | 10% | Assisted | Three or more tags per product |
| Alt-text coverage | 10 | 10% | Assisted | A non-empty alt on each image of the sampled pages, decorative images excluded |
| URL structure | 8 | 8% | Assisted | Handle shape — words, not imported identifiers |
| Sum of weights | 100 | — | — | Relative within this pillar; not rescaled to 100. |
Catalogue checks (type, tags, handle) score the share of products that pass. Page checks score the share of sampled product pages — up to three per scan. The sitemap check is one per store.
Share assumes every check was scored. A check whose input could not be read is unscored and leaves the denominator instead of counting against the store. The same rows, and how the pillar layer sits beside the composite, are on the rubric. The fix class column is the design — who will have to act — not a shipped fix.
Googlebot and Bingbot.
The SEO pillar only.
A block on a search crawler costs this pillar points and never touches the composite.
Rank Sniper reads the robots.txt groups for Googlebot and Bingbot with the same group parser it uses for AI agents. Each one fully disallowed costs this pillar 6 points, capped at 30. The composite never sees it: the composite crawler penalty counts AI agents only, and adding search crawlers to it would have moved every score already published. The pillar layer carries the signal; the composite stays as it was.
Google’s documentation explains why the signal belongs here. Googlebot’s robots.txt rules are the control for how a site is crawled for Google Search, including AI Overviews and AI Mode; Google-Extended, a separate token, does not affect inclusion in Search. Google also states that robots.txt manages crawling and is not a way to keep a page out of its results — that is what noindex or password protection is for.
On Shopify, changes to /robots.txt go through the robots.txt.liquid template. Shopify recommends building on the Liquid objects it provides, because the default rules it ships are updated over time.
User-agent: Googlebot Disallow: /
Four ways
it goes wrong.
Illustrative cases, not customers. Each maps to one check and one fix class.
The CSV import with no Type column
A catalogue imported from a supplier spreadsheet lands with product_type blank on every product. Product type set scores zero across the board — weight 12 of this pillar’s 100 — and the failing result carries a count and example titles. The fix is one native field per product.
A test rule that shipped
A developer adds a Googlebot group with Disallow: / to robots.txt.liquid while working on a theme, and it goes live. The SEO pillar loses 6 points; the composite does not move. Per Google, the same group governs crawling for AI Overviews and AI Mode.
Two H1s from the theme
The header renders the shop name as an H1 and the product template renders the title as a second one. H1 structure fails on every sampled page. It is a template change, so the fix class is guided.
Titles written for the grid
“Throw — Sand” reads well beside a photo and says little in a results page. Title length and uniqueness scores the title element each sampled page serves, and marks titles down when two sampled pages share one.
How SEO fails
on a Shopify store.
Not crawled
Googlebot or Bingbot disallowed, or no readable sitemap — deep products are found only by following links.
Deduplicated away
Several URLs serve one product and nothing names the canonical, so the index keeps whichever it picks.
Not in the running
A blank product type, or fewer than three tags: no comparison set to compete in.
Snippet left to the engine
No meta description of a usable length, so the results page shows whatever text the engine chooses.
Ambiguous subject
Zero or several H1s on the product template.
Unreadable images
No alt text: a crawler has no description of what the photograph shows.
What happens today.
What is still planned.
Rank Sniper finds and scores. Today the merchant makes the change and re-runs the scan.
- NOW-01Available
The scan reads and scores
Reads robots.txt first, then the public product listing, up to three product pages as raw HTML and sitemap.xml, and scores the 9 SEO checks above.
- NOW-02Beta
The full report lists what fails
Every failing SEO check, heaviest-weighted first, in the full report sent by emailed sign-in link.
- NOW-03
You make the change, then re-scan
Setting a product type and three or more tags puts each product into a comparison set instead of leaving it uncategorised. A valid sitemap.xml and one self-referencing canonical per page remove the duplicate-URL ambiguity that keeps variants out of an index.
- FIX-BPlanned
Assisted · 6 of 9 checks
Changes a native Shopify field — a title, description, tag, image or variant field. Drafted and staged; written only when you approve and apply it.
- FIX-C
Guided · 3 of 9 checks
Outside the app’s write scope — a theme template, a file at your domain root. You make the change from exact instructions; the next scan checks it. Until the app ships, the failing check and its fix class say where the change lives.
- VER-01Planned
Verification after a fix
Designed to re-fetch what agents actually receive once a change ships, and confirm it landed.
- VER-02Planned
Rollback
Designed to store the prior value of every write, with per-product restore.
SEO in
five lines.
What it is
Making a Shopify catalogue crawlable, deduplicated and categorised for Google, Bing and the indexes behind them — the oldest of the four disciplines.
Why it matters
Every other pillar starts from a fetch. On Google, Googlebot’s robots.txt rules also govern crawling for AI Overviews and AI Mode.
What Rank Sniper observes
9 checks: the head and H1 of up to three product pages, alt text on their images, sitemap.xml, product type, tags and handles, and robots.txt groups for Googlebot and Bingbot.
What Rank Sniper does today
Available Scores the pillar on every public scan and names what fails. It does not crawl the site, compare canonicals against each other, or submit anything to a search engine.
What remains planned
Planned Drafted titles, meta descriptions, types, tags, alt text and handles, applied only on approval. Planned Verification after a fix.
Upstream of everything.
Not a substitute for any of it.
AEO
SEO decides whether a page is found and which URL counts; AEO decides whether anything on it can be quoted. A perfectly indexed product with a two-line description passes one and fails the other.
Engage →GEO
SEO reads Googlebot and Bingbot; GEO reads 10 AI agents. A robots.txt that opens one set and closes the other makes the two pillars disagree — correctly.
Engage →AIO
Both read the same product pages. SEO reads the head; AIO reads the structured data — offers, price with currency, availability, and whether any of it contradicts itself.
Engage →Scan a store.
Read its SEO pillar.
The public scan scores all four pillars from what the storefront serves. Failing SEO checks come back with their weights.
- OfficialCustomize robots.txtShopify
- Officialrobots.txt.liquid templateShopify
- OfficialFinding your sitemapShopify Help Center
- OfficialProduct object (Admin GraphQL API)Shopify
- OfficialCollectionsShopify Help Center
- OfficialAI features and your websiteGoogle Search Central
- OfficialGoogle’s common crawlers (incl. Google-Extended)Google Search Central
- OfficialIntroduction to robots.txtGoogle Search Central
