Technical SEO for Shopify: What You Can Actually Change

On this page: quick jump links

Technical SEO for Shopify is a shorter job than technical SEO on an open platform, because Shopify has already made most of the decisions and will not let you unmake them. Your sitemap is generated and maintained for you. Your robots.txt is written for you and updated for you. Your theme emits structured data. What remains is a small, specific set of controls: a robots.txt.liquid template you can create but usually should not, a <head> in theme.liquid where indexing directives go, two documented ways to hide a page, and the parts of speed that belong to your theme rather than to Shopify's servers. The useful version of this topic is not a checklist of everything technical SEO can mean. It is an honest map of which controls exist on this platform, where each one lives, and which widely repeated fixes have nothing to act on.

What Shopify already handles for you

Three of the things a technical SEO audit normally opens with are not open questions on Shopify. Knowing that before you start is what makes the job small.

Your Shopify sitemap is automatic and self-maintaining. Shopify's documentation is unambiguous: "All Shopify stores automatically generate a sitemap.xml file that contains links to all your products, primary product image, pages, collections, and blog posts," and those files "are automatically updated when you add a new webpage, product, collection, image, or blog post to your Shopify online store" (Shopify Help Center). Documented. There is no sitemap to build, no sitemap to regenerate, and no plugin required to produce one. Your remaining job is one-time: submit it in Search Console.

Your robots.txt is written and maintained by Shopify. The platform generates it by default, and the template that would let you override it "isn't included in any themes by default" (shopify.dev). Shopify's help documentation goes further: "All Shopify stores have a preconfigured and optimized robots.txt.liquid template, so you don't need to make any changes to your robots.txt.liquid file unless you have a specific reason to do so." Documented.

Your theme already emits structured data. "Your Shopify store's theme automatically includes microdata (also known as structured data) in its code," and "All current Shopify-supported themes and themes from the Theme Store include this functionality by default, so you don't need to add any additional code" (Shopify Help Center). Documented. That has a direct consequence for app shopping, covered below.

None of this makes a Shopify store technically perfect. It means the failures that remain are a different set from the ones a generic technical SEO checklist is looking for. If you want the platform-agnostic version of the discipline first, our guide to technical SEO covers the underlying concepts, and technical ecommerce SEO covers what is specific to catalogues at scale.

The four controls that are genuinely yours

Shopify technical SEO comes down to four levers you can actually pull. Everything else on the platform is either a content decision or someone else's setting.

1. The robots.txt.liquid template

The robots.txt.liquid template "renders the robots.txt file, which is hosted at the /robots.txt URL" (shopify.dev). It does not exist in your theme until you create it, in Online Store > Themes > … > Edit code > Templates > New file, named exactly robots.txt.liquid. It cannot be a JSON template. Documented.

Two constraints on how you edit it matter more than the fact that you can. First, the default rules are exposed to the template through the Liquid robots object, so a customisation should loop robots.default_groups and add to it rather than replace it. Shopify's own reason for this is the second constraint, and it is the argument against most Shopify robots txt edits: "The default rules are updated regularly to ensure that SEO best practices are always applied." Documented. A hand-written file freezes the rules on the day you wrote them; a template that iterates the default groups keeps inheriting Shopify's updates.

So how to edit Shopify robots txt has a documented answer, and a separate practical one: create the template, iterate the defaults, add only the rule you can name a reason for, and expect that to be a short list. Blocking a checkout path or a staging collection is a reason. "Improving crawl efficiency" in the abstract is not — see the Shopify crawl budget point below.

2. The head of theme.liquid, for Shopify noindex directives

robots.txt asks a crawler not to fetch a URL. It does not remove a URL from an index. For that you need a noindex directive in the page's <head>, and on Shopify that means editing layout/theme.liquid. Shopify documents the exact pattern:

{% if template contains 'search' %}
<meta name="robots" content="noindex">
{% endif %}

and a handle-scoped variant for a single page or product (Shopify Help Center). Documented. Note what Shopify says about the side effect: pages hidden this way are "hidden from search engines, but … still visible to your storefront search". A Shopify noindex tag added in the theme head is an external-visibility control only.

3. Unlisted status and the seo.hidden metafield

Shopify documents two further ways to remove a resource from search that do not involve theme code at all, and they behave differently. Setting a custom metafield of seo.hidden to 1 on a page, blog post or product hides it "from sitemaps, search engines, and your online store search". Setting a product to Unlisted hides it from "internet search, Shopify Catalog, and your store's sitemap", and additionally from Shopify-powered collection pages, storefront search results and product recommendations. Where both are set, Shopify states that Unlisted status takes priority. Documented.

Surface Unlisted product status seo.hidden metafield
Internet search Hidden Hidden
Sitemap Hidden Hidden
Storefront search Hidden Hidden
Storefront collections Hidden Still shown
Product recommendations Hidden Still shown
Third-party sales channels Hidden Still shown

Summarised from Shopify's product visibility comparison, Hiding a page from search engines.

That table settles the choice cleanly. If you want a product to exist for people who have the link but disappear from your merchandising, use Unlisted. If you want it out of search but still merchandised on your own site, use the metafield. Most stores that reach for a Shopify noindex snippet actually wanted one of these two, and would have avoided touching theme code.

4. The theme itself

The fourth lever is the largest and the least discussed, because it does not look like a setting. Your theme decides your heading structure, your internal linking, your Shopify canonical tags output, your image handling and most of what a lab speed test measures. Shopify exposes canonical_url as a globally accessible Liquid object (shopify.dev) — documented — but whether your theme actually prints it into a <link rel="canonical"> in the head is a property of the theme you installed, not of the platform. View source on a product page and confirm it before assuming it. Our guide to canonical tags covers what a correct declaration looks like.

Shopify duplicate content and URL structure

Shopify duplicate content is the most reliably over-diagnosed problem on the platform, mostly because the advice about it was written for a much older version of Shopify and has been copied forward ever since.

The Shopify URL structure that generates the concern is real enough. A product is reachable at /products/handle and also at /collections/some-collection/products/handle, so the same product genuinely has more than one address. Two things are worth separating before you spend a day on it. First, whether those addresses resolve to a single canonical target is a question you can answer in thirty seconds by loading the collection-scoped URL and reading the address bar and the page source, and the answer on a current theme is usually that they do. Second — and this is the part the older advice never mentions — the fix, if one is needed, is a theme-level canonical output, which is control four above. It is not an app purchase and not a robots.txt rule.

The related worry is Shopify collection pagination and filtered URLs producing an unbounded set of crawlable addresses. Shopify's documentation describes the default robots.txt as blocking "page content that might otherwise reduce the effectiveness of your SEO strategy by stealing PageRank", and gives the cart page as its worked example. Documented, as far as it goes. What the documentation does not do is enumerate every path in the default file, and the file changes over time. The honest instruction is therefore mechanical rather than remembered: open yourdomain.com/robots.txt and read what is actually disallowed on your store today, then compare it against the parameterised URLs you can see in Search Console's coverage report. That takes two minutes and replaces an assumption with a fact.

For the structural side of the same question — how many collection URLs should exist at all, and which of them deserve to be indexed — collection page SEO and URL structure are the relevant guides. Both are content architecture problems wearing a technical costume.

Shopify SEO friendly URLs: what you can and cannot change

Shopify SEO friendly URLs are a shorter conversation than on most platforms, because the platform decides most of it for you. The /collections/ and /products/ segments are forced and cannot be removed. What you do control is the handle — the last segment — and it is worth setting deliberately: keep it short, keep the words a person would search, and set it before the page earns links, because changing it later means a redirect. The one real trap is products reachable at more than one path; canonical tags handle it, but only if the theme emits them.

Shopify page speed and Core Web Vitals

Shopify page speed splits into a part you do not control and a part you entirely control, and conflating them wastes the most time of anything in this article.

Hosting, TLS termination, CDN delivery of theme assets and server response are Shopify's. You cannot tune them, change them, or move them, and no app claims to. What you control is everything the theme requests once the HTML arrives: the number of apps injecting scripts into every page, image dimensions and formats, third-party fonts, sliders, review widgets, chat bubbles and the marketing tags that accumulate over years without anyone removing one.

Shopify Core Web Vitals scores are therefore, in practice, a measurement of your app stack and your theme rather than of your host. Which makes the useful Shopify site speed optimization exercise unusually concrete: list every app that renders on the storefront, note which are still doing a job, and remove the rest. That is a merchandising and operations decision more than an engineering one, and it moves the number further than anything else available to you. Our guide to Core Web Vitals explains what each metric is actually reading and why field data disagrees with lab tools.

Shopify structured data, schema markup and AI surfaces

Because supported themes already emit microdata, the first question about Shopify structured data is not "how do I add it" but "what do I already have". Run a product URL and a collection URL through Google's Rich Results Test before you install anything that injects markup. Adding a second Product block on top of one your theme already renders is a common and self-inflicted problem, and it is created by exactly the shopping sequence that starts with "I need a Shopify schema markup app".

Where a gap is real, an app that injects through a theme app extension is a reasonable answer, and Shopify SEO tools covers how that category writes and what it leaves behind. The sequence is what matters: test, then buy if the test says so.

Shopify now also documents its own guidance for AI shopping surfaces, which is worth reading precisely because it is unglamorous. Its recommendations for product pages built for AI systems are to "add detailed product specifications and technical details", "include comparison information with similar products" and "add structured data and product attributes" (Shopify Help Center). Documented. Shopify also notes that content aimed at AI crawlers but not useful to customers can sit lower on the page. Nothing there is a new technical control; it is the same completeness that made product pages rank before, applied to a new consumer of the same markup.

Shopify hreflang and international stores

Shopify hreflang follows the platform's usual pattern: it is handled for you if you use the platform's own international features, and it is your problem if you route around them.

Shopify documents that when you use international domains, "sitemap files are generated for all of your domains", and that if you sell in multiple languages "these languages are added automatically to the sitemap files for each of your domains. You don't need to do anything to add them" (Shopify Help Center). Documented. The same documentation adds the requirement people miss: each domain must be verified separately in Search Console and each sitemap submitted separately. It also names the failure mode for stores with spare domains lying around — "if you have multiple domains and aren't using them for international targeting, then make sure all domains redirect to your primary domain."

Verifying that hreflang annotations are present and reciprocal on the rendered pages is still a check worth running, because it depends on your theme and your Markets configuration rather than on the sitemap. But it is a verification task, not a build task.

Documented, versus widely believed

Three claims turn up in almost every article on this subject. Each is worth setting against what the platform's own documentation says.

Believed: "You need to fix Shopify's robots.txt." Documented: Shopify says stores "have a preconfigured and optimized robots.txt.liquid template, so you don't need to make any changes … unless you have a specific reason to do so", and that the default rules "are updated regularly to ensure that SEO best practices are always applied." The template is not even present in a theme until you create it. Editing it is a deliberate act with a maintenance cost, not a hygiene step.

Believed: "You need a schema app." Documented: supported themes and Theme Store themes "include this functionality by default, so you don't need to add any additional code." Test first; you may be buying a duplicate.

Believed: "Shopify crawl budget needs managing." This one is not contradicted by documentation so much as unsupported by it — Shopify publishes no crawl-budget control, and Google's own guidance has long held that crawl budget is not a concern for sites below roughly the low tens of thousands of URLs. Consensus, not documented. For a store with a few hundred products it is not a real constraint, and the hours are better spent on the index bloat question — how many low-value URLs exist at all — which is a structural decision and is genuinely yours.

An audit order that fits the platform

A generic checklist wastes time on Shopify by opening with items the platform has already closed. This order opens with the things that are actually variable.

  1. Read your own robots.txt. Load /robots.txt and read it. This takes a minute and replaces every inherited assumption about what your store blocks.
  2. Confirm the sitemap is submitted. The file exists whether or not you did anything. Confirm it is submitted in Search Console and that the reported page counts are close to your catalogue size.
  3. View source on one product page. Check for a single canonical link, a single H1, and whether structured data is already present. This one page tells you most of what your theme is doing across the whole catalogue.
  4. Compare indexed URLs against intended URLs. Search Console's coverage report against your product and collection counts. A large gap in either direction is the finding; everything above is context for reading it.
  5. List the storefront apps. Every one injects something. This is the Shopify page speed audit and it needs no tooling.
  6. Only then consider theme edits. If steps one to five produced a specific, named problem, fix it in the specific place documented above. If they did not, the gap is not technical, and a technical SEO for Shopify project will not close it.

Step six is the one that decides whether this work is worth doing at all. Most Shopify stores that are not ranking are not being held back by a technical fault; they are being held back by not having a page that deserves to rank for the query. When the audit comes back clean, that is the finding, and the work moves to content architecture rather than configuration.

If you would rather have this run and implemented against your store than run it yourself, our Shopify SEO service page sets out what that covers, and the free SEO audit is the shortest way to see the current state of the site.

Frequently asked questions

Where is the Shopify robots txt file?

It is served at yourdomain.com/robots.txt and generated by Shopify. There is no file to find in your theme by default, because the robots.txt.liquid template that would override it "isn't included in any themes by default" — Shopify generates the output without it. If you want to see what your store currently blocks, load the URL in a browser; that is the live, authoritative answer for your store today.

How to edit Shopify robots txt

Go to Online Store > Themes, open the actions menu on your theme and click Edit code, then create a new file in the Templates folder named exactly robots.txt.liquid. Inside it, loop over robots.default_groups and output the existing rules before adding your own, rather than replacing the file with plain text. Shopify recommends this explicitly because its default rules are updated regularly, and a hand-written file stops inheriting those updates.

Is Shopify duplicate content a real problem?

Far less often than the volume of advice suggests. The concern comes from products being reachable at both /products/handle and /collections/x/products/handle. Before treating it as a problem, load the collection-scoped URL on your own store and check the address bar and the canonical link in the page source. If those resolve to the single product URL, there is nothing to fix. If they do not, the fix is a canonical output in your theme, not an app and not a robots.txt rule.

How do I add a Shopify noindex tag?

Add a conditional meta robots tag to the <head> of layout/theme.liquid, scoped either by template or by handle. Shopify documents both patterns. Before doing that, check whether Unlisted product status or the seo.hidden metafield does what you want instead — both are admin settings rather than theme code, and the metafield also removes the resource from your sitemap, which a head tag does not.

Do I need an app for technical SEO for Shopify?

For most of what is described here, no, because the controls are native. The exceptions are bulk operations across a large catalogue and structured data gaps your theme genuinely does not fill. Test what your theme already emits with Google's Rich Results Test before buying anything that injects markup, or you may pay to duplicate output you already have.

How do I improve Shopify page speed?

Work on the part you control. Hosting, CDN and server response are Shopify's and are not tunable. Your theme and your installed apps are yours, and on most stores the storefront app stack is the largest single contributor. Audit which apps still do a job and remove the rest, then address image dimensions, fonts and third-party embeds. Lab scores will still move around; treat field data as the measurement that counts.

Back to blog

Leave a comment

Please note, comments need to be approved before they are published.