Skip to content
TurboIndex

Shopify Indexing Problems: Causes and Fixes

Why Shopify pages do not get indexed and how to fix it: duplicate collection product URLs, robots.txt.liquid, the password page, sitemap.xml and thin pages.

September 15, 20269 min read

Most Shopify indexing problems come from a short list: the storefront password is still on, the theme links to duplicate /collections/.../products/... URLs, someone edited robots.txt.liquid badly, or the store produces large numbers of thin or duplicate pages (tags, vendors, variants) that Google crawls and skips. Shopify handles plenty of technical SEO for you, including the sitemap and canonical tags, so the work is mostly about not fighting the platform and cleaning up what it generates.

Start here: is the store open to Google?

Password protection

A store behind the password page cannot be crawled. Every URL leads to /password, and Shopify's help centre notes that the sitemap cannot be read while the store is private either.

Check: open the store in a private browser window. If you see a password form, so does Googlebot.

Fix: Shopify admin > Online Store > Preferences, find the password protection section and turn it off. You need to have picked a paid plan first. Stores on a trial stay behind the password page until then.

If a store stayed locked for weeks after you submitted it to Search Console, expect "Page with redirect" and "Excluded by 'noindex' tag" entries from that period. They clear as Google recrawls.

Domain setup

In Settings > Domains, make sure your custom domain is the primary one and that traffic from the other domains, including yourstore.myshopify.com, redirects to it. Otherwise Google may index the myshopify.com address.

Test the four variants (http, https, www, non-www) with the Redirect Checker. Each should end at the primary domain in one or two hops.

Search Console

  1. Add a Domain property for your custom domain and verify by DNS TXT record at your domain provider. If the domain was bought through Shopify, DNS is managed under Settings > Domains.
  2. Or add a URL-prefix property and paste the HTML tag into theme.liquid, directly after the opening <head>.
  3. Sitemaps > Add a new sitemap: enter sitemap.xml.
  4. Inspect the homepage and click Request indexing.

The Shopify sitemap

Shopify generates /sitemap.xml automatically. It is a sitemap index that points to child sitemaps for products, collections, pages and blogs. According to Shopify, it contains your products, primary product images, pages, collections and blog posts, and it updates automatically when you add content. Stores with international domains get a sitemap per domain.

Things to know:

  • You cannot edit it, add URLs to it, or remove individual URLs except by unpublishing or hiding the resource.
  • Hidden resources (see the seo.hidden metafield below) and unlisted products are left out.
  • Pages created by apps on proxy URLs such as /apps/... or /a/... are not included. If an app builds landing pages you want indexed, they need strong internal links, and many apps provide their own sitemap that you can submit separately.

Validate what Google receives with the XML Sitemap Validator. To get every URL as a list for auditing, use the Sitemap URL Extractor.

Duplicate product URLs from collections

This is the classic Shopify problem. A product is reachable at its real URL:

https://example.com/products/trail-shoe-x2

and also at one collection-aware URL for every collection it belongs to:

https://example.com/collections/trail-shoes/products/trail-shoe-x2
https://example.com/collections/sale/products/trail-shoe-x2
https://example.com/collections/mens/products/trail-shoe-x2

Shopify puts a canonical tag on all of them pointing to the /products/ URL, so Google nearly always indexes the right one. In Search Console the others appear as "Alternate page with proper canonical tag", which is the intended outcome. See alternate page with proper canonical tag.

It is still worth fixing, because:

  • Google crawls several URLs per product. On a catalogue of thousands, that is a lot of wasted fetches, and new products get picked up more slowly.
  • Your internal links all point at non-canonical URLs, while the canonical URL may have no internal links at all and rely on the sitemap. Internal links are one of Google's canonical signals, so you are sending mixed messages.
  • Sometimes Google ignores the canonical and indexes a collection-aware URL.

Check: on a collection page, hover over a product and look at the link. Or run the collection URL through the Page Link Extractor and see whether product links contain /collections/.

Fix: in the theme code, find the product card snippet (often card-product.liquid, product-card.liquid or product-grid-item.liquid) and look for:

<a href="{{ product.url | within: collection }}">

Change it to:

<a href="{{ product.url }}">

Duplicate the theme first and test on the copy. Several current themes already link directly, so you may find nothing to change. One trade-off: collection-aware URLs are what let a theme show "back to collection" breadcrumbs. If you depend on that, decide whether the navigation feature is worth the duplicate crawling.

Other duplicate and thin URL patterns

Pattern Example Default handling What to do
Variants /products/x?variant=123 Canonical to /products/x Nothing, working as intended
Collection tag filters /collections/shoes/red and /collections/shoes/red+wide Combined tags (+) are disallowed in robots.txt, single tag pages are crawlable Noindex single tag pages unless they are real landing pages with demand
Sorting /collections/shoes?sort_by=price-ascending Disallowed in the default robots.txt Nothing
Storefront filters /collections/shoes?filter.v.option.color=Red Canonical to the collection Do not link to them from navigation. See faceted navigation and indexing
Pagination /collections/shoes?page=2 Crawlable Leave crawlable, it is how Google reaches deep products
Vendor and type pages /collections/vendors?q=Brand Crawlable, thin Build real brand collections and link to those instead
Internal search /search?q=... Disallowed Nothing
Policy pages /policies/... Disallowed Nothing
Blog tag pages /blogs/news/tagged/x Crawlable, thin Noindex or use few tags

Two other sources of thin pages are specific to shops:

  • Manufacturer descriptions. If 200 other retailers show the same paragraph, Google has little reason to index your copy. Write your own for at least your most important products.
  • Empty or near-empty collections. A collection with one product is a thin page. Merge it or noindex it.

More on the quality side in thin content and indexing.

Editing robots.txt.liquid safely

Shopify serves a default robots.txt that already blocks the admin, cart, checkout, internal search, policy pages, sorted collections and combined tag filters. Shopify's explanation is that this keeps search engines focused on your unique content.

You can customise it:

  1. Online Store > Themes, click the ... button next to your theme, then Edit code.
  2. Add a new template, choose robots, then Create template. This creates templates/robots.txt.liquid.
  3. Edit and save. Check the result at yourdomain.com/robots.txt.

Shopify labels this an unsupported customisation and warns that incorrect use can result in loss of all traffic. Its support team will not help with edits. Treat it accordingly.

The right way to add a rule is to keep the default output and append to it, not to replace the file with static text:

{% for group in robots.default_groups %}
  {{- group.user_agent }}

  {%- for rule in group.rules -%}
    {{ rule }}
  {%- endfor -%}

  {%- if group.user_agent.value == '*' -%}
    {{ 'Disallow: /collections/vendors*' }}
    {{ 'Disallow: /*?q=*' }}
  {%- endif -%}

  {%- if group.sitemap != blank -%}
    {{ group.sitemap }}
  {%- endif -%}
{% endfor %}

Common mistakes:

  • Pasting a static robots.txt from a blog post. You lose Shopify's defaults and their future updates.
  • Blocking /collections/ or /products/ while trying to block one subpath.
  • Blocking URLs that you also want noindexed. Google cannot read a noindex tag on a page it may not crawl. See noindex vs robots.txt vs canonical.
  • Blocking theme assets or the CDN paths. Google needs CSS and JavaScript to render.

After any edit, test real URLs with the Robots.txt Tester: one product, one collection, one blog post and the homepage. To go back to the default, delete the robots.txt.liquid template.

Hiding pages from Google on purpose

Shopify documents three methods.

1. Conditional meta tag in theme.liquid, inside <head>:

{% if handle contains 'page-handle-you-want-to-exclude' %}
  <meta name="robots" content="noindex">
{% endif %}

For whole templates, use a condition such as {% if template contains 'search' %}.

2. The seo.hidden metafield. Go to Settings > Metafields and metaobjects (the label varies a little by admin version), select the resource type, Add definition, with namespace and key seo.hidden, type Integer. Set the value to 1 on a product, page, collection or article. Shopify then adds noindex and removes the item from the sitemap.

3. Unlisted product status. For products, Shopify's preferred route. Unlisted products are hidden from search engines, the sitemap, collections and storefront search, while the direct link still works.

The reverse problem is frequent: an app or a previous developer set seo.hidden or added a noindex condition, and pages you want are excluded. If Search Console shows "Excluded by 'noindex' tag" for real products, search theme.liquid for noindex and check the metafields on those products.

Redirects when things change

Shopify's URL structure is fixed (/products/, /collections/, /pages/, /blogs/), and only the handle can be edited. When you change a handle, tick the option to create a URL redirect in the search engine listing section. For deleted products, add a redirect by hand on the URL redirects screen (search for "URL redirects" in the admin search bar) to the closest replacement or the parent collection.

Do not redirect all discontinued products to the homepage. Google tends to treat that as a soft 404. A product that is temporarily out of stock should stay live, returning 200 with its availability markup updated.

When moving to Shopify from another platform, every old URL changes. Follow the site migration indexing checklist.

Troubleshooting by Search Console status

Status in Page indexing report Likely Shopify cause Action
Alternate page with proper canonical tag Collection-aware product URLs, variants, filters Normal. Fix theme links to cut the volume
Duplicate, Google chose different canonical than user Near-identical products (one product per colour), copied descriptions Merge into variants or differentiate the content
Crawled - currently not indexed Thin products, tag pages, vendor pages Improve or noindex
Discovered - currently not indexed Large catalogue, weak internal links, new store Link products directly, improve collection structure, earn links
Blocked by robots.txt Default rules (fine), or a bad robots.txt.liquid edit Test the URL, revert bad rules
Excluded by 'noindex' tag seo.hidden, theme condition, app Find and remove the source
Page with redirect Old handles, myshopify.com domain, password period Normal
Not found (404) Deleted products without redirects Redirect those with links or traffic

Each status is explained in the Page indexing report guide.

Helping new products get indexed faster

  • Link new products from the homepage or a "New arrivals" collection in the main navigation on the day they go live.
  • Keep collections shallow: home > collection > product.
  • Use direct /products/ links, as described above.
  • Fill in the Search engine listing (title and description) for each product. Ideas in title tags and meta descriptions.
  • Make sure the theme outputs valid Product structured data. Most do. Check with Google's Rich Results Test.
  • Request indexing in Search Console for a few priority products. For a big catalogue, a tool such as TurboIndex can read the Shopify sitemap, submit new URLs within Google's daily quotas and track each URL's status through the URL Inspection API. No tool can guarantee indexing, and Google's Indexing API is officially meant for job posting and livestream pages only.

Frequently asked questions

Why is my Shopify store not showing up on Google?
The usual causes are that the store still has password protection on, the store is new and has no links yet, or it has not been verified in Search Console with the sitemap submitted. Remove the password, verify the domain, submit /sitemap.xml and request indexing for the homepage.
Where is the Shopify sitemap and can I edit it?
Shopify generates it automatically at /sitemap.xml on your primary domain, with child sitemaps for products, collections, pages and blog posts. You cannot edit it by hand. It updates when you publish, unpublish or hide content.
Are the /collections/.../products/... URLs a duplicate content problem?
They are duplicates of the /products/ URL, and Shopify adds a canonical tag pointing to the /products/ version, so Google normally folds them together. They still waste crawling and weaken internal link signals, so it is better to make your theme link straight to /products/ URLs.
How do I noindex a page on Shopify?
Shopify documents two methods: add a conditional robots noindex meta tag in theme.liquid, or create an integer metafield with namespace and key seo.hidden and set it to 1 on the resource, which also removes it from the sitemap. For products, Shopify also offers the Unlisted status.
Can I edit robots.txt on Shopify?
Yes, through a robots.txt.liquid theme template. Shopify calls it an unsupported customisation and warns that incorrect use can result in loss of all traffic, so make small, tested changes and keep the default rules.

Keep reading