Shopify themes auto-emit a Product JSON-LD block on every product page1 — name, image, description, an offers object with price and availability, plus sku and (on most themes) brand mapped from product.vendor. The 2026 install rule for a Shopify store: do not duplicate the auto-emitted block, layer the missing fields on top inside main-product.liquid4. The fields Shopify does not reliably emit and most stores need: gtin from product.barcode, aggregateRating + review (only when independent reviews exist), hasMerchantReturnPolicy, and shippingDetails.
Google's canonical Product documentation6 defines two surfaces — Product snippets (non-purchase pages like editorial reviews) and Merchant listings (transactional pages where customers can buy). Shopify PDPs are Merchant listings, which means aligning the schema with Shopify's Catalog optimisation field list2 and a Google Merchant Center feed is the highest-leverage layer to add.
§01Definition
What Product schema is
Product is the Schema.org type for a physical or digital good offered for sale. Per Schema.org v30.0, Product properties include name (Text), image (ImageObject or URL), description, brand (Brand or Organization), sku, gtin / gtin8 / gtin12 / gtin13 / gtin14 (Text identifiers), mpn (Manufacturer Part Number), offers (Offer with price + availability), aggregateRating, review, plus variant-related properties isVariantOf and hasVariant for ProductGroup composition. The mental model: Product describes the item itself; Offer describes the transaction. A Shopify PDP carries both.
What's missing from Shopify's auto-emission — the entity-level richness (brand done properly, gtin from product.barcode, AggregateRating from real reviews, hasMerchantReturnPolicy, shippingDetails) — is what lifts Merchant Center eligibility and AI shopping attribution. Schema.org v30.0 dates from 2026-03-195; the Product type has been stable across the last several vocabulary versions, so the field set you author today will not break next quarter.
§02When
When to use Product schema on Shopify
Use Product on every product page on a Shopify store. The schema applies to physical goods (apparel, jewellery, furniture, food), digital goods (downloads, courses), and services sold as packaged products (a one-off coaching package, a fixed-price installation). Do not use Product on collection pages — those are CollectionPage or ItemList. Do not use Product on the homepage. Do not use Product on the cart, search, or checkout routes (which Shopify blocks from indexing by default anyway via robots.txt).
An edge case worth naming: services sold as fixed-price products on Shopify. If the customer takes possession of a digital good (a course they download), use Product. If the customer receives ongoing service delivery, Schema.org's Service type is technically more accurate — but Shopify's product model treats both identically, and Product is the more familiar type to AI shopping engines. For Shopify-sold services, Product is the practical choice unless the page is explicitly framed as ongoing service provision.
§03The auto-emitted layer
What Shopify themes already emit
On a fresh Dawn-derivative Shopify theme, view-source audit (verified 2026-05-22) finds Product JSON-LD with these fields auto-emitted: @context, @type Product, name (product.title), image (product.featured_image), description (product.description stripped to text), sku (product.selected_or_first_available_variant.sku), and an offers object containing @type Offer, price, priceCurrency, availability (mapped from inventory state to https://schema.org/InStock or OutOfStock), url. Most themes also emit brand as a Brand object with name mapped from product.vendor. What Shopify themes do NOT reliably emit: gtin / gtin12 / gtin13 (even when product.barcode is populated), aggregateRating, review, hasMerchantReturnPolicy, shippingDetails, productGroupID, ProductGroup with hasVariant for multi-variant products.
The implication: layering on Product schema on Shopify is mostly an addition exercise, not a replacement exercise. Author a complementary block that adds the missing fields without re-declaring the fields the theme already emits. Two blocks with overlapping fields produce duplicate-entity warnings in the Rich Results Test; one block extending the other via @id reference is clean.
§04Rich results
Rich-results status in 2026
Product structured data drives two distinct Google surfaces in 2026: Product snippets (a richer search result card showing price, availability, rating) and Merchant listings (eligibility for Google Shopping surfaces and the Popular Products carousel). Product snippets surface when the page has clean Product schema and the merchant has not opted out. Merchant listings require feed alignment with Google Merchant Center — the structured data on the page must agree with the data in the Merchant Center feed.
The honest framing: the auto-emitted Shopify Product schema is usually enough to produce a Product snippet on a well-ranked PDP. Getting into the Popular Products carousel, Shopping surfaces, AND AI shopping citation requires the additional fields Shopify doesn't emit (gtin, brand done properly, hasMerchantReturnPolicy, shippingDetails) plus a Merchant Center feed aligned with those fields. This is a real-money-on-the-table moment for Shopify merchants who treat schema as "already done by the theme."
Product schema on Shopify in 2026
2
Google surfaces Product schema feeds: Product snippets (organic) and Merchant listings (Shopping).
For a Merchant listing on a Shopify PDP, Google requires (per the canonical documentation) name, image, and either offers OR review OR aggregateRating. Recommended for Merchant Center alignment: brand, gtin (one of gtin8/gtin12/gtin13/gtin14), mpn, sku, productID, shippingDetails, hasMerchantReturnPolicy. The fields most worth adding because Shopify themes don't auto-emit them reliably: gtin (from product.barcode), aggregateRating (when valid independent reviews exist), hasMerchantReturnPolicy, shippingDetails.
name — the product name. Auto-emitted by Shopify themes from product.title.
image — primary product image. Auto-emitted from product.featured_image.
description — recommended. Auto-emitted from product.description (stripped).
brand — recommended. Most Shopify themes emit a Brand object from product.vendor. If yours does not, add it.
sku — recommended. Auto-emitted from product.selected_or_first_available_variant.sku.
gtin / gtin8 / gtin12 / gtin13 / gtin14 — recommended for Merchant Center. NOT reliably auto-emitted on most Shopify themes even when product.barcode is populated. Add manually.
mpn — Manufacturer Part Number. Recommended when gtin is unavailable. Shopify does not have a native MPN field; use a metafield (e.g. custom.mpn) and reference it via Liquid.
offers — required (or review/aggregateRating). Auto-emitted with price, priceCurrency, availability, url. See the Offer leaf for the full sub-object spec.
aggregateRating — required if no offers (or recommended alongside). NOT auto-emitted. Add only when independent reviews exist. See the AggregateRating leaf.
review — recommended. Individual reviews as Review objects.
hasMerchantReturnPolicy — recommended for Merchant Center. NOT auto-emitted. See the hasMerchantReturnPolicy leaf.
shippingDetails — recommended for Merchant Center. NOT auto-emitted. See the shippingDetails leaf.
productID — recommended. Shopify's stable product ID (shopify-product-{{ product.id }}) is the canonical value.
§06Example
Full Liquid-driven JSON-LD example for a Shopify PDP
The block below is the complementary Product schema for a Shopify-sold ceramic vase. It does not duplicate Shopify's auto-emitted fields — it adds the fields the theme does not reliably emit (gtin, hasMerchantReturnPolicy, shippingDetails, productID) and uses Liquid variables so the block re-renders correctly per product. Paste it inside the theme's main-product.liquid section file, before the closing tag.
JSON-LDComplementary Product block for a Shopify PDP — Liquid-driven, layers on theme auto-emission
Product schema goes inside main-product.liquid (modern themes) or product-template.liquid (older themes). Open the theme's code editor (Online Store > Themes > Actions > Edit code) or pull the theme down via Shopify CLI. Find the section file for the product template. Paste the complementary script block at the end of the section, before any closing tags. Save. Push if using CLI. View source on the live product page after deployment: the auto-emitted Product block and your complementary block should both appear, deduped by @id, with no overlapping fields.
An alternative pattern for stores already using JSON-LD via a schema app (JSON-LD for SEO, Smart SEO, Avada): disable the app's Product schema emission to avoid triple-stacked blocks, OR remove the theme's auto-emitted block and let the app own Product entirely. The app-vs-native trade-off is covered on the schema-app-vs-theme leaf; for stores doing the install themselves, the theme-native approach above is what Shopify's own SEO FAQ documents4.
§08Validation
Validation steps
Run the live product page URL through Google's Rich Results Test. The expected output: one Product entity detected (the auto-emitted and complementary blocks deduped by @id), zero errors, warnings only on Merchant Center fields you haven't aligned (gtin if barcode is empty, hasMerchantReturnPolicy if not authored, shippingDetails if not authored). Rich Results Test should report eligibility for Product snippets. For Merchant Center eligibility, the second check is uploading a Merchant Center feed and confirming the feed data agrees with the schema — that check happens in the Merchant Center console, not in the Rich Results Test.
A common validation gotcha on Shopify: the Rich Results Test reports "Product is missing field gtin" even though product.barcode is populated. Cause: the auto-emitted block doesn't reference product.barcode; your complementary block adds it. Once the complementary block ships, the warning clears on the next test. Do not fabricate a GTIN to silence the warning — if your products legitimately do not have one (handmade, vintage), leave the field unset.
§09Gotchas
Common Shopify gotchas
Five gotchas catch most Shopify Product schema work. First: duplicating the auto-emitted block — two top-level Product objects with no shared @id trigger validator warnings. Second: forgetting to divide product.price by 100.0 (Shopify stores prices in cents). Third: omitting the | escape Liquid filter on product.title or product.vendor, causing JSON syntax errors when titles contain quotes. Fourth: adding AggregateRating from Shopify's native Product reviews without realising they count as self-serving and won't trigger Google stars. Fifth: leaving Product schema in theme.liquid (a site-wide template), where product.* variables are unbound on non-product pages and the schema fails to render.
A sixth gotcha for variant products: Shopify's auto-emission produces one Product block representing the default variant, not a ProductGroup with hasVariant. If you sell a product in five sizes or three colours, the auto-emitted block treats them as a single product, which under-represents the catalog to Merchant Center. The fix is a complementary ProductGroup block that declares the variants explicitly. The full variant pattern is documented in Google's Product structured data guide6.
§10Related
Related schema types
Product references Brand (an Organization subtype) and contains Offer (the pricing sub-object). When you have independent third-party reviews, Review and AggregateRating layer in. BreadcrumbList belongs on every product page. For variant products, ProductGroup is the parent type. The Organization that owns the catalog should also have its own site-wide schema block in theme.liquid.
Offer schema — the transaction sub-object inside Product.
Brand schema — the manufacturer/vendor entity inside Product.