Technical SEO checklist for online stores

Technical SEO checks for Shopify and WooCommerce stores: noindex, robots.txt, sitemaps, titles, H1s, canonicals, Product structured data, Open Graph, alt text.

FixReports editorial team12 min read

A technical SEO checklist for an online store confirms three things: search engines can crawl and index the pages you want found, they can tell what each page is, and they can show it well in results. In practice: no stray noindex rules, a robots.txt that doesn't block important pages, a sitemap of canonical URLs, a unique title and meta description per page, one clear H1, canonical tags that consolidate variant and collection duplicates, valid Product structured data, Open Graph tags, descriptive alt text and no broken internal links. These checks remove technical obstacles; they don't guarantee rankings or traffic.

Key points

  • robots.txt controls crawling, not indexing. To keep a page out of Google, use noindex, and don't block that page in robots.txt or Google never sees the rule (Google Search Central (opens in a new tab)).
  • One sitemap file can hold up to 50,000 URLs or 50 MB uncompressed, and Google ignores <priority> and <changefreq> (Google Search Central (opens in a new tab)).
  • Google says there is no ideal number of headings, but one H1 that names the product is the clearest main title for shoppers and screen readers.
  • Merchant listings require a product name, image and a nested Offer (not AggregateOffer) with a price above zero and a currency (Google Search Central (opens in a new tab)).

What do Shopify and WooCommerce handle by default?

Shopify handles most technical SEO basics in the platform and theme, while a WooCommerce store relies on WordPress core plus an SEO plugin for several of them.

ItemShopifyWooCommerce (WordPress)
XML sitemap/sitemap.xml, automatic/wp-sitemap.xml since WordPress 5.5, or an SEO plugin's
robots.txtAutomatic; edit with robots.txt.liquidVirtual file from WordPress that lists the core sitemap
Canonical tagsAdded automaticallyCore adds them on single pages only
Meta descriptionField in each product's search engine listingSEO plugin or theme
Product structured dataTheme, via the structured_data filterWooCommerce core JSON-LD on product pages
Open Graph tagsTheme (Dawn: meta-tags.liquid)SEO plugin or theme
Cart and checkoutDisallowed in robots.txtMarked noindex by WooCommerce

Details and sources for each row follow below (as of October 2026).

How do you make sure store pages can be indexed?

A page can be indexed when it returns a 200 status, isn't blocked by robots.txt and carries no noindex rule.

A noindex rule can sit in a meta tag or an HTTP header, and Google doesn't support it inside robots.txt (Google (opens in a new tab)):

<meta name="robots" content="noindex">
X-Robots-Tag: noindex

robots.txt manages crawler traffic; a blocked URL can still appear in results, without a description, if other pages link to it (Google (opens in a new tab)). Search Console's Page indexing report (opens in a new tab) lists each non-indexed URL with a reason such as "URL marked 'noindex'". Not every URL needs to be indexed, but your products and collections do.

Shopify

The default robots.txt blocks admin, cart, checkout, account and order paths, plus filtered (/collections/*+*) and sorted (sort_by) collection URLs that duplicate collection pages. You can edit it with a robots.txt.liquid template, but Shopify calls this an unsupported customization and warns that mistakes can cost a store all of its traffic (Shopify Help Center (opens in a new tab)).

To hide a page, blog post or product, set an integer metafield seo.hidden to 1, which hides it from sitemaps, search engines and store search; the Unlisted product status also hides products from collections and recommendations (Shopify Help Center (opens in a new tab)). While a store is password-protected, search engines can't read its sitemap.

WooCommerce

Check Settings > Reading > Search engine visibility. When "Discourage search engines from indexing this site" is ticked, WordPress (since 5.3) adds a noindex, nofollow robots meta tag to your pages (WordPress.org (opens in a new tab)) and turns off the core sitemap. If the store was built on a staging site, confirm the box was cleared at launch. WooCommerce itself marks the cart, checkout and My account pages noindex and sends X-Robots-Tag: noindex on endpoints such as order received (WooCommerce source (opens in a new tab)), which is expected.

What should an online store's XML sitemap include?

The sitemap should list only canonical, indexable URLs you want in search: products, collections or categories, content pages and blog posts.

Google's rules: up to 50,000 URLs or 50 MB per file, a sitemap index for larger sets, absolute URLs, only URLs you want shown in results, and <lastmod> only when accurate (Google (opens in a new tab)). Submit the sitemap in Search Console's Sitemaps report or reference it in robots.txt:

Sitemap: https://example.com/sitemap.xml

On Shopify, every domain has an automatic sitemap.xml that links to child sitemaps for products, collections, blogs and pages and updates as you add them; each international domain gets its own (Shopify Help Center (opens in a new tab)).

On WooCommerce, WordPress 5.5 and later serve a core sitemap index at /wp-sitemap.xml, referenced in WordPress's robots.txt, with up to 2,000 entries per sitemap by default. SEO plugins such as Yoast SEO replace it with their own (Make WordPress Core (opens in a new tab)). Check which sitemap is actually live before you submit it.

How should you write product titles and meta descriptions?

Give every page a unique, descriptive title and a meta description that summarizes it, with the important words first, because Google truncates both to fit the screen.

Google's title guidance: make titles descriptive and concise, avoid keyword stuffing and repeated boilerplate, and put the site name at the start or end with a delimiter. There is no length limit, but title links are truncated to the device width (Google (opens in a new tab)). Google can also build the title link from other text, such as the H1 or og:title.

For snippets, Google mostly uses page content and uses the meta description when it describes the page more accurately. It suggests including product facts such as price or manufacturer, and says generated descriptions are fine if they are readable and varied (Google (opens in a new tab)).

<title>Linen shirt, natural, relaxed fit | Example Store</title>
<meta name="description" content="Relaxed-fit shirt in European linen. Sizes XS to XXL, $68, free returns within 30 days.">
  • Shopify: edit the Page title, Meta description and URL handle in each product's search engine listing section (Shopify Help Center (opens in a new tab)). Shopify accepts up to 70 characters in the title, suggests about 60, and recommends 160 characters for the description (Shopify Help Center (opens in a new tab)).
  • WooCommerce: WordPress core doesn't print a meta description (checked in the 7.1.3 source), so use an SEO plugin or your theme.

Does each page need exactly one H1?

Google doesn't require a specific number, but one H1 that names the page is the clearest main title for shoppers, screen readers and search engines.

Google's SEO starter guide says there is no ideal number of headings and that heading order doesn't matter for Search, though semantic order helps screen readers (Google (opens in a new tab)). Its title link guidance suggests making the main title the most prominent text, for example as the first visible <h1>. W3C's tutorial adds that headings communicate the page's organization and that skipping ranks should be avoided (W3C WAI (opens in a new tab)).

Common store faults: the logo in an H1 on every page, the product name in a <div> or H2, a second H1 from an app, and collection pages with no H1.

How do canonical URLs handle variant and collection duplicates?

A canonical tag tells Google which of several URLs with the same content to index, so variant-parameter and collection-path URLs should point to one preferred product URL.

Google treats redirects and rel="canonical" as strong signals and sitemap inclusion as a weak one. Use absolute URLs, and don't use robots.txt or noindex to pick a canonical (Google (opens in a new tab)). For variants on an optional query parameter such as ?color=green, Google suggests the URL without the parameter as canonical. It ignores # fragments, so variants need paths or parameters, and it recommends self-referencing canonicals on indexable pages and consistent URLs across links, sitemaps and canonical tags (Google (opens in a new tab)).

<link rel="canonical" href="https://example.com/products/linen-shirt">

If Google ignores your choice, the Page indexing report shows "Duplicate, Google chose different canonical than user", usually a sign of conflicting signals.

  • Shopify: canonical tags are generated automatically (Shopify Help Center (opens in a new tab)); the Dawn theme prints <link rel="canonical" href="{{ canonical_url }}">. Themes that use the within filter create collection-aware product URLs (/collections/summer/products/linen-shirt), and Shopify notes these duplicate the standard product page (Shopify (opens in a new tab)). Check that their canonical points to /products/linen-shirt.
  • WooCommerce: WordPress core prints a canonical tag only on single views such as products and pages (WordPress developer reference (opens in a new tab)), so shop and category archives depend on your SEO plugin or theme. Changing the product permalink structure changes every product URL, and old links return 404 errors unless you add redirects (WooCommerce (opens in a new tab)).

How do you set up Product structured data for merchant listings?

Add Product markup with a nested Offer that matches the price and availability on the page, then test it in Google's Rich Results Test.

Google uses product snippets for product pages where people can't buy directly and merchant listings for pages where they can (Google (opens in a new tab)). It generally recommends JSON-LD (Google (opens in a new tab)). Merchant listings require name, image and offers as an Offer, with price above zero and priceCurrency in ISO 4217 format. Recommended properties include availability, gtin, brand, aggregateRating, shippingDetails and hasMerchantReturnPolicy (Google (opens in a new tab)). For variants, Google supports ProductGroup with hasVariant, variesBy and productGroupID (Google (opens in a new tab)).

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Linen shirt, natural",
  "image": ["https://example.com/images/linen-shirt-1x1.jpg"],
  "sku": "LS-NAT-M",
  "brand": { "@type": "Brand", "name": "Example Store" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/linen-shirt",
    "price": "68.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}
</script>

Mark up only what shoppers can see; Google doesn't guarantee that structured data will appear in results (Google (opens in a new tab)).

  • Shopify: {{ product | structured_data }} outputs a Product for products without variants and a ProductGroup for products with variants (Shopify (opens in a new tab)); Dawn includes it in its product section. If a reviews or SEO app adds its own markup, check for duplicates.
  • WooCommerce: core prints Product JSON-LD on product pages, with SKU, offers, ratings when reviews exist, and a GTIN when the GTIN, UPC, EAN, or ISBN field (added in WooCommerce 9.2 (opens in a new tab)) is filled in. Variable products with different variation prices get an AggregateOffer price range unless the URL selects one variation (WooCommerce source (opens in a new tab)), so test them, since merchant listings need an Offer.

For returns, Google also accepts an organization-level return policy in markup, but settings in Merchant Center or Search Console take precedence (Google (opens in a new tab)).

Which Open Graph tags should product pages have?

Product pages should have og:title, og:type, og:image and og:url, plus og:description and og:image:alt, so shared links show the right title and photo.

The Open Graph protocol lists those four as required, defines og:url as the canonical URL, and says og:image:alt should accompany every og:image (ogp.me (opens in a new tab)).

<meta property="og:type" content="product">
<meta property="og:title" content="Linen shirt, natural">
<meta property="og:url" content="https://example.com/products/linen-shirt">
<meta property="og:image" content="https://example.com/images/linen-shirt-1200x630.jpg">
<meta property="og:image:alt" content="Natural linen shirt on a hanger">
<meta property="og:description" content="Relaxed-fit shirt in European linen.">

Why does image alt text matter for product images?

Alt text tells search engines and screen reader users what a product image shows, and Google uses it together with computer vision and page content.

Google's image guidance asks for useful, specific alt text without keyword stuffing; its best example is "Dalmatian puppy playing fetch". Google doesn't index CSS background images, so product photos belong in <img> elements (Google (opens in a new tab)). For a store that means alt text such as "Natural linen shirt, back view", not "shirt shirt linen buy".

Crawl your store, list internal links that return a 4xx error, and either update each link or 301-redirect the old URL to the closest live page.

Google crawls links built as <a> elements with an href and recommends linking every important page from at least one other page (Google (opens in a new tab)). URLs that return 4xx codes aren't indexed, and indexed ones are dropped; a 301 is a strong redirect signal, a 302 a weak one (Google (opens in a new tab)). Store links break when products are deleted or renamed, handles change or collections are retired, while old links stay in menus, descriptions and blog posts.

  • Shopify: go to Content > Menus > View URL redirects > Create URL redirect. Shopify only redirects URLs that are actually broken (Shopify Help Center (opens in a new tab)).
  • WooCommerce: add server rules or a redirect plugin whenever you change slugs or permalink settings.

A free scan flags many of these issues in about a minute. The SEO Fix Report checks titles, meta descriptions, H1s, canonicals, noindex, robots.txt, the sitemap, Product structured data, Open Graph, alt text and broken internal links on up to 25 pages, with fixes for your platform.

Frequently asked questions

Does fixing technical SEO guarantee better rankings?

No. These fixes remove reasons a page can't be crawled, indexed or understood; rankings still depend on relevance and many other factors.

Should every product variant have its own indexed URL?

It depends on how variants are built. If they share one page and differ by an optional query parameter, Google suggests the URL without the parameter as canonical; if each variant has its own page, Google's variant guidance treats each page separately.

Why doesn't my product show rich results even with valid markup?

Google doesn't guarantee rich results for valid structured data. Check that the markup matches visible content, uses an Offer with a price above zero, and passes the Rich Results Test.

Should I block filtered collection pages in robots.txt?

On Shopify, the default robots.txt already disallows filtered and sorted collection URLs because they duplicate collection pages. If you edit robots.txt.liquid, keep those rules unless you have a specific reason to change them.

Sources