Product Schema Generator
Fill out a form. Get valid Product JSON-LD.
A form-driven builder for schema.org Product markup with a live JSON-LD preview that updates as you type. Handles Offer, AggregateRating, Review, MerchantReturnPolicy, and OfferShippingDetails — the full set Google needs for the Merchant Listing rich result. Switch to Full coverage mode to expose every semantically-useful Product property across 8 field groups. Empty fields are omitted so the output stays valid at every keystroke. Everything runs in your browser — nothing is sent to XooCode.
Product form
Add each product image URL as a separate entry. One entry emits as a single string; multiple entries emit as an array. For Product rich results, prefer multiple aspect ratios (1:1, 4:3, 16:9).
Emitted as a nested Brand entity: { '@type': 'Brand', 'name': '...' }. Do not include a URL or logo here.
At least one of SKU, GTIN, or MPN is recommended. Google matches these against the Merchant Center product catalog for commerce surfacing.
Reviews (0)
Individual customer reviews. Add as many as you want. Each review contributes to the Review snippet rich result. Google pairs these with the aggregate rating above.
No reviews yet. Click the button below to add one.
Live JSON-LD output
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product"
}
</script>Updates as you type. Empty fields are omitted from the output. Click the copy icon above to copy the full <script> tag ready for pasting into your HTML head.
How to use the generator
The tool is a two-pane split: a form on the left, a live JSON-LD preview on the right. Type into any field and the preview updates immediately. When you’re done, click the copy icon in the preview header and paste the <script> block into your page’s <head> tag. That’s the whole workflow.
- 1
Start from the seed example (optional)
Above the form there’s a Load XooTee example button. Click it and every Essential field populates with a worked example — the XooTee Classic, a fictional Danish retail product from the Xoo universe. Use it to see what a fully-populated Merchant Listing output looks like, then clear and start over for your own product. - 2
Pick your coverage mode
The Coverage dropdown next to the Load example button has two settings. Essential shows the core fields plus the composition blocks Google needs for its rich results. Full keeps everything from Essential and appends eight more field groups covering every semantically-useful Product property schema.org defines — you won’t find a property that’s missing from Full mode. - 3
Fill in the core fields
Name, description, images, brand, and the identifiers triple (SKU, GTIN-13, MPN). The name field borders in red the first time you touch it but leave it blank — that’s the visual cue for the one property Google will reject your markup without. - 4
Add the rich-result blocks
The dashed Add… buttons expand into composition blocks:Offer(price + currency + availability),AggregateRating,Review,Return Policy, andShipping Details. For the Merchant Listing rich result you need the Offer, Return Policy, and Shipping Details blocks at minimum. For the Product Snippet rich result (star rating badge only) you just need AggregateRating with one or more Reviews. - 5
Copy the output
The preview pane shows the full<script type="application/ld+json">wrapper with syntax highlighting. Click the copy icon to grab it and paste into your page head. Test it with Google’s Rich Results Test before publishing to catch any value-level issues the form can’t see (broken image URLs, country codes your store doesn’t actually ship to, etc).
Merchant Listing vs Product Snippet: two rich results, two bars
Google renders two different rich results from Product structured data, and they have different required property sets. Most authors conflate them, ship an incomplete Product block, and wonder why their page gets a star rating but no shipping card. This tool separates the two so you can tell which one you’re aiming for.
The Product Snippet rich result is the smaller of the two. It gets you a star-rating badge and optionally a price next to your organic search result — no shipping, no returns, no availability card. The bar for Product Snippet is low: name, image, and either aggregateRating or a single review with a rating. That’s it. Most Product markup in the wild only clears this bar, which is why “rich result” usually means “star badge” in practice.
The Merchant Listing rich result is the fuller commerce card — price, availability, shipping cost, return policy, and a product image, often rendered in a visually-distinct block at the top of shopping-intent queries. Google introduced the current Merchant Listing format in 2023 and quietly tightened the property requirements in the process. To qualify you need offers with price and priceCurrency, hasMerchantReturnPolicy with at least a return policy category, and shippingDetails nested in the offer with a shipping rate and a delivery time range. The Essential mode of this generator covers all of that.
GTIN, MPN, SKU: which identifier Google actually wants
Google’s Merchant Center matches your Product markup against its product catalog using these identifiers. Getting them wrong — or omitting all three — is the second most common reason rich results fail to render after missing Offer data.
GTIN (Global Trade Item Number) is the universal product barcode number, managed by GS1. It comes in four lengths: GTIN-8 (short codes for small items), GTIN-12 (the North American UPC), GTIN-13 (the European EAN), and GTIN-14 (case/carton packaging). Google accepts all four, but you should use whichever length your product actually has printed on its barcode. Schema.org also defines a generic gtin property that accepts any length, which is what you should use if you don’t know which variant applies. The generator exposes gtin13 in Essential mode (the most common European variant) and all five properties in Full mode.
MPN (Manufacturer Part Number) is the manufacturer’s internal code for the product — the same number a supplier would invoice against. It’s stable across retailers but manufacturer-specific, so two sellers of the same brand’s product use the same MPN. MPN plus brand is Google’s fallback identifier when no GTIN is available, and works well for small-scale craft and industrial products that don’t have a GTIN assigned.
SKU (Stock Keeping Unit) is your internal catalog code — totally seller-specific, no cross- retailer meaning. Google will accept SKU as an identifier and uses it for order-to-listing matching within a single store, but it’s the weakest of the three for product discovery. Always ship SKU, but don’t treat it as a substitute for GTIN or MPN.
The rule of thumb: ship all three when you have them. Google picks the most authoritative — GTIN first, then MPN+brand, then SKU as last-resort. Nothing breaks if you include all three. Everything breaks if your only identifier is an SKU that collides with another retailer’s SKU for a different product.
Return policy and shipping details: the 2023 Merchant Listing gate
Until 2023, Product markup that omitted hasMerchantReturnPolicy and shippingDetails still earned the Merchant Listing rich result. Google quietly changed that: without both properties present and valid, your Product page is demoted to the Product Snippet tier even if every other field is perfect. This is the single most common reason Merchant Listing cards disappear after a Google algorithm update.
hasMerchantReturnPolicy is a nested MerchantReturnPolicy object at the Product level. It needs at minimum an applicableCountry (2-letter ISO) and a returnPolicyCategory enum — one of MerchantReturnFiniteReturnWindow, MerchantReturnUnlimitedWindow, or MerchantReturnNotPermitted. If you pick the finite window, add merchantReturnDays (an integer number of days). Return method and return fees are recommended but not required. The generator’s Return Policy block handles all of this with the day field conditional on the finite window selection.
shippingDetails is a nested OfferShippingDetails object, and it’s important where it lives: shippingDetails is a property of Offer, not of Product. The generator emits it nested inside the offers object, never at the Product level. The minimum viable shape includes a shippingRate (MonetaryAmount with value and currency), shippingDestination (one or more DefinedRegion objects with country codes), and a deliveryTime with handlingTime and transitTime ranges in days. The generator’s Shipping Details block collapses these into min/max day inputs so you don’t have to hand-write QuantitativeValue objects.
The AggregateRating review-count trap
The star rating badge is the single most-clicked element of any Product rich result. A 4.8-star result next to a competitor’s no-star result wins on click-through at any page-quality level. But there’s a 2019-vintage rule about whose reviews those stars can aggregate, and the rule kills a lot of well-intentioned markup silently.
Google’s review policy update in 2019 drew a bright line against self-serving reviews: a business cannot mark up reviews of itself with AggregateRating unless those reviews are genuinely independent. In practice this means you cannot ship AggregateRating based on:
- Reviews written by the merchant or anyone affiliated with the merchant
- Reviews pulled from an affiliate or aggregator feed without a direct review relationship
- Reviews for a different product that you’re attributing to this one for aggregation purposes
The reviews Google does accept are your own customers’ direct feedback on the specific product being marked up, or reviews from a first-party review collection service that has editorial independence from the merchant. The generator deliberately keeps the AggregateRating and Review blocks separate from automated review aggregators — you supply the numbers, you’re responsible for the policy compliance.
What this generator isn't
The Product Schema Generator is a tightly-scoped authoring tool. Knowing what it doesn’t try to do will save you time hunting for features that were never supposed to exist.
It IS a full Product JSON-LD builder
It is NOT a product feed generator
It IS Merchant Listing aware
It is NOT a multi-zone shipping tool
It IS identifier-smart
It is NOT a Rich Results Test
It IS review-count trap aware
It is NOT a catalog manager
Authoritative sources behind the Product vocabulary
The generator’s behaviour is sourced from primary documentation. These are the documents to consult when you need to verify anything the tool produces.
- schema.org/Product — the canonical vocabulary definition. Lists every property Product inherits from
Thingas well as Product-specific properties. Full mode covers the semantically-useful subset of this page. - Google Product structured data documentation — the required and recommended property lists the generator enforces. Read this when you’re unsure whether a specific field counts.
- Google Merchant Listing structured data — the specific requirements introduced in 2023 for the Merchant Listing rich result, including the MerchantReturnPolicy and OfferShippingDetails property shapes. This is the source for the Essential-mode composition blocks.
- GS1 GTIN specification — the authoritative definition of GTIN-8 / -12 / -13 / -14 formats and the rules for which variant to use for which type of product.
- Google Rich Results Test — run your generator output through this to catch value-level issues before publishing. Free and immediate.
- Schema Markup Validator — the schema.org-maintained validator. Use it for vocabulary conformance independent of Google’s rich result rules.