What is a product page's product graph?
The product graph is the set of structured data nodes that describe a product on its page, linked to one another: the Product, its offer (Offer), the store that sells it (Organization), its brand (Brand) and its reviews (Review). What turns those nodes into a graph are the references: properties that nest one node inside another or cite it by its @id.
Key takeaways
- The product graph is not a Schema.org type or a JSON-LD keyword: it is the name for the set of nodes around a product and the links between them.
- Each link is a property: offers joins the product to its offer, seller the offer to the store, brand the product to its brand, and review and aggregateRating to the opinions.
- A node with no links is an island: Google asks you to use @id when two elements are better understood together.
- It is not Google's Knowledge Graph or a block's @graph: it is what your page says about a product, and what it relates it to.
A product page is not described by a single node of structured data. There is the product, but also the offer with its price, the store that sells it, the brand that makes it and the opinions of the people who have bought it. We call that set the product graph and, above all, the links that join it. It is not a term from any specification or a Schema.org type: it is a way of looking at a page's markup as what it is, a network of related things. Nor is it Google's Knowledge Graph, which is the search engine's database about the world. It matters because a product with a price but no seller, or with a brand written as loose text, says less than you think.
How it works
The W3C's JSON-LD specification describes its data as a labeled, directed graph: nodes are resources, and properties are the edges that join them.[1]W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data Each node can carry an identifier with @id, and another node can cite it with a reference, an object that carries only that @id.[1]W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data The specification distinguishes two ways of relating nodes: embedding one inside a property of another, which creates a parent-child relationship, or referencing it by its identifier.[1]W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data
In a store, the nodes and their links come from the Schema.org vocabulary. These are the ones that form a product's graph:
| From | Property | To | What the link says |
|---|---|---|---|
| Product | offers |
Offer | That an offer exists to sell or provide that product.[2]Schema.org. Product |
| Offer | seller |
Organization or Person | Who sells, rents or provides the product.[3]Schema.org. Offer |
| Product | brand |
Brand or Organization | The brand or brands associated with the product.[2]Schema.org. Product |
| Product | review |
Review | A review of the product.[2]Schema.org. Product |
| Product | aggregateRating |
AggregateRating | The overall rating, computed from a set of reviews or ratings.[2]Schema.org. Product |
| Offer | hasMerchantReturnPolicy |
MerchantReturnPolicy | The return policy that applies.[3]Schema.org. Offer |
| Offer | shippingDetails |
OfferShippingDetails | The shipping conditions and options for that offer.[3]Schema.org. Offer |
| Product | isVariantOf |
ProductGroup | The base product this variant derives from.[2]Schema.org. Product |
Two nodes being on the same page does not join them. Google explains that it understands multiple elements on a page whether they are nested, with a main element and the others grouped under it, or separate; and for those better understood together it asks you to use @id on both to indicate the relationship.[4]Google Search Central. General structured data guidelines That is why, in a well-built graph, what only makes sense inside the product is nested (its offer, its reviews), and what repeats across the whole site, like the store, is described once with a stable @id and cited from wherever it is needed.
What Google does with it
Google has two features for products: product snippets, for pages where you cannot buy directly, and merchant listings, for pages where the customer can buy the product from you. If a page carries the required properties for merchant listings, it can also be eligible for product snippets, and the more properties you add, the more enhancements it can be eligible for.[5]Google Search Central. Introduction to Product structured data Google also recommends that the store's return policy and its loyalty program go in a nested Organization node.[5]Google Search Central. Introduction to Product structured data In other words: part of the graph does not hang off the product, but off the store.
In a store
A fictional example: a lamp's product page in an invented store, with the complete graph cut down to the essentials.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://www.example.com/#organization",
"name": "Arnes Lighting",
"url": "https://www.example.com/"
},
{
"@type": "Product",
"@id": "https://www.example.com/oria-table-lamp#product",
"name": "Oria table lamp",
"brand": { "@type": "Brand", "name": "Oria Studio" },
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "38"
},
"offers": {
"@type": "Offer",
"price": "89.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": { "@id": "https://www.example.com/#organization" }
}
}
]
}
Drawn out, the graph looks like this:
Product (#product)
+-- brand ----------> Brand "Oria Studio"
+-- aggregateRating -> AggregateRating 4.6 (38 reviews)
+-- offers ---------> Offer 89.00 USD
+-- seller --> Organization (#organization)
It reads top to bottom. The product has its @id, so another page, or the same page, can cite it. The brand, the rating and the offer are nested because they only make sense inside this product. The store, on the other hand, is described once, outside the product, and the offer cites it by its @id: that link is what says who sells. Take out the seller and the markup no longer says who sells; change one letter of the @id and the reference points to a node that does not exist. With the @id identifier well chosen, the same store node serves all the product pages.
A page published with Clione carries a single @graph with Organization, WebSite, BreadcrumbList and Product, with one offer per product, and its Product node has a stable @id that coexists with the theme's own instead of duplicating it.
What people often confuse
Believing that, because the product is on your site, the markup already says you sell it. It does not: the JSON-LD specification treats each relationship as a property that has to be written,[1]W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data and the one that says who sells an offer is seller.[3]Schema.org. Offer A Product and an Organization on the same page, without that reference, are two unrelated nodes, and Google warns that you should link with @id what is better understood together.[4]Google Search Central. General structured data guidelines
How to check it
- Open a product page's source code and find the Product node. Note its
@id; if it has none, the product is anonymous and nobody can cite it.[1]W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data - Follow
offers. There has to be an Offer, and itssellerhas to point to an@idthat exists on the page, letter for letter. - Look at
brand. The brand should be a Brand or Organization node with its name,[2]Schema.org. Product and match the brand shown on the page. - Check that the reviews and rating in the markup are visible on the page. Google asks you not to mark up what the visitor does not see.[4]Google Search Central. General structured data guidelines
- Draw it on paper. One box per node and one arrow per property. Any node with no arrow in or out is an island.
Related concept: @graph
The @graph is a JSON-LD keyword: the list that gathers several nodes in one block, under a single context. The product graph is something else: the network of links around a product, however it is written. You can write a complete product graph without @graph, with all the nodes nested inside the Product, and you can have a @graph with four nodes that form no graph, because the specification allows a top-level @graph to contain nodes that are not connected.[1]W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data The @graph says which nodes exist; the product graph, how they relate.
To go further, the guide to auditing a product page's structured data applies these checks step by step, and the structured data reading path orders the rest of the types.
Synonyms
- English
- product schema graph, product structured data graph
- Español
- grafo del producto, grafo de datos estructurados del producto
Sources
- [1] W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data. Accessed . ↑ ↑ ↑ ↑ ↑ ↑
- [2] Schema.org. Product. Accessed . ↑ ↑ ↑ ↑ ↑ ↑
- [3] Schema.org. Offer. Accessed . ↑ ↑ ↑ ↑
- [4] Google Search Central. General structured data guidelines. Accessed . ↑ ↑ ↑
- [5] Google Search Central. Introduction to Product structured data. Accessed . ↑ ↑
Change history
- First English version.
This definition is published under CC BY 4.0. Reuse this definition freely, crediting Clione with a link to this page.
Related terms
@graph
What @graph is in JSON-LD, what the W3C specification says, how it links a product page's product, store and site, and how to review your store's.
@id
What the @id identifier in JSON-LD is, how it ties your schema nodes together, why it should not change and how to avoid two products where there is one.
Product
What the Schema.org Product type is, which properties it carries, what Google requires for product snippets and merchant listings, and how to check it.
Offer
What the Schema.org Offer type is, how to write price, currency and availability, what Google requires, and how Offer differs from AggregateOffer.
Brand
What the Schema.org Brand type is, how to mark up a product's brand, what Google asks for and why a reselling store doesn't put its own name as the brand.
Review
What the Schema.org Review type is, which properties Google asks for in a review, what rules apply and how to mark up customer reviews on a product page.
Make your catalog easy for bots to read
Clione fills every product page with what bots read best: the JSON-LD graph with its structured data, the meta description and the FAQs. You review and press Push; then we check your live store so it all stays published.