Skip to content
AgentReady
By Dylan HuntNovember 13th, 2026Structured dataStructured dataProduct schemaJson ld

Does Shopify Add Product Schema Automatically? What the Default Markup Includes

Yes. If your store runs Dawn, Horizon or another current Shopify theme, your product pages almost certainly already carry product structured data. You did not add it and no app did. The theme prints it with a Liquid filter called structured_data.

The better question is whether that default is enough. It covers the basics Google requires and a good part of what it recommends for variants. It leaves out shipping, returns, ratings and the properties that say how your variants differ. Here is the output, captured from Shopify's own demo stores, and what to do about the gaps.

Where the default comes from

Shopify's developer docs describe structured_data as a filter that "converts an object into a schema.org structured data format". It works on two kinds of object: products and blog articles. A product with no variants comes out as a schema.org Product. A product with one or more variants comes out as a ProductGroup.

Shopify's own themes call it in the main product section. In Dawn the line is {{ product | structured_data }} in sections/main-product.liquid, and the article template does the same for blog posts. In Horizon it is in sections/product-information.liquid. Themes built on either usually keep the call.

The layout adds an Organization block for the store, and the home page also gets a WebSite block with a search action. So a stock Dawn product page carries two JSON-LD blocks, both from the theme.

What the default product markup contains

We fetched product pages with several variants on Shopify's Dawn and Horizon demo stores on 12 November 2026 and read the JSON-LD. The product came out as a ProductGroup with these properties:

LevelProperties present
Product group@id, name, description, url, brand, category, productGroupID, hasVariant
Each variant (Product)@id, name, sku, gtin, image, offers
Each offer (Offer)price, priceCurrency, availability, url

The @id values follow a pattern, such as /products/bo-ivy-black#product, which is a quick way to recognise the filter's output when you are reading a page with several blocks.

That covers more than many people assume. Google's merchant listing docs require name, image and offers on a product, and price with priceCurrency on the offer. The variant docs require a productGroupID on the group and recommend hasVariant. The default does all of that.

The blog output is a separate Article with headline, author, datePublished, dateModified, image, description, publisher, mainEntityOfPage and the article body.

What it leaves out

These were missing from every product block we read:

  • variesBy, and the variant attributes it points to. Google's variant docs recommend variesBy on the group, using values such as size and color, and each variant should state its own value for those properties. The default gives each variant a name, but no property states which size or color that variant is.
  • shippingDetails. Shipping cost and delivery time per offer. Google lists it as recommended for merchant listings.
  • hasMerchantReturnPolicy. Your return window and terms. Also recommended. Our post on the missing hasMerchantReturnPolicy warning covers when to add it and when Google ignores it.
  • aggregateRating and review. The theme has no reviews to describe. A review app has to add these, which is where duplicate markup usually starts.
  • itemCondition. Recommended for merchant listings, and it matters if you sell used or refurbished stock.
  • An image on the group. Images sit on the variants only.

The store-level blocks have gaps of their own. On the Dawn demo home page, which we fetched on 13 November 2026, the Organization block's sameAs list held nine entries, four of them empty strings. It looks like the theme prints one entry per social link setting, whether or not the setting is filled. The block has a name, logo and URL, and no contact details, address or policies.

What the benchmark shows

Our benchmark of 2,704 Shopify stores, scanned in June 2026, read the structured data on each store's pages. The pattern matches the default above:

CheckStores without it
Product structured data17.6%
Product identifiers (GTIN or MPN)46.5%
Shipping details63.2%
Ratings (AggregateRating)74.7%

Most stores have product markup, which fits a theme that prints it by default. Most do not have shipping details or ratings, which the default does not print. The benchmark did not record why a given store lacked a field, so treat the link to the theme as a reading of the numbers, not a measured cause. An identifier can only appear in the markup if the barcode field holds one, so the GTIN gap starts in the product data.

Is the default enough?

For basic eligibility in Google's merchant listings, often yes. For a complete description of your products, no.

It helps to be clear about what structured data does and does not do. Google says there is "no special schema.org structured data" needed to appear in its AI features, and that markup should match what is visible on the page. Structured data is a precise, machine-readable statement of facts your page already shows. It earns eligibility for features such as merchant listings and review stars, and it removes guesswork for any software that reads the page. It does not move a page up the rankings by itself, and no markup guarantees a rich result or a mention in an AI answer.

So the gaps worth closing are the facts a shopper relies on and the markup leaves unstated: shipping cost and time, your return terms, real ratings, and which variant is which size or color.

Three ways to close the gaps

Edit the theme. You can replace {{ product | structured_data }} with your own JSON-LD written in Liquid. You then own it: every theme update, new product field and policy change is yours to carry across. Duplicate the theme first and test the copy.

Add a schema app. Most apps write their own product block. Then switch off the theme's block so the page does not describe one product twice. Our post on who writes structured data to your product page shows how to find each block's source.

Use AgentReady. On paid plans from Core up, AgentReady publishes a fuller product record from your Shopify data, including variants, shipping from your shipping settings and returns from your policies, after you approve it. It leaves out any fact it cannot find rather than inventing one. The structured data page shows a sample, and the structured data docs cover setup. You can also keep the theme's block and fix the gaps another way; the free audit tells you which gaps you have either way.

Whichever you choose, check the live page afterwards with Google's Rich Results Test, and read the Shopify product schema guide for the full property list.

To see what your own product pages publish today, field by field, run the free audit.

See where your store stands

See what AI shopping assistants can read on your store.

Run the free AI-Readiness Checker to see, in under a minute, how ChatGPT, Perplexity, and Google read your store today and exactly what is holding it back. Then AgentReady prepares the fixes, starting with Schema.org structured data, and publishes them after you approve. Install free. Paid plans start at $9/mo.

Comments

Every comment here comes from a verified email. Write yours, confirm from your inbox, and it's live.

Loading comments…

Leave a comment

ShareXLinkedInFacebook

Written by Dylan Hunt, Founder, AgentReady. AgentReady measures what AI says about Shopify stores and helps teams improve the answer. See plans.