In beta, with limited placesOpen to everyone in Q1 2027

↑↓ to move · Enter to open · Esc to close

Structured data

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.

Written by
Reviewed by
Published 7 min read
Takeaway:

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.

Warning:

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

  1. 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
  2. Follow offers. There has to be an Offer, and its seller has to point to an @id that exists on the page, letter for letter.
  3. 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.
  4. 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
  5. Draw it on paper. One box per node and one arrow per property. Any node with no arrow in or out is an island.

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. [1] W3C. JSON-LD 1.1, A JSON-based Serialization for Linked Data. Accessed . ↑ ↑ ↑ ↑ ↑ ↑
  2. [2] Schema.org. Product. Accessed . ↑ ↑ ↑ ↑ ↑ ↑
  3. [3] Schema.org. Offer. Accessed . ↑ ↑ ↑ ↑
  4. [4] Google Search Central. General structured data guidelines. Accessed . ↑ ↑ ↑
  5. [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.

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.