Guide
What Product schema does a Shopify theme output? We checked Dawn
Every Shopify product page can carry structured data: a block of JSON-LD that describes the product to search engines and AI assistants in a form they can read without guessing. What goes into it is up to your theme. We looked at exactly what Dawn, Shopify's reference theme, emits on Shopify's own demo store, checked on October 6, 2026.
How to see your own product's JSON-LD
- View the source. Open a product page, view its source, and search for
application/ld+json. Each match is one block of structured data. - Google's Rich Results Test. Paste a product URL. Its Merchant listings section lists what Google found and what's missing.
- The SchemaRank scanner. Paste a product URL for a 0โ100 score and the missing fields, no install needed.
What Dawn outputs
Dawn builds its product markup with Shopify's structured_data Liquid filter.
Shopify's documentation says the filter emits a Product for a product without
variants and a ProductGroup for one with variants. Here's the shape it produced
for a product with six variants, with the values replaced and five variants left out:
{
"@context": "http://schema.org/",
"@type": "ProductGroup",
"@id": "/products/canvas-tote#product",
"name": "Canvas Tote",
"url": "https://example.com/products/canvas-tote",
"productGroupID": "7012345678901",
"brand": { "@type": "Brand", "name": "Example Brand" },
"category": "",
"description": "A structured canvas tote with a laptop sleeve.",
"hasVariant": [
{
"@type": "Product",
"@id": "/products/canvas-tote?variant=41234567890123#variant",
"name": "Canvas Tote - Natural",
"sku": "TOTE-NAT",
"gtin": "4006381333931",
"image": "https://example.com/cdn/shop/files/tote-natural.jpg?width=1920",
"offers": {
"@type": "Offer",
"@id": "/products/canvas-tote?variant=41234567890123#offer",
"price": "48.00",
"priceCurrency": "USD",
"availability": "http://schema.org/InStock",
"url": "https://example.com/products/canvas-tote?variant=41234567890123"
}
}
]
} A few things worth noticing:
- Variants are modelled the way Google documents them. The group carries the
name, brand and a
productGroupID, and each variant is its ownProductwith its own offer and a?variant=URL. - GTIN appears only where a variant has a barcode. On the product we checked, that was one variant of six.
-
variesByis missing. Google recommends it on aProductGroupto say what the variants differ by, such as size or color. -
categoryis an empty string. An empty value tells Google nothing.
What Google recommends that Dawn leaves out
Measured against Google's list of recommended properties for merchant listings, the offers are missing:
| Property | What it tells Google |
|---|---|
shippingDetails | Shipping cost and delivery time per country |
hasMerchantReturnPolicy | Return window, method and cost |
priceValidUntil | How long the price holds |
itemCondition | New, used or refurbished |
aggregateRating, review | Real customer ratings, usually from a reviews app |
Each one shows up as a non-critical "Missing field" warning in Search Console. How to fix each of those warnings goes through them one at a time.
When two blocks describe the same product
Reviews apps, SEO apps and some themes add their own product JSON-LD next to the theme's, so a page can end up describing the same product twice. That isn't a problem in itself, but the two must agree: the same price, the same currency, the same availability. Two descriptions that contradict each other are worse than one that's incomplete, so after installing anything that adds markup, run a product page through the Rich Results Test and compare the values.
Filling in the gaps
You have three practical options:
- Search Console settings for shipping and returns: no code, and Google uses them ahead of markup. They don't add the fields to your pages, though.
- Edit the theme. The
structured_datafilter's output can't be extended in place, so this means writing and maintaining your own JSON-LD in Liquid, and re-checking it after every theme update. - An app. SchemaRank audits every product against these fields, then publishes Product JSON-LD built from your Shopify data through a theme app extension, so no theme files are edited and it can be switched off in the theme editor. It adds a block next to your theme's rather than changing it, so compare the two as described above.