The technical SEO checklist for Shopify product pages
A technical SEO checklist for Shopify product pages: rendering, JSON-LD, titles, canonicals, alt text, internal links, speed, and crawlability.

Once product data is enriched with real attributes, specs, and use-cases, the remaining job is mechanical: getting it onto the page in a form both a shopper on a phone and an AI agent parsing HTML can read. Nothing below requires a new platform — it's a checklist for the theme and admin settings most Shopify stores already have.
Rendering: confirm the content is in the HTML, not bolted on after
Shopify server-renders Liquid, so anything looped into a template — product.title, product.description, metafield values — is present in the initial HTML the moment a crawler or an AI agent's fetcher requests the page. That's the main structural advantage a Shopify PDP has over a client-side-rendered page. It breaks down when enriched attribute data (specs, compatibility, use-cases) is pulled in via a JS widget or app embed that fetches from an API after page load: a plain-text fetch, how most AI crawlers and answer engines read pages, never sees that content, and Googlebot's own rendering queue adds latency even when it eventually does. Loop enriched fields into the template server-side, and confirm with view-source rather than the rendered DOM.
Structured data: one Product JSON-LD block, correctly bound
Shopify's structured_data Liquid filter turns a product object directly into schema.org JSON-LD:
<script type="application/ld+json">
{{ product | structured_data }}
</script>
This outputs Product schema for a variant-free product, or ProductGroup for one with variants. Dawn's main-product.liquid section already includes this JSON-LD block, and most Online Store 2.0 themes built the same way do too. The failure mode shows up after customization: a rich-snippets or reviews app adds its own Product block on top of the theme's, and two competing schemas on one page are what Search Console's structured-data reports flag as duplicate markup. Checklist:
- Confirm exactly one JSON-LD block with a
Product(orProductGroup) type per page, via view-source. - Bind price and availability to live Liquid objects rather than hardcoding values, since a hardcoded JSON-LD block won't update when price or stock changes.
- If an app also emits product schema, dedupe rather than stack.
- Validate with Google's Rich Results Test on a live URL.
Titles and meta descriptions: set them, don't rely on the fallback
Per-product SEO title and description live in Shopify admin under Products, then the product itself, in the "Search engine listing preview" section under "Edit website SEO." Shopify allows up to 70 characters for the title (closer to 60 avoids truncation) and around 160 for the description. In the theme, these render through the page_title and page_description Liquid objects:
<title>{{ page_title }}</title>
<meta name="description" content="{{ page_description | escape }}">
Left blank, Shopify falls back to the product title and a snippet of body copy — workable for a human scanning a results page, but a generic description gives an AI answer engine less specific language to quote. For catalogs with hundreds of SKUs, export products, fill in the SEO Title and SEO Description columns, and reimport rather than editing one at a time.
Canonical tags: one URL per product
Shopify's theme requirements call for a canonical tag as part of the standard SEO metadata block:
<link rel="canonical" href="{{ canonical_url }}" />
This matters on Shopify because the same product is reachable through more than one path — directly at /products/handle and through collection contexts at /collections/x/products/handle. canonical_url resolves all of those to one primary URL, so link equity, crawl budget, and any AI citation consolidate on one address instead of splitting across near-duplicate variants.
Images and alt text: treat alt as data, not boilerplate
The image_url and image_tag filters accept an alt parameter; if omitted, Shopify falls back to the media's own alt text, then to the resource's title:
{{ product.featured_image
| image_url: width: 800
| image_tag: alt: product.featured_image.alt, loading: 'lazy', width: 800, height: 800 }}
Since enriched attribute data typically includes material, color, and use-case detail, write alt text that reflects it rather than repeating the bare product name across every image in the gallery. Identical alt text on every image adds no new signal for a crawler or a screen reader; a stitching-detail or size-comparison image should say so.
Internal linking: give the page somewhere to point, and be pointed to from
A product page reachable from exactly one collection link is a dead end for crawl paths and topical context. Practical minimum: breadcrumbs (collection, then product, marked up with BreadcrumbList schema), a related-products or "customers also viewed" block, and inbound links from relevant collection or guide pages using descriptive anchor text rather than "click here" or "shop now." Descriptive anchors help an AI agent understand a linked page's topic before it opens it.
Performance: Core Web Vitals are visible directly in Shopify admin
Shopify reports Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS) natively, based on real user data: a summary appears on the Online Store, then Themes page in admin, with fuller time-series reports under Analytics, then Reports (data covers roughly the last 90 days, delayed by up to 36 hours). Good thresholds: LCP under 2.5 seconds, INP under 200 milliseconds, CLS kept low. For product pages: keep the primary image (usually the LCP element) loading eagerly, lazy-load everything below the fold, and limit how many review, upsell, and chat-widget app embeds run at once — each adds its own JS bundle.
Crawlability: sitemap.xml and robots.txt
Shopify auto-generates and auto-updates sitemap.xml at the store root, covering products, collections, pages, and blog posts, splitting each section into additional numbered files once it passes roughly 5,000 URLs; it can't be replaced with a custom upload. robots.txt is similarly managed by default, and themes ship without a robots.txt.liquid file. Add one to the templates/ folder only for a specific need — blocking or allowing a crawler, adding an extra sitemap link, or, on Shopify Markets with multiple domains, setting different crawl rules per market via the request.host object. Build on the default robots object rather than replacing it: Shopify updates those defaults for SEO best practice, and a careless custom rule can cut off crawling entirely.
How to validate
- View-source (not the rendered DOM) on a live product page, and confirm the product title, description, and enriched attributes are present in the raw HTML.
curl -s https://yourstore.com/products/handle | grep 'application/ld+json'to confirm exactly one Product JSON-LD block is present server-side.- Run the live product URL through Google's Rich Results Test to confirm structured data is valid and eligible for rich results.
- Check Search Console's structured data reports for duplicate or unparsable Product markup across the catalog, not just one page.
- Check the Online Store, then Themes page, and Analytics, then Reports, in Shopify admin for the three Core Web Vitals scores.
- Load
yourstore.com/sitemap.xmlandyourstore.com/robots.txtdirectly to confirm both resolve and reflect the current catalog.
Verified as of July 2026 against Shopify's official documentation. Menu paths and Liquid objects are current for Online Store 2.0 themes such as Dawn; confirm equivalents before applying this to a legacy theme or a Hydrogen storefront.
None of this rendering work matters if the underlying product data is thin to begin with. Anglera enriches product data — attributes, specs, use-cases, identifiers — continuously, so there's substantive, specific content to loop into page_description, JSON-LD, alt text, and metafields in the first place. It plugs into whatever PIM or commerce platform is already in place, Shopify's own product and metafield model included, so the page-side work above has something rich to render.
Sources: Add SEO metadata to your theme, Liquid filters: structured_data, Adding keywords for SEO to your Shopify store, Editing robots.txt.liquid, Finding and submitting your sitemap, Overview of web performance, Theme store requirements
