SEO & performance
XML sitemap
An XML sitemap is a machine-readable list of the URLs you want search engines to crawl, along with when each last changed. Shopify generates one automatically at /sitemap.xml and it cannot be edited directly. A sitemap helps discovery on large or poorly-linked sites; it does not force indexing, and listing a page there does not override a noindex tag.
Why it matters
Sitemaps are widely overrated as a ranking device and genuinely useful as a diagnostic one.
They do not force indexing. A URL in a sitemap is a suggestion, and Google indexes it or does not on its own assessment. Adding pages to a sitemap to make them rank is a misunderstanding that persists because it sounds plausible.
What they do well is help discovery on large sites and sites with weak internal linking, and — more valuably — give you a clean comparison in Search Console between what you submitted and what was indexed. That gap is one of the most informative numbers available: it tells you how much of your catalogue Google looked at and declined.
How it works on Shopify
Shopify generates the sitemap automatically at /sitemap.xml, structured as an index pointing to separate files for products, collections, pages, and blog posts. It cannot be edited directly, which removes both the risk of getting it wrong and the ability to be selective.
That constraint has consequences. Products hidden from a sales channel drop out automatically, which is correct, but there is no way to exclude a page you want accessible and unindexed. The instrument for that is a noindex directive, and the two must not contradict each other — a URL in the sitemap serving noindex is a mixed signal that wastes crawls.
Headless storefronts generate their own sitemap, which means the exclusion logic becomes a deliberate decision rather than an inherited default.
The productive use is monitoring. Submitted against indexed, checked monthly, surfaces problems early: a sudden drop in indexed products, a category disappearing, or a large gap opening after a theme change.
Large sites should keep individual sitemap files within the standard limits, which Shopify handles by splitting automatically.
Common mistakes
- Expecting it to force indexing. It requests discovery, nothing more.
- Contradicting noindex. A noindexed URL listed in the sitemap sends opposing instructions.
- Listing redirected URLs. On a headless build, easy to do and wasteful — list destinations only.
- Ignoring the coverage report. The submitted-versus-indexed gap is the most useful signal a sitemap produces.
- Blocking it in robots.txt. It happens, usually as collateral damage from a broader rule.
- Assuming Shopify's is enough for a headless site. A custom storefront needs its own, and it needs maintaining.
When you need help
The trigger is a widening gap between submitted and indexed URLs, particularly if it appeared suddenly. That is a symptom rather than a cause, and it usually points at crawl budget, thin content, or duplication.
The other case is a headless or heavily customised storefront, where sitemap generation is code you own. Deciding what belongs in it, keeping it accurate as the catalogue changes, and ensuring it never contradicts the site's own robots directives is work that has to be designed rather than inherited.
Need this done on your store?
Site structureRelated terms
- Crawl budgetCrawl budget is the number of URLs a search engine will crawl on your site in a given period, set by your site's authority and how fast your server responds. It only becomes a real constraint on large sites — but a Shopify store with unmanaged faceted URLs reaches that scale quickly, and spends its budget on filter permutations instead of products.
- robots.txtrobots.txt is a file at the root of a domain that tells crawlers which paths they may request. It controls crawling, not indexing — a URL blocked in robots.txt can still appear in search results if other pages link to it, and blocking it actually prevents Google from seeing the noindex tag that would remove it. To keep a page out of the index, allow the crawl and use noindex.