ProductModel
ProductModel is a Product subtype for the prototypical description of a product: the spec sheet, the manufacturer's model page, the datasheet. It has 3 properties of its own: isVariantOf (links to a parent ProductGroup or ProductModel), predecessorOf (the model this one replaced), and successorOf (the model that replaced this one). These create a product lineage chain.
The type hierarchy is Thing → Product → ProductModel. Use ProductModel when you are describing what a product IS (specifications, features, model number), not offering a specific unit for sale. A manufacturer's "2026 Camry" page is a ProductModel. A dealer's "2026 Camry, VIN 1234, $32,000" page is a Product or Car.
Full example of schema.org/ProductModel json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@id": "https://xoocode.com/products/xoostructured-ide/v3#model",
"@type": "ProductModel",
"name": "XooStructured IDE v3.0",
"description": "Schema.org-aware code editor with built-in JSON-LD validation, autocomplete for all 911 schema.org types, and Google rich result preview. Version 3.0 adds AI-assisted markup generation and batch validation.",
"url": "https://xoocode.com/products/xoostructured-ide/v3",
"image": "https://xoocode.com/products/xoostructured-ide/v3/screenshot-16x9.jpg",
"brand": { "@id": "https://xoocode.com#organization" },
"model": "XooStructured IDE",
"productID": "XOOSTRUCT-V3",
"isVariantOf": {
"@type": "ProductGroup",
"name": "XooStructured IDE",
"productGroupID": "XOOSTRUCT"
},
"predecessorOf": {
"@type": "ProductModel",
"@id": "https://xoocode.com/products/xoostructured-ide/v2#model",
"name": "XooStructured IDE v2.0"
},
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://xoocode.com/products/xoostructured-ide/v3/download"
},
"releaseDate": "2026-06-01"
}
</script>isVariantOf
isVariantOf points from a ProductModel to its parent ProductGroup or parent ProductModel. This is the inverse of hasVariant. A ProductModel for "XooStructured IDE Professional" might be a variant of the ProductGroup "XooStructured IDE" (which also includes a Free tier). Google reads this to group related models together.
predecessorOf and successorOf
predecessorOf points from a current model to the model it replaced. successorOf points from a current model to the model that came after it. These create a timeline: v2.0 is the successorOf v1.0, and v1.0 is the predecessorOf v2.0. Google reads these to show "newer version available" signals in shopping results and to connect product knowledge graph entries across generations.
ProductModel vs Product vs ProductGroup
Product is a specific item for sale. ProductGroup is a set of variants (sizes, colors). ProductModel is the specification of what a product IS. On a manufacturer's site, the model page is a ProductModel. On a retailer's site, the listing page is a Product. They can reference each other: the Product can declare "isVariantOf" pointing to the ProductModel's @id.
Minimal valid version
The smallest markup that still produces a valid ProductModel entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ProductModel",
"name": "XooStructured IDE v3.0",
"model": "XooStructured IDE",
"image": "https://xoocode.com/products/xoostructured-ide/v3/screenshot-16x9.jpg",
"description": "Schema.org-aware code editor with JSON-LD validation and autocomplete.",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD", "availability": "https://schema.org/InStock" }
}
</script>Google rich results this unlocks
Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.
- Google docsProduct snippetprimary
Common ProductModel mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
Using Product for a manufacturer spec page
Wrong"@type": "Product" on a manufacturer's model specification pageRight"@type": "ProductModel" for specs; Product for a specific unit for saleProduct implies a specific item you can buy right now. ProductModel describes the prototypical specifications of a model. A manufacturer's "2026 Camry" page is a ProductModel. A dealer's inventory listing with VIN and price is a Product.
- 02
predecessorOf pointing in the wrong direction
Wrongv2.0 has "predecessorOf" pointing to v3.0Rightv3.0 has "predecessorOf" pointing to v2.0 (v3 is the predecessor OF v2 being replaced)The naming is counterintuitive. predecessorOf means "this model is the predecessor of" the referenced model. So v2.0 sets predecessorOf pointing to v3.0 (v2 preceded v3). Alternatively, v3.0 sets successorOf pointing to v2.0. Read the property name as "[this] predecessor of [that]."
- 03
Confusing ProductModel with ProductGroup
Wrong"@type": "ProductGroup" for a manufacturer's model pageRightProductModel for specs; ProductGroup for variant sets (sizes, colors)ProductGroup is for products that vary by size, color, or configuration. ProductModel is for the model specification itself. A t-shirt in S/M/L is a ProductGroup. The specification sheet for a software version is a ProductModel. They serve different purposes.
Schema properties in this example
About the example data
The XooStructured IDE v3.0 product specification. The predecessorOf links to v2.0, showing the product lineage. This is the model-level description, separate from the SoftwareApplication example which covers the app as an installable product.
Comments
Loading comments...