All guides

What structured data is, for people who sell things

Published 19 September 2026 9 minute read

The hidden labels that tell a machine which number on your product page is the price. What they are, what has to be in them, and how to read yours.

Structured data is a block of hidden labels in your product page's code that states plainly what the page is about: this is a product, this is its name, this is the price, this many are in stock. It exists because a person can look at a page and see which number is the price, and a machine cannot.

This is the second gate in getting your shop recommended by AI assistants. The first gate is whether a crawler can reach you at all, which is a separate subject. This one assumes it got there.

The problem it solves

Look at one of your own product pages. Somewhere on it there is a number with a currency symbol, probably in larger type than the text around it. You know that is the price without being told. You know it even though the page also shows a delivery threshold, a crossed-out old price, a review count and a size chart, all of which are also numbers.

A machine reading the same page sees text at positions on a screen. It can guess, and it usually guesses correctly, and "usually" is the problem. An assistant that is about to tell a shopper your boots cost 129 euro would rather be certain than usually correct, because being wrong about a price is the kind of mistake it gets held to.

Structured data removes the guess. It is a separate statement, written for machines, saying which thing is which.

What it actually looks like

It sits in the page's code, invisible on screen, usually in a script block near the top:

{
	"@context": "https://schema.org",
	"@type": "Product",
	"name": "Trail GTX Waterproof Hiking Boot",
	"description": "Gore-Tex lined, wide fit, 480g per boot.",
	"image": "https://yourshop.com/photos/trail-gtx.jpg",
	"brand": { "@type": "Brand", "name": "TrailCo" },
	"sku": "TC-884",
	"offers": {
		"@type": "Offer",
		"price": "129.00",
		"priceCurrency": "EUR",
		"availability": "https://schema.org/InStock"
	}
}

That is the whole idea. The vocabulary is called schema.org, a shared dictionary of type names that search engines agreed on so that everyone writes "price" the same way. The format above is called JSON-LD, and it is the one Google says it recommends. Two older formats, microdata and RDFa, mix the labels into the visible page instead. They still work. Nobody writing a new shop should choose them.

You will notice availability is written as a web address rather than the word "in stock". That is how schema.org names its fixed values. There are twelve of them, including PreOrder, BackOrder, SoldOut and Discontinued, and for most shops InStock and OutOfStock are the whole vocabulary.

You probably already have some

Shopify, WooCommerce and most other platforms generate this for you. So the question is almost never whether your shop has structured data. It is whether what it has is complete and still correct.

It goes wrong in ordinary ways. A theme gets customised and the part of the template carrying the markup gets rewritten by someone who did not know what it was for. A plugin takes over the price display and the label keeps pointing at a number that has moved. Two plugins both add a Product block, so the page now describes the same boot twice with different prices. A migration brings the product descriptions across and leaves the markup behind.

None of this is visible on the page. The page looks right, which is exactly why it goes unnoticed for years.

What has to be in it

There are two different bars, and knowing which one you are aiming at saves arguing about a field you do not need. A warning before the table: filling these in correctly makes your facts readable, and does nothing about whether the facts are worth reading. That is the other half of this.

The lower bar is a product snippet, the enhanced search result with a rating and a price under it. The higher bar is a merchant listing, which is what makes a product eligible for shopping results proper. Most shops should aim at the second, because it is the one that treats you as a shop rather than as a page that happens to mention a product.

Property Product snippet Merchant listing
name Required Required
image Not required Required
offers One of three* Required
offers.price Required inside an offer Required
offers.priceCurrency Recommended Required
offers.availability Recommended Recommended
description Not listed Recommended
brand Recommended Recommended
sku, gtin or mpn Recommended Recommended
aggregateRating, review One of three* Recommended
shippingDetails Not listed Recommended
hasMerchantReturnPolicy Not listed Recommended

* For a product snippet, Google requires name plus at least one of review, aggregateRating or offers.

Read the "recommended" column as a question about how much you want to be understood rather than as optional decoration. A shop that fills in only the required fields has told a machine what the product costs. A shop that fills in the brand, the identifier, the stock status, the shipping and the returns has answered most of what a cautious buyer would ask before recommending it to someone else.

Three things that catch people out

The labels must match the page. Google's policy is explicit: do not mark up content that is not visible to readers, and do not use structured data to deceive. A page whose markup says 99 euro while the page says 129 has a problem worse than having no markup, and the penalty is losing rich result eligibility by manual action.

A price with no currency is not a price. This is the single most common half-broken shape we see. "price": "129.00" on its own is a number. Whether it means euro, złoty or dollars is now a guess, and it is a guess about the one field nobody wants to be wrong about. Wherever there is a price there must be a priceCurrency beside it, in the three-letter form: EUR, PLN, USD.

One page, one product. If two plugins each emit a Product block, a machine reading the page has to pick one. It will, and you have no say in which. This is worth checking specifically after installing any SEO or review plugin, because adding a second block is precisely what they do.

How to read yours, without being technical

Two free tools, both run by the people who define this.

The Schema Markup Validator takes a URL and shows you every label it found, as a list you can read. It checks the syntax rather than any search engine's rules, so it answers "is my markup valid".

Google's Rich Results Test takes a URL and tells you which of Google's result types the page qualifies for, and what is missing for the ones it does not. That answers the more useful question, which is whether the markup does anything for you.

Run one product page through both. Start with the product that matters most to your business rather than the first one in the list, because if you only fix one thing this month you want it to be that one.

What is actually known about AI and structured data

This part deserves more care than it usually gets, because it is where the articles on this subject start inventing things.

What is documented: Google says AI Overviews and AI Mode are part of Search, and Search is the thing that consumes this markup. Microsoft says Bing, Copilot and its grounding results run on the same crawling and indexing foundation, and Bing has long supported schema.org. So for two of the places your buyers ask questions, the connection between structured data and being surfaced is a matter of public documentation.

What is not documented: OpenAI has published nothing saying that ChatGPT requires or weighs schema.org markup. Anyone telling you it does is inferring. We do not know, and we would rather say so.

What is true regardless of any of that: structured data is the only place on your product page where the price and the stock status are stated unambiguously. Everything else on the page requires a machine to infer them. Whether a given assistant reads the markup directly or reads an index built from it, the shop that states its facts plainly is the easier one to be confident about. That argument does not depend on a vendor confirming anything.

Questions people ask

Do I need to write any of this by hand?

Usually not. On Shopify it comes from the theme, and on WooCommerce from the platform or an SEO plugin. The job is checking that it is complete and correct, then getting whoever maintains your shop to fix what is not. Knowing which field is missing is most of that conversation.

Does adding it improve my Google ranking?

Not directly. Structured data governs how a result is displayed and what it is eligible for, rather than where it sits. The practical effect is that a result with a price, a rating and a stock status attracts more clicks than a plain blue link in the same position.

My products are unbranded. What do I put for brand?

Your own shop name, if you make or own the product. brand is recommended rather than required, and an accurate empty is better than an inaccurate filled. The same applies to gtin: it is a real barcode number, and inventing one is worse than leaving it out.

What about variants, like sizes and colours?

One product with several sizes is normally one Product with an AggregateOffer carrying a low and high price, or a ProductGroup with its variants beneath it. Which of the two suits you depends on whether each size has its own page, and it is a question worth putting to whoever maintains your shop rather than deciding from an article.

How often should I check it?

After any theme change, plugin install or platform upgrade, and otherwise once or twice a year. Those are the moments it breaks. It does not decay on its own.


Where we come into it

One product page through both validators is a ten-minute job and the tools above are free, so do that first. What does not scale is the next question: which of your four hundred products have the same fault, which of those faults actually cost you a recommendation, and which shop got named instead of you while yours was missing a currency.

Shop on Radar reads the markup the way a machine reading your shop would, field by field, across the products you pick. Then it asks ChatGPT what your buyers ask, and tells you who was named instead. We explain how to fix what we find. We do not touch your shop.

We are not open yet. Join the waitlist and we will tell you when we are.

Sources