Home Blog SEO
SEO

Shopify SEO Mistakes: The 12 Most Common (and How to Fix Them)

The 12 SEO mistakes I keep finding on Shopify audits: canonicals, variants, robots.txt.liquid, sitemap, alt text. With code and concrete fixes.

Lionel Fenestraz · 8 May 2026 · 19 min read · Updated: May 2026
SEO audit dashboard for a Shopify store showing common canonical, variant, and sitemap errors flagged in Google Search Console
In this article

Most of the Shopify SEO playbooks floating around the internet are, frankly, recycled WordPress playbooks. You can tell pretty fast: they mention functions.php, editing .htaccess, installing SEO plugins. None of that exists on Shopify. And the difference isn’t cosmetic, it’s structural. Shopify has its own set of limits, and its own shortcuts. Follow the wrong manual and you waste time fighting things the platform already handles, while ignoring the actual issues that do drag your rankings down. That tension is what this post tries to resolve.

I’ve spent a few years doing Shopify-specific SEO audits. Here are the 12 mistakes I run into most often, roughly ordered by impact and how easy they are to fix. Some you can tick off your list in under 10 minutes. Others mean editing Liquid or reviewing apps one by one. All of them are concrete: code, fix, verification. If you’d rather get the platform context first, my post on Shopify SEO vs WordPress SEO covers the structural differences.

In 30 seconds:

  • Three mistakes take under 10 minutes to fix and move rankings in two or three weeks: empty alt text, duplicate collection meta descriptions, and indexed /search pages
  • Shopify has allowed editing robots.txt via robots.txt.liquid since June 2021 (Shopify Help Center)
  • The Dawn theme ships with automatic Product/Offer schema on product pages (Shopify.dev)
  • Core Web Vitals (LCP, INP, CLS) are an official ranking factor per Google Search Central
  • Most of these issues don’t show up in the Shopify admin panel: you have to read the XML sitemap or view source by hand

Broken canonical tags on paginated collections

In the audits I’ve run this year, this is the mistake that pushes the most junk URLs into Google’s index. Shopify paginates collections with ?page=2, ?page=3, and so on. By default, and according to the Shopify Help Center documentation on canonical URLs, the canonical points to the parameter-free URL, which is correct. But plenty of third-party themes break that.

The broken pattern I keep seeing: /collections/t-shirts?page=2 returns a canonical pointing to /collections/t-shirts?page=1, creating a chain. Google, per Google Search Central on canonicalization, treats chains as a weak signal and can ignore the canonical entirely. The result: paginated pages competing with one another.

How to spot it

Open /collections/your-collection?page=2 in the browser, right click, “View page source”. Look for <link rel="canonical". If it points to ?page=1 or back to the same paginated URL, it’s broken.

The Liquid fix

Open your theme, go to layout/theme.liquid, and find the canonical tag. Replace it with something like this:

{%- if template contains 'collection' and current_tags == blank -%}
  <link rel="canonical" href="{{ canonical_url | split: '?' | first }}">
{%- else -%}
  <link rel="canonical" href="{{ canonical_url }}">
{%- endif -%}

This forces the canonical on every paginated collection page to point to the base URL, no query string. After pushing live, verify in Google Search Console with the URL Inspection tool that Google recognises the correct canonical.

Shopify generates canonical tags automatically on paginated collections per its Help Center, but third-party themes often overwrite that behaviour. Google treats canonical chains as a weak signal, as explained in its canonicalization guide.


Empty meta descriptions on collections

Shopify doesn’t generate automatic meta descriptions on collection pages. Its own Shopify Help Center SEO guide confirms it: you write them, or they don’t exist. When you don’t, Google pulls random snippets from the HTML, usually from the menu or the footer. On the collection pages of a cosmetics brand I audited in early 2026 with 200+ SKUs, 17 of 23 active collections had no meta description. Google was literally displaying navigation text in the snippets.

That’s CTR you’re leaving on the table. And CTR is an implicit quality signal.

The fix

For each collection, go to Online Store > Collections > [name] > Edit search engine listing preview. Write 140-155 characters that answer intent: what’s in the collection, entry price, differentiator. Example: “Organic cotton t-shirts from $28. 40 styles, 2-day shipping, free returns. Shop online at [brand].”

If you have 100+ collections, apps like SEO Manager or Smart SEO let you generate them in bulk with templates. In my experience, I’d rather hand-write the top 20 by traffic and use a template for the long tail.

How to verify

Once live, search site:yourdomain.com/collections/ on Google and look at the snippets. If you still see menu text, flush the Shopify cache (refreshes within hours) and request a recrawl in GSC.


Why do product variants get indexed on their own?

Shopify product pages generate URLs like /products/t-shirt?variant=43281. According to Shopify’s documentation on products and variants, the canonical on those variants should point to the parent product, but many custom themes (especially those adding color or size pickers with custom JS) break that behaviour.

On the audit I mentioned, I found 89 variant URLs indexed that shouldn’t have been. They were competing with each other and with the main product page.

The concrete fix

Open your product template (sections/main-product.liquid on modern themes like Dawn) and find the canonical. If it’s not forced to the parent product, add it in layout/theme.liquid:

{%- if template contains 'product' -%}
  <link rel="canonical" href="{{ shop.url }}{{ product.url }}">
{%- else -%}
  <link rel="canonical" href="{{ canonical_url }}">
{%- endif -%}

That way, even if the user lands via ?variant=1234, the canonical always points to the main page. Verify with site:yourdomain.com/products/ inurl:variant on Google: if results are still showing after two weeks, check whether a variant app is injecting its own <link>.

On that same brand, the “Color Swatches” app was duplicating the canonical with a different value. Uninstalling it and applying the Liquid fix dropped indexed URLs from 680 to 320 in four weeks.


Product titles identical to the H1

I see this on almost every new store. Shopify, with Dawn as default, prints the same text in <title> and <h1>. If your product is called “Organic white t-shirt”, that’s what Google sees in both. Technically it’s not an error: Google processes <title> and <h1> separately. But you’re wasting the <title>, which is where you pack commercial intent (brand, category, pitch).

How to spot it

Inspect any product page. Compare the <title> to the visible <h1>. If they’re word-for-word identical, you’re losing the opportunity.

The fix

In layout/theme.liquid, find <title> and change it for product pages:

{%- if template contains 'product' -%}
  <title>{{ product.title }} | {{ product.vendor }} | {{ shop.name }}</title>
{%- else -%}
  <title>{{ page_title }}{% if current_tags %} &ndash; tagged "{{ current_tags | join: ', ' }}"{% endif %}{% if current_page != 1 %} &ndash; Page {{ current_page }}{% endif %}{% unless page_title contains shop.name %} &ndash; {{ shop.name }}{% endunless %}</title>
{%- endif -%}

This adds vendor and store name to <title> without touching the visible H1. If you run a category system with metafields, you can slot the category in too. Less is more: 60 visible characters max in the SERP, according to the testing regularly published by Moz.

What if I use an SEO app?

Then set the template from the app and disable the theme override. Never duplicate the logic: one source of truth, always.


Robots.txt you used to be unable to touch

Until June 2021, Shopify didn’t let you edit robots.txt directly. Since then, the platform has allowed creating a robots.txt.liquid file in the theme for surgical overrides. The Shopify Help Center announced it in its official guide to editing robots.txt. Plenty of people still don’t know that option exists.

When to touch it

If you have indexed internal search pages (/search?q=), if you want to block a specific collection from crawlers, or if you inherited legacy URLs that shouldn’t be crawled. Don’t touch it without a clear reason.

The fix

In the theme editor, create templates/robots.txt.liquid and add what you need. Example for blocking internal search and one specific collection:

{% for group in robots.default_groups %}
{{- group.user_agent }}
{%- for rule in group.rules -%}
{{ rule }}
{%- endfor -%}
{%- if group.user_agent.value == '*' -%}
Disallow: /search
Disallow: /collections/do-not-publish
{%- endif -%}
{%- if group.sitemap -%}
{{ group.sitemap }}
{%- endif %}
{% endfor %}

The {% for group %} structure preserves Shopify’s default rules (which are pretty sensible) and only appends yours. Don’t overwrite the full file: you’d break the admin and checkout blocks.

Verification

After publishing, open yourdomain.com/robots.txt in a browser and look for your new lines. Then go to GSC > Settings > robots.txt tester to confirm Google reads them.

Frequency of SEO errors in Shopify audits Qualitative observations, not a statistical study Empty alt text Very frequent Duplicate meta desc. Very frequent Indexed variants Frequent Canonical chains Frequent Apps duplicating schema Frequent Indexed /search Moderate Title = H1 verbatim Moderate Broken handle links Moderate Schema on custom pages Occasional Incomplete sitemap Occasional Legacy /blogs/news/ URLs Occasional

Empty alt text on product images

Shopify doesn’t force you to write alt text when you upload images. Per the official Shopify accessibility guide, the field is there, but optional. The consequence: 90% of the stores I audit have gaps. On the cosmetics brand I mentioned earlier, 38 of 212 products had empty alt text on at least one image. We fixed it in bulk in 30 minutes. ### Why it matters

Two reasons. First, Google Images still drives real traffic to ecommerce, especially in cosmetics, fashion and home decor. Without alt text, your products don’t rank for visual searches. Second, accessibility: screen reader users need that information. Google rewards accessibility as part of page experience.

The bulk fix

If you have few images, edit by hand. If you have hundreds, use an app like Alt Text Optimizer or Image SEO Optimizer, or a script via API. Typical template: “{product} - {color/variant} - {brand}”. Example: “Organic white t-shirt - size M - [brand]”. No keyword stuffing. Natural description that helps someone who can’t see the image.

Verification

Audit with a crawler like Screaming Frog (free up to 500 URLs) or whatever app you use, filtering for images without alt. Repeat quarterly: every time you upload a new product, the alt starts out empty.


Sitemap limits: what Shopify leaves out

The Shopify sitemap is automatic and generated at /sitemap.xml. It includes products, collections, pages and blog posts. What it doesn’t include well, or at all: hreflang pages in certain setups, blog tags as standalone entities, or custom subroutes created via apps. You can’t edit it manually: Shopify doesn’t allow that.

In my experience, the sitemap “just works” for about 85% of cases. The problem shows up with Shopify Markets running multiple languages, where only the primary market URLs get listed in the main sitemap. Google figures it out, but you wait longer for full indexation.

The practical fix

Three steps. One, in GSC, submit the main sitemap and the per-language sitemaps if you use Markets (Shopify generates them at /sitemap_*.xml). Two, if you have important custom pages that aren’t listed, use GSC’s “URL Inspection” to force manual indexation one by one. Three, never install an app that tries to “improve” the sitemap by overwriting it: you’ll end up with two contradictory sitemaps.

Verification

Visit yourdomain.com/sitemap.xml and eyeball the URL count. Compare to the number of products + collections + pages + blog posts you see in the admin. The gap tells you what’s missing.


Blog URLs stuck on /blogs/news/

Shopify creates a default blog named “News” by default and dumps posts at /blogs/news/your-article. Two problems. One, the “news” slug says nothing about what you publish: if your blog is about SEO guides, the path /blogs/news/ is semantically misleading. Two, the plural /blogs/ structure is uncommon and can trip up users who type URLs by hand.

The fix

In Online Store > Blog posts > Manage blogs, create a new blog with whatever handle you want (for example guide, resources, learn). Move the posts there. Shopify automatically generates 301 redirects from the old URL to the new one, per the Shopify Help Center documentation on URL redirects.

Verify the redirects from GSC or with curl -I: the old URL should return 301, not 404 or 200. If it returns 200, the move hasn’t propagated and you’re cannibalising.


Missing schema markup on custom pages

Dawn generates automatic Product and Offer schema on product pages, per the Shopify.dev documentation on product templates. So far, so good. The issue shows up on custom pages: “About us”, “Contact”, blog articles with FAQ or HowTo structure. Dawn doesn’t add schema there. You have to do it yourself.

The fix for FAQ Schema on a custom page

In the custom page template (sections/page.liquid or similar), add this right before the closing </body> or inside the <head>:

{%- if page.handle == 'faq' -%}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How long does shipping take?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Between 24 and 72 business hours within the continental US."
      }
    }
  ]
}
</script>
{%- endif -%}

Verification

Use the Google Rich Results Test by pasting the public URL. It should detect a valid FAQPage with no errors.


When you edit a product handle on Shopify (the URL slug), the platform creates an automatic 301 redirect from the old URL to the new one. Fine. What it doesn’t update: internal links you’ve placed in other product descriptions, blog posts or custom pages. Those still point to the old handle, hop through the redirect, and every hop weakens the signal.

How to spot it

Audit with Screaming Frog or ahrefs Site Audit. Filter by “Internal 301”. Every link in there is a link you should update so it points straight to the final destination.

The fix

Manually edit links in product descriptions, posts, and pages. There’s no Shopify shortcut for this. There are apps like Broken Link Manager, but in my experience it’s usually faster to do it by hand if you have fewer than 50 links to fix.

What if I’m changing lots of handles?

Plan for it. Do all the changes in one window (an afternoon), then audit, then correct internal links as a batch. Don’t change handles one at a time over months: you pile up chained redirects that take hours to clean.


Indexed internal search pages

Shopify generates URLs like /search?q=white+t-shirt when a user searches. If you don’t block them, those URLs can end up in Google’s index. The result: low-quality snippets with thin product listings, thin content and spiders crawling infinite paths. Google documents this as a classic crawl budget problem in its guide to crawl budget management.

The quick fix

Add this line to the robots.txt.liquid file you created earlier:

{%- if group.user_agent.value == '*' -%}
Disallow: /search
{%- endif %}

Alternatively, if you prefer noindex (lets the page be crawled but not indexed), add this in layout/theme.liquid:

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

The difference is subtle. Disallow prevents crawling (more efficient for crawl budget). noindex allows crawling but blocks indexing (more flexible if you want internal links on those pages to keep passing equity). In most stores I go with noindex,follow.

Verification

Use site:yourdomain.com inurl:search on Google. If results keep showing after two or three weeks, request removal from GSC > Removals.


Are your SEO apps stepping on each other?

This is the quietest mistake and, in my experience, the most underestimated. You install one app for schema (JSON-LD for SEO), another for canonicals (Smart SEO), another for sitemap (Sitemapper Pro), and each injects its own code into <head>. What the user sees on the front end is a soup of duplicated tags: two different canonicals, two schema blocks that contradict each other, three meta titles.

On the cosmetics brand, I counted 4 different apps touching <head>. Two were injecting Product schema with stale prices, one had a canonical pointing to a different URL than the theme’s, and the fourth was duplicating Open Graph. Google was ignoring a good chunk of the signal because it didn’t know which source to trust.

How to spot it

View the page source of a product page (not the JS-rendered HTML, the original HTML). Search for occurrences of <link rel="canonical", <script type="application/ld+json">, <meta property="og:. If any appears more than once, you have a conflict.

The fix

One SEO app per function. Disable the rest and check whether anything essential breaks. If the theme already handles schema and canonical (Dawn does it well), many apps are redundant. The rule I apply: one schema app if you need types Dawn doesn’t cover, one redirects/sitemap app only if Shopify native falls short, and nothing else. I’ve seen stores gain rankings just by uninstalling three SEO apps and letting the theme do its job.

Verification

After uninstalling, wait 7-10 days and check the source again. Use Rich Results Test and Schema.org’s Schema Markup Validator to confirm you still have the schema you want, without duplicates.


What should you prioritise if you only have one afternoon?

If I had to give you a priority list, in this order: first, robots.txt.liquid to block /search and any junk path. Second, review canonicals on product and collection pages (the code above). Third, bulk alt text with an app or in batch. Those three fixes take an afternoon and resolve most of the technical damage on an average Shopify store.

What you leave for later: schema on custom pages, updating internal links after handle changes, and the app audit. Important, not blocking. If you’re looking at a Shopify store with 500+ products and nothing has ever been touched, budget two to three weeks of proper work, not one afternoon.

Audit priority on a Shopify store comes down to opportunity cost: per Google Search Central, junk URLs burn crawl budget and delay indexation of the pages that actually matter. That’s why blocking /search and phantom variants is usually the first profitable move.


Want an expert review of your Shopify?

If you suspect your store has several of these errors stacked up, or you’re planning a migration and want to avoid tripping over them, a Shopify-specific SEO audit surfaces the quick pain points in one session. You can book a 30-minute session with no commitment to review your case.

30-min session · No commitment · Book a call


Frequently asked questions

How many of these errors does an average Shopify store have?

It depends on the theme’s condition and the number of apps. In my experience, a store that’s never been through an SEO audit has between 5 and 8 of the 12 errors described active. A store with an in-house technical team or well-configured SEO apps usually drops to 2 or 3, generally around advanced canonicals or schema on custom pages. The most persistent ones are empty alt text and duplicate meta descriptions on collections: they need ongoing maintenance.

Can I edit robots.txt on Shopify without code?

Yes, since 2021. You need to create a robots.txt.liquid file in the theme editor (Online Store > Themes > Edit code > Templates > Add a new template). It doesn’t require programming skills, but it does mean copying the base template correctly, per the Shopify Help Center. If you overwrite the whole file without using {% for group in robots.default_groups %}, you break the defaults and may accidentally deindex entire areas.

Does Dawn generate all the schema I need?

Usually yes for product pages. Dawn includes Product, Offer and AggregateRating per the official Shopify.dev documentation. Where it falls short: schema for custom pages (FAQ, HowTo, Recipe, LocalBusiness), Article schema with structured author data, and some Review cases with advanced fields. For those you’ll need to add manual JSON-LD via a Liquid snippet or use an app like JSON-LD for SEO.

Is a Shopify SEO app worth paying for?

It depends what you’re trying to solve. For bulk alt text, meta description templates, mass redirects or advanced schema, a well-chosen app saves time and avoids mistakes. For canonicals and sitemap, Shopify native is usually enough. I recommend starting without SEO apps, fixing what you can in the theme, and only installing an app when you have a concrete problem the theme can’t solve. Usually cheaper and cleaner.

Can I do the audit myself?

Yes, if you have basic technical SEO knowledge. Free tools: Screaming Frog (up to 500 URLs), Google Search Console, PageSpeed Insights, Rich Results Test. A reasonable order: full crawl with Screaming Frog, review canonicals, titles and meta descriptions, validate schema, review Core Web Vitals in GSC, audit apps installed in Shopify admin. If you find more than 4-5 serious errors, an external review may pay off so you don’t work blind.


To wrap up

Shopify SEO isn’t harder than WordPress SEO, but it is different. The platform takes some problems off your plate (hosting, basic schema, out-of-the-box speed) and hands you others (canonicals mangled by apps, rigid sitemap, a robots.txt you couldn’t touch until 2021). Most stores I audit have the same 4 or 5 errors repeating, and almost all of them are fixable in under an afternoon if you know where to look.

If I had to leave one piece of advice: before installing an SEO app, see what your theme does by default. Dawn, from 2021 onwards, does its job pretty well. Plenty of apps solve problems you don’t have, and create conflicts you will have later. Less is more, in <head> too.

If you need help auditing yours, or deciding what to fix first, a Shopify-specific SEO audit saves you weeks of trial and error.


Sources referenced: Shopify Help Center, Shopify.dev, Google Search Central, Moz, Schema.org.

Lionel Fenestraz — Freelance Google Ads & Meta Ads Consultant
Lionel Fenestraz
Freelance PPC & CRO Consultant · Google Partner · CXL Certified · Google Ads Search Certified
7+ years managing Google Ads and Meta Ads for vacation rental, B2B and ecommerce. Trilingual ES/EN/FR.
Free first call

Could your ad campaigns
perform better?

30 minutes to review your situation and tell you exactly what I would change. No pitch, no sales proposal.

Book a call →
30 min · Google Meet · No commitment