AEO fundamentals
Product schema (JSON-LD) for AI shopping: the fields that matter
You do not need every schema.org property. Here are the required Product/Offer fields, the recommended ones that get you recommended, and the availability values that count.
By ShopToAI Team · Updated Jul 16, 2026
Structured data is the single biggest lever for getting a product read by AI assistants and Google's shopping surfaces. But you do not need every property under the sun. A handful carry almost all the weight. This is the practical list, split into what is required and what is worth adding.
The markup we are talking about is a Product block in JSON-LD, with a nested Offer, placed on each product page. Assistants and search engines read it to know what you sell, for how much, and whether it is in stock.
The fields that are actually required
Google will not treat a product as a merchant listing without these. Get them right first.
| Field | Notes |
|---|---|
| name | The product title. |
| image | One or more image URLs. Multiple, high-resolution is better. |
| offers | A nested Offer object where you are the seller. |
| offers.price | The current price. For a merchant listing it must be greater than zero. |
| offers.priceCurrency | Three-letter ISO 4217 code, like EUR or USD. |
That is the floor. A page with only these is eligible; a page missing any of them usually is not.
The fields worth adding
These are recommended, not required, but they are what separates a product an assistant recommends from one it skips. They help it match your item to a shopper's question and trust the result.
| Field | Why it matters |
|---|---|
| brand | The Brand name. Assistants match on it constantly. |
| gtin (or gtin8/12/13/14) | The global identifier. Use the most specific one you have. Never invent it. |
| mpn | Manufacturer part number, when there is no GTIN. |
| sku | Your own identifier. No whitespace. |
| offers.availability | In stock or not, in a value a machine trusts (see below). |
| aggregateRating and review | Ratings and reviews, if you genuinely have them. |
| offers.shippingDetails | Shipping cost and speed. |
| offers.hasMerchantReturnPolicy | Your return policy. This one is quietly important (see below). |
Availability: use a real value, not free text
Availability is not a sentence, it is a fixed schema.org value. Use the one that fits:
- InStock
- OutOfStock
- BackOrder
- PreOrder
- Discontinued
- LimitedAvailability
- SoldOut
Writing "usually ships in 2 days" in this field does nothing. The machine wants one of the values above.
Why return policy and shipping punch above their weight
ChatGPT builds its shopping answers from what it reads on retail pages, from product feeds merchants submit through OpenAI's commerce program, and its own ranking. When several stores sell the same item, it weighs availability, price, quality, and whether you are the maker or primary seller. Stores that declare a clear return policy in their structured data tend to be favoured, because it is a trust signal the assistant can read directly. So hasMerchantReturnPolicy and shippingDetails are not busywork; they are ranking input.
One source of truth
More markup is not better if it contradicts itself. A common failure is two Product blocks on the same page, one from your theme or WooCommerce core and one from an SEO plugin, disagreeing on price or availability. An assistant that sees conflict backs off. Pick one source for your Product schema and mute the rest.
To see which of these fields your store is missing or duplicating, run a free audit and get the issues listed per product. Check your store. If you are on WooCommerce, the full setup is here: How to optimize a WooCommerce catalog for AI shopping assistants.
Common questions
What are the absolute minimum fields?
name, image, and an offers object with price and priceCurrency. Google will not treat a product as a merchant listing without those, so start there before adding the rest.
What if I don't have a GTIN?
Use mpn and brand instead, and never invent a GTIN. A made-up identifier is worse than none, because it can be checked and found wrong.
Does more structured data always help?
No. Two conflicting Product blocks on one page hurt you, because an assistant that sees contradictory price or availability backs off. Keep one source of truth and mute duplicates.