Product schema that AI shopping can actually read
Fill in the product, copy valid JSON-LD with offers, GTIN, and availability. This is the markup that lets ChatGPT, Perplexity, and Google parse your product instead of guessing at it.
Your schema
<!-- Fill the form above and hit Generate -->
Paste it inside your product template's <head>, or use a metafield-driven snippet so price and availability stay live. Then validate the page in Google's Rich Results Test. Ratings only go in when you enter both fields, and they must match reviews actually shown on the page: fake ratings are a spam signal, not a shortcut.
What Product schema does, and why AI shopping raised the stakes
Structured data is a machine-readable summary of what a page is about, sitting alongside the human-readable page. For a product page it states, unambiguously, what is being sold, what it costs, whether it is available, and who makes it.
Search engines have used it for years to build rich results. What changed recently is that AI shopping surfaces read the same markup. When ChatGPT, Perplexity, or Google AI assembles a product recommendation, clean structured data is the difference between being parsed accurately and being inferred from prose. Inference loses to competitors who marked their pages up properly.
The fields that carry weight
| Field | Why it matters |
|---|---|
name | The product title as a shopper would say it. Not your internal SKU name. |
offers.price and priceCurrency | Required for any shopping surface. A price without a currency is invalid. |
offers.availability | Drives whether you appear at all. Stale in-stock data on a sold-out product damages trust with the surface. |
gtin | The barcode. It lets systems match your listing to the same product elsewhere, which is how comparison happens. Missing GTINs quietly deprioritise you. |
brand | Disambiguates your product from similar items with generic names. |
image | Must be a full absolute URL and must actually load for an anonymous visitor. |
aggregateRating | Optional. Include only if it reflects genuine reviews displayed on the page. |
Implementing this on Shopify
Most Shopify themes emit some Product markup by default, and it is usually incomplete rather than absent. Before adding anything, test a real product URL in Google's Rich Results Test and read what it reports. Two common outcomes:
Warnings on price, availability, or GTIN. The theme is emitting a partial object. Fixing the theme snippet is better than adding a second block, because two competing Product objects on one page create ambiguity about which is authoritative.
No Product type detected. Nothing is being emitted, and you can add a block cleanly. Use Liquid variables rather than hardcoded values so price and availability stay accurate:
"price": "{{ product.selected_or_first_available_variant.price | divided_by: 100.0 }}",
"availability": "https://schema.org/{% if product.available %}InStock{% else %}OutOfStock{% endif %}"
Hardcoding a price into schema is worse than having no schema. It goes stale the first time you run a sale, and you are then publishing a price that contradicts the page.
Validation errors worth knowing before you hit publish
- Price as a formatted string. Use
"18.00", never"$18.00"or"18,00". - Relative image URLs. Schema needs the full absolute URL including the domain.
- Markup that contradicts the page. The structured data must match what a visitor sees. A schema price of $18 on a page showing $24 is a policy violation, not a formatting mistake.
- Ratings with no visible reviews. If
aggregateRatingis in the markup, the reviews it summarises must be on the page. - Duplicate Product objects. One per page. Two is ambiguous and one of them will be ignored, possibly the correct one.
About ratings, plainly
This generator only outputs aggregateRating when you supply both a rating value and a review count, and it should reflect real reviews shown on the page. Invented ratings are treated as spam rather than as an optimisation, and rating markup is among the most actively policed schema types. A manual action for fabricated reviews affects the whole domain, not just the page. If you do not have reviews yet, ship without the field and add it when you do.
Structured data is one half of AI visibility. The other half is whether the crawlers can reach the page at all, which you can check with the AI Crawler Checker.
Common questions
Why does Product schema matter for AI shopping?
Is Shopify's default Product schema enough?
Can I include ratings in the schema?
Why does my schema show a price warning?
Do I need a GTIN?
Where do I put the JSON-LD on a Shopify product page?
Read next on the blog
Get new tools and posts in your inbox
Occasional notes on Shopify, paid ads, and AI in commerce. No spam.
Thanks - check your inbox to confirm.
Want the free AI Shopping Checklist PDF instead? →