
Shopify builds several SEO basics into every store before anyone changes a setting. Every store automatically generates a sitemap (opens in new tab), ships a default robots.txt file (opens in new tab), gets auto-generated canonical tags (opens in new tab), and runs on themes that include structured data by default. So an ecommerce SEO audit on Shopify is a short list of checks. Each check looks for a place where a theme, an app or a merchant decision has broken or bypassed one of those defaults, or reads a Search Console report the way Google defines it.
BLKDG builds Shopify stores, so the checks below start from what the platform does by default and work outward to the theme and apps. If rankings have already fallen, diagnose the ranking drop first. A drop diagnosis looks for what changed, and an audit looks for what’s misconfigured, so the two start from different evidence.
Start An Ecommerce SEO Audit In The Page Indexing Report
The goal in the Page indexing report (opens in new tab) is to get the canonical version of every important page indexed. Duplicate or alternate pages shouldn’t be indexed. A Shopify store fills the duplicate and alternate buckets as a matter of course, because the platform can serve one product at several URLs. A page marked duplicate or alternate is usually a good thing (opens in new tab): it means Google has found the canonical page and indexed it.
So read the report by status, not by its total. Collection-scoped and variant URLs that point their canonical at /products/ are expected to fill the duplicate and alternate buckets (opens in new tab). “Duplicate without user-selected canonical” deserves a look on Shopify, though: it’s a page that doesn’t indicate a preferred canonical page, and Shopify themes output a canonical tag by default.
The status to open on product URLs is “Duplicate, Google chose different canonical than user.” The page is marked as canonical for a set of pages, but Google thinks another URL makes a better canonical.
For any product URL in that status, the URL Inspection tool (opens in new tab) shows the canonical you declared next to the one Google picked. A URL under “Crawled – currently not indexed” (opens in new tab) may or may not be indexed in the future, and there’s no need to resubmit it for crawling. “Discovered – currently not indexed” typically means Google wanted to crawl the URL but expected that to overload the site, so it rescheduled the crawl. A large share of URLs in that last status is one of the three kinds of site Google aims its crawl budget advice at, which gets its own section below.
How do you conduct an effective ecommerce SEO audit on a Shopify store? Start with the reports Google defines, then check each Shopify default in the order below: duplicate URLs and canonicals, filters and tags, robots.txt, crawl budget where it applies, sitemaps, redirects, pagination, structured data, on-page basics, Core Web Vitals and international setup. The first three apply to every store. The rest depend on what the store has installed and how it sells.
Duplicate URLs And Canonical Tags In A Shopify SEO Audit
Shopify can put the same product at more than one path. The Liquid within filter (opens in new tab) generates a product URL within the context of the provided collection, in the form /collections/sale-potions/products/draught-of-immortality. A standard product page and a product page in the context of a collection have the same content on separate URLs, so using the filter has SEO implications to consider.
Whether a store has this problem depends on the theme. Shopify’s reference theme Dawn links product cards with {{ card_product.url }} and no within filter in its card-product.liquid snippet (opens in new tab), so on Dawn the collection grid links to the /products/ path. A theme or app that adds within puts the collection-scoped path into every internal link on the grid. Google recommends the opposite: when linking within your site, link to the canonical URL rather than a duplicate URL (opens in new tab).
Duplicates aren’t a penalty. Some duplicate content on a site is normal (opens in new tab) and it’s not a violation of Google’s spam policies, and indicating a canonical preference is a hint, not a rule. Google crawls the canonical page most regularly and crawls duplicates less frequently to reduce the crawling load on sites, so whichever URL Google treats as canonical gets the most crawl attention.
Google ranks the signals it uses (opens in new tab). A redirect is a strong signal that the target of the redirect should become canonical, a rel="canonical" annotation is a strong signal that the specified URL should become canonical, and sitemap inclusion is a weak signal that helps the URLs included in a sitemap become canonical. Internal links pointing at a duplicate path work against that page’s own canonical tag.
What the canonical tag did on one live store. On a live Shopify store, the collection-scoped product URL returned a 200 and its canonical tag pointed at the /products/ URL. A ?variant= URL on the same product did the same, which is what Google recommends: if you use optional query parameters to identify variants, use the URL with the query parameter omitted as the canonical URL (opens in new tab).
That’s one store on a custom theme, on one day. Liquid’s canonical_url object (opens in new tab) returns the canonical URL for the current page.
So the check is direct. View source on one product through /products/<handle>, through /collections/<collection>/products/<handle> and through a ?variant= URL, and confirm each page carries exactly one canonical pointing at /products/<handle>. The standard implementation (opens in new tab) is <link rel="canonical" href="{{ canonical_url }}" /> inside <head>, and Dawn’s theme.liquid (opens in new tab) uses the same object. A theme that hardcodes or rewrites that tag, or an SEO app that injects a second one, is what breaks the default, and Google advises against specifying different URLs as canonical for the same page (opens in new tab) using different canonicalization techniques.
Google’s view of URL structure on an ecommerce platform (opens in new tab) is that the platform has most likely already considered these issues for you. On Shopify that holds for the URL design itself. The audit confirms that nothing installed since has undone it.
Don’t reach for noindex to force a canonical, either. Google advises against using noindex to prevent selection of a canonical page (opens in new tab) within a single site, because it will completely block the page from Search.
Faceted Navigation And Tag Pages: An Ecommerce Technical SEO Decision
When filters are applied, they’re reflected in the collection or search URL through URL parameters (opens in new tab), in the form filter.p.product_type=Shoes for a product-level filter. Parameter-based faceted navigation can generate infinite URL spaces (opens in new tab), and the costs are overcrawling and slower discovery crawls. If you don’t need the faceted navigation URLs potentially indexed, Google’s advice is to prevent crawling of these URLs.
Shopify’s default robots.txt covers part of this. The Disallow: /collections/*+* rule (opens in new tab) keeps filtered collection pages from being crawled, because they duplicate content that’s already on the collection page, and the sort_by rule blocks sorted views. The robots.txt served by Shopify’s own sample store (opens in new tab) also disallowed /collections/*filter*&*filter*. Check your own store’s robots.txt to see whether single-filter and single-tag collection URLs are blocked or stay crawlable.
Google rates that fallback lower. Canonical and nofollow approaches are generally less effective in the long term (opens in new tab) than the methods Google lists ahead of them, which include robots.txt, and there’s often no good reason to allow crawling of filtered items, as it consumes server resources for no or negligible benefit. On the live store we checked, a single-filter collection URL returned a 200 with a canonical pointing at the unfiltered collection, while a single-tag URL returned a 200 and was self-canonical.
That leaves the store with a choice, not a defect. If a single-filter view is something people search for, make it indexable and give it content that earns the index. If it isn’t, block the pattern in robots.txt.liquid. The check also includes loading a filter combination with no products, because a filter combination that doesn’t return results should return an HTTP 404 status code (opens in new tab).
Tag pages follow different rules. Shopify’s advice is to consider using storefront filtering instead of filtering by tag (opens in new tab), and tag filters are applied by appending /[tag-handle] to the collection URL. If a tag in the URL isn’t used on any of the store’s products, then Shopify redirects to a collection URL with the tag removed, and a dead tag URL on the live store we checked returned a 301 to the collection.
Merchants can’t redirect tag URLs themselves. You can’t create redirects for URLs that use collection tag filtering (opens in new tab), such as yourstore.com/collections/collection-name/tag-name, and even if no products exist with that tag, the URL path is still considered valid and can’t be redirected. So the platform handles dead tag URLs itself and the merchant can’t override it. The audit question is whether the theme still builds navigation on tags at all.
Robots.txt.liquid And Shopify's Changing Default Rules
Shopify says all stores have a default robots.txt file (opens in new tab) that’s “optimal for Search Engine Optimization (SEO).” That’s Shopify’s claim about its own file. A theme with a robots.txt.liquid template that outputs the default rule groups can include rules that the default file no longer has, such as Disallow: /search and Disallow: /policies/. To use the current default file, delete the template.
So a store with an old robots.txt.liquid can be serving a rule set Shopify has since changed. Shopify updates the default rules regularly (opens in new tab) to keep SEO best practices applied. The check is whether templates/robots.txt.liquid exists in the live theme and, if it does, whether each rule in it was added on purpose.
Editing the template (opens in new tab) is “an unsupported customization,” and Shopify warns that “Incorrect use of the feature can result in loss of all traffic.” Replacing it with plain text is strongly not recommended, as rules may become out of date. Uploading a theme from within the Themes section of the Shopify admin won’t import robots.txt.liquid. A store that uploaded a new theme through the admin may have lost its robots customizations without anyone deciding to remove them.
Shopify treats the “Indexed, though blocked by robots.txt” status (opens in new tab) as normal behavior and usually not a cause for concern. Google always respects robots.txt, but that doesn’t necessarily prevent indexing (opens in new tab) if someone else links to your page. A robots.txt file isn’t a mechanism for keeping a web page out of Google (opens in new tab).
That produces a conflict to check for. For the noindex rule to be effective (opens in new tab), the page or resource must not be blocked by a robots.txt file, and it has to be otherwise accessible to the crawler. A URL that’s both disallowed in robots.txt and tagged noindex never has its noindex read.
AI crawlers are a separate decision. Blocking AI crawlers at the /robots.txt or network layer (opens in new tab) affects only open-web discoverability. It doesn’t stop your product data from being sent by Shopify Catalog to the agentic storefronts that you’ve activated.
The generated file on Shopify’s sample store now includes comments aimed at AI agents. How a store should handle AI search is its own topic, covered in our post on generative engine optimization for Shopify.
Where Crawl Budget Fits In An Ecommerce SEO Audit
Google aims its crawl budget (opens in new tab) advice at three kinds of site: large sites (1 million+ unique pages) with content that changes moderately often (once a week), medium or larger sites (10,000+ unique pages) with very rapidly changing content (daily), and sites with a large portion of their total URLs classified by Search Console as “Discovered – currently not indexed.” These aren’t exact thresholds. Each page count comes paired with how often the content changes, so a 10,000-product store that updates weekly doesn’t fall into either numeric group.
If your site doesn’t have a large number of pages that change rapidly, or if your pages seem to be crawled the same day that they’re published, you don’t need Google’s crawl budget advice (opens in new tab). For those sites, keeping your sitemap up to date and checking the Page indexing report regularly is adequate. Shopify updates the sitemap automatically, which leaves the Page indexing report and the “Discovered – currently not indexed” share as the crawl budget check for most stores.
When crawl budget does apply, the problem is the same duplicates this audit already covers. Google tries to crawl all or most of the URLs that it knows about on your site, and when many of them are duplicates, that wastes a lot of Google crawling time on your site. This is the factor that you can positively control the most. The fixes (opens in new tab) include consolidating duplicate content, eliminating soft 404 errors and avoiding long redirect chains, which have a negative effect on crawling.
Google also warns against one fix: don’t use robots.txt to temporarily reallocate crawl budget (opens in new tab) for other pages. Google won’t shift this newly available crawl budget to other pages unless it’s already hitting your site’s crawl capacity limit. Server behavior is one of the factors that moves that limit: when a site responds with server errors (5xx HTTP status codes) or rate-limiting signals (such as HTTP 429), the limit goes down and Google crawls less. The Crawl Stats report (opens in new tab) in Search Console shows host status, average response time and requests broken down by response.
Google gives two pieces of noindex advice that seem to disagree, and each is right about its own subject. Don’t use noindex to save crawling (opens in new tab), as Google will still request the page and then drop it. The noindex robots meta tag is still one way to keep filtered and sorted variants out of the index (opens in new tab). Noindex controls indexing, not crawling.
Sitemaps, Hidden Products And Unlisted Status
All Shopify stores automatically generate a sitemap.xml file (opens in new tab) that contains links to all your products, primary product image, pages, collections, and blog posts, and the files update automatically when you add content. Shopify generates that file, so the audit checks the product, page and collection settings that decide what goes into it.
Two settings take a URL out of it. The seo.hidden metafield set to 1 hides a page, blog post or product (opens in new tab) from sitemaps, search engines, and your online store search, and the metafield can be used by third-party apps. When you set a product as Unlisted, the product is hidden from internet search, Shopify Catalog, and your store’s sitemap. The check is a sweep for seo.hidden values and Unlisted status on products you want ranked, including values an app wrote before the store removed it.
A few sitemap conditions apply before launch or on international setups. A sitemap reader can’t access the sitemap if your website is set to private mode (opens in new tab), and if you’re on the Basic plan or higher and use international domains, then you need to submit the sitemap file for each domain. Search engines don’t index trial stores (opens in new tab).
Redirects In A Shopify SEO Audit: Test Every Source URL
You can create a maximum of 100,000 URL redirects (opens in new tab) unless your store is on the Plus plan, which has a maximum of 20,000,000 URL redirects. That limit counts URL redirects. A “Redirect Limit Exceeded” error from the Admin API isn’t related to it.
The rule that affects most audits is narrower. You can redirect only from broken URLs (opens in new tab): if the URL still loads a valid webpage, then the URL redirect won’t work. If a product is republished or a handle is reused, the old redirect stops firing. For collections, if you change a hidden collection’s visibility back to Visible, the URL redirect is automatically deleted because redirects only work for URLs that return 404 errors.
A few more redirect limits (opens in new tab) belong on the checklist. You can’t redirect URLs that use fixed Shopify paths: /products, /collections, /collections/all. Redirects apply across all language or market subfolders set up using international sales tools, and URLs with query strings might not work as expected with URL redirects.
The check is to export the redirect list from the admin and request every source URL. A source that loads a live page means that redirect no longer fires, and a target that redirects again is a chain. Chains hurt crawling (opens in new tab). For removed products with no replacement, return a 404 or 410 status code, which is what Google asks for on permanently removed pages.
If the store recently changed platforms, our SEO migration checklist covers building the redirect map in the first place.
Pagination And Internal Links
Google’s crawlers don’t click buttons (opens in new tab) and generally don’t trigger JavaScript functions that require user actions to update the current page contents. A theme or app that replaces collection page links with a Load more button or infinite scroll, and keeps no page links in the HTML, can leave deeper products reachable only through the sitemap. Generally, Google can only crawl your link if it’s an anchor element with an href attribute (opens in new tab).
Dawn renders collection pages with Liquid’s paginate tag and real page links in main-collection-product-grid.liquid (opens in new tab). Don’t use the first page of a paginated sequence as the canonical page. Instead, give each page its own canonical URL (opens in new tab), and note that Google no longer uses rel next and prev. On the live store we checked, ?page=2 was self-canonical, which is what Google recommends.
Very large collections run into a Liquid limit. The paginate tag (opens in new tab) allows the user to paginate to the 25,000th item in the array and no further. Products past that point in a collection depend on the sitemap and other internal links.
How do you improve internal linking in an ecommerce store for SEO? Start with how Googlebot finds pages. If category pages don’t include direct links to all products in a category (opens in new tab), Googlebot might not find all your products by crawling alone, and it generally doesn’t try to submit searches into a search box as part of crawling a site. As a general rule, the more links a page has to it within a site, the higher the relative importance of the page to other pages on your site, so products and collections you want to rank need links from the navigation and from related pages, pointed at canonical URLs.
Shopify’s own guideline is that pages shouldn’t be more than 3 clicks away from the home page (opens in new tab), wherever possible. That’s Shopify’s number, not Google’s.
Structured Data Checks In An Ecommerce SEO Site Audit
Your Shopify store’s theme automatically includes microdata (opens in new tab) (also known as structured data) in its code, and current Shopify-supported and Theme Store themes include it by default. Dawn outputs {{ product | structured_data }} as JSON-LD in its main-product.liquid (opens in new tab) section. With the structured_data filter (opens in new tab), product objects are output as a schema.org Product if they have no variants, and a ProductGroup if they have one or more variants.
Google splits product markup by whether the page sells. Product snippets (opens in new tab) are for product pages where people can’t directly purchase the product, and merchant listings are for pages where customers can purchase products from you. Merchant listings (opens in new tab) require name, image and offers on the Product, with price and priceCurrency on the Offer, and unlike product snippets, merchant listing experiences require a price greater than zero. Google recommends defining a standard return and shipping policy under Organization rather than on each Offer.
Dynamically-generated markup can make Shopping crawls less frequent and less reliable, which can be an issue for fast-changing content like product availability and price. Google recommends putting Product structured data in the initial HTML for best results. Here’s what to look for:
- A second Product block from a reviews or SEO app on top of the theme's own markup
- Product markup injected by JavaScript rather than present in the page source
- Return and shipping policy markup missing at the Organization level
- Errors or warnings in the Merchant listings and Product snippets reports
Those reports sit under Shopping (opens in new tab), not Enhancements. Google says providing both structured data on web pages and a Merchant Center feed (opens in new tab) maximizes your eligibility and helps Google correctly understand and verify your data. Our post on structured data and product feeds for AI search covers the feed side.
Titles, H1s, Alt Text And Product Copy
Are Shopify themes SEO-friendly by default? For the basics, Shopify says so. All Online Store 2.0 themes (opens in new tab) and themes that support theme blocks built by Shopify should have a valid title tag by default, and Shopify uses the title you enter to generate the H1 (opens in new tab) for product, collection, page and blog templates. If you suspect that a page is missing a title tag, it’s likely the result of custom code or an app.
Title length is Shopify’s field limit. You can enter up to 70 characters in the page title (opens in new tab), and Shopify recommends keeping titles to 60. Search engines, such as Google, can choose to rewrite page titles and meta descriptions based on the page content and other signals.
For images, avoid filling alt attributes with keywords (opens in new tab) (also known as keyword stuffing), as it results in a negative user experience and may cause your site to be seen as spam. Shopify lets you set alt text on product images (opens in new tab), collection featured images and blog featured images. You can’t rename an image in Shopify (opens in new tab) without uploading a new file, so alt text is the field to audit.
On product copy, avoid directly copying text that’s provided to you by a manufacturer (opens in new tab), because that description might already be used by other websites. Length isn’t a check. Google has no preferred word count (opens in new tab).
Core Web Vitals In An Ecommerce SEO Audit
The Core Web Vitals targets (opens in new tab) are LCP within the first 2.5 seconds, INP under 200 milliseconds, and CLS under 0.1. Google says meeting them, along with other page experience aspects, aligns with what its core ranking systems seek to reward. That describes one input among many.
The Core Web Vitals report (opens in new tab) in Search Console uses real world usage data (sometimes called field data), and the URL group’s status is its most poorly performing metric. Only indexed URLs can appear in it, so a URL group rated Poor there is made up of pages that are already indexed. The fixes are theme and app work, covered in our plan for Core Web Vitals on Shopify.
Shopify Markets And International Indexing
Markets setups add one check. For markets that use dedicated domains, content is automatically indexed by search engines (opens in new tab). For markets that use shared domains, content isn’t indexed by search engines. A market set up on a shared domain gets no separately indexable localized pages, so the check is whether each market the store wants to rank in has its own domain, subdomain or subfolder.
Shopify recommends subfolders (opens in new tab) to merchants setting up for the first time, calling them “straightforward to set up and offer SEO benefits.” That’s Shopify’s advice. Hreflang tags are added automatically (opens in new tab), and all published languages are included in sitemaps, which help search engines detect the different languages on your store.
Two Google rules apply on top. If page X links to page Y, page Y must link back to page X (opens in new tab), so hreflang annotations need return links, and localized versions of a page are only considered duplicates if the main content of the page remains untranslated. Google’s crawling infrastructure defines a site as a unique hostname (opens in new tab), so each market subdomain gets its own crawl budget.
Crawling The Store For A Shopify SEO Audit
A crawler run against the store fills in what Search Console doesn’t show. You can use Web Bot Auth to securely authorize your own crawlers, scripts, or tools (opens in new tab) to access your public Shopify online store, including tools used for accessibility and SEO audits. Screaming Frog, Jet Octopus, Sitebulb and OnCrawl all let you add custom headers, and the setting lives under Online Store > Preferences > Crawler access.
Signatures are for your own tools, not for search engines. Your store can be indexed by search engines and large language models (LLMs) without signatures (opens in new tab). A signature’s maximum period is 3 months, and if your crawler is receiving rate-limiting errors, then your signature isn’t valid. If an audit crawl hits rate limits, set up a signature for the tool, or renew an expired one.
If you’d rather hand off the crawl, canonical and robots.txt layer, that’s the scope of our technical SEO audit.
The Ecommerce SEO Checklist
Every check above in one table, each with where to look and what a bad answer looks like:
| Check | Where to look | What a bad answer looks like |
|---|---|---|
| Page indexing statuses | Search Console, Page indexing report | Product URLs under “Duplicate, Google chose different canonical than user,” or a large share of URLs under “Discovered – currently not indexed” |
| Canonical tags on product paths | Page source for /products/, /collections/…/products/ and ?variant= URLs; URL Inspection | Two canonical tags on one page, or a canonical pointing at a collection or variant path |
| Collection grid links | Product card snippet in the theme; links on a live collection page | Cards linking to /collections/…/products/ instead of /products/ |
| Filter and tag URLs | robots.txt, a single-filter and a single-tag URL’s canonical, an empty filter combination | Thin single-filter pages being indexed, or an empty combination returning 200 |
| robots.txt.liquid | Theme code, templates folder | A template that serves rules the current default dropped, or hard-coded plain text |
| Hidden and unlisted products | seo.hidden metafield, product status, sitemap child files | Products you want ranked set to hidden or Unlisted |
| Redirects | Admin redirect export, each source URL requested | Sources that load a live page, or targets that redirect again |
| Pagination | Collection page HTML | A Load more button with no page links, or page 2 canonicalized to page 1 |
| Structured data | Page source; Search Console, Shopping section | Two Product blocks, markup injected by JavaScript, merchant listing errors |
| Titles and H1s | Page source on each template | A missing or duplicated title or H1 after an app install or theme edit |
| Core Web Vitals | Search Console, Core Web Vitals report | URL groups rated Poor on field data |
| Markets | Markets and domains settings, hreflang in page source | A market you want ranked on a shared domain, or missing return links |
| Crawler access | Online Store, Preferences, Crawler access | An audit crawl hitting rate limits with no valid signature |
When To Run An Ecommerce SEO Audit
Is an ecommerce SEO audit worth doing if nothing looks broken? The mechanisms above point to specific moments to run one, more than to a calendar.
Uploading a theme through the admin doesn’t carry over robots.txt.liquid. Apps can write seo.hidden values, add a second canonical tag or add duplicate Product markup. Republishing a product or showing a hidden collection again disables the redirect that pointed away from it, so a theme change, an app install or removal, a catalog cleanup and a new market are each a reason to rerun the checks.
The same approach works for paid search. Our PPC audit sets up an ad account review the same way. On the organic side, our SEO audit services cover content gaps and competitive positioning alongside these technical checks.
If you’d like us to look at your store, start with a free ecommerce SEO audit. The request goes through our free Growth Audit: a no-obligation look at why your store isn’t getting found or converting, and where to start fixing it.
Not sure where the gap is? That's exactly what the Digital Marketing Growth Audit is for.
A free, no-obligation look at where your site can win more traffic and conversions, with a clear digital marketing roadmap to get there. Just a straight read on where your digital presence stands and where it's headed.


