Schema.org is a website that holds the commonly used standards for encoding information about the content of your webpages in a way that makes it easier for the likes of Google and Bing to understand what your page is about.

This post is about how products information is encoded.

Here’s the page for a Product. The question I want to address is “How do I create an acceptable entry for a specific product”. I’m doing this for a client, so it’s an important job.

Next.co.uk schema.org Product example

I guess the first thing to do is have a look at how the competition do it. Here’s one pulled randomly from next

{
  "@context": "http://schema.org",
  "@type": "Product",
  "name": "Blue Slim Signature Angelico Linen Blend Blazer",
  "image": "https://xcdn.next.co.uk/COMMON/Items/Default/Default/ItemImages/AltItemShot/D04222s.jpg",
  "sku": "D04-222",
  "description": "Premium Linen blend fabric. Woven in Italy by Angelico mills. Slim fit. Lapel collar. Boutonniere. Printed lining. Long sleeves with button detail. Patch pockets. Internal jetted pocket with flap and button fastening.",
  "brand": {
    "@type": "Brand",
    "name": "Next"
  },
  "offers": [
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "36 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "38 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "40 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "42 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "44 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "46 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "48 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "50 R"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "38 L"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "40 L"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "42 L"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "44 L"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "46 L"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "48 L"
    },
    {
      "@type": "Offer",
      "priceCurrency": "GBP",
      "price": "199",
      "itemCondition": "http://schema.org/NewCondition",
      "url": "//www3.next.co.uk/style/st258105/d04222",
      "availability": "http://schema.org/InStock",
      "sku": "D04-222",
      "name": "50 L"
    }
  ]
}

The first thing I not here is that there’s not actually that much data, we have a fairly standard structure, there are multiple sizes but there’s no attempt to use the ProductGroup type instead of the product. There’s not attempt to codify the sizes, the materials, it’s just name, price, image url and SKU of each variant. One description for the set, and the brand.

So the good news is that if this is the standard to beat, it’s not a high bar.

Roman.co.uk schema.org Product example

How about Roman Original’s they have this:

[
  {
    "@context": "http://schema.org",
    "@type": "Product",
    "sku": "15005608",
    "productID": "5747",
    "url": "/classic-washed-denim-jacket-15005608",
    "image": [
      {
        "@type": "ImageObject",
        "url": "https://romans-cdn.rlab.net/images/ExtraLarge/1ad159c8-8875-49b1-9593-a8a16253a484.jpg",
        "name": "https://romans-cdn.rlab.net/images/ExtraLarge/1ad159c8-8875-49b1-9593-a8a16253a484.jpg"
      },
      {
        "@type": "ImageObject",
        "url": "https://romans-cdn.rlab.net/images/ExtraLarge/c2c05c46-4554-4837-9c1b-ae84313b1ad4.jpg",
        "name": "https://romans-cdn.rlab.net/images/ExtraLarge/c2c05c46-4554-4837-9c1b-ae84313b1ad4.jpg"
      },
      {
        "@type": "ImageObject",
        "url": "https://romans-cdn.rlab.net/images/ExtraLarge/4a1f6630-bc37-42e9-90ce-32da829765a5.jpg",
        "name": "https://romans-cdn.rlab.net/images/ExtraLarge/4a1f6630-bc37-42e9-90ce-32da829765a5.jpg"
      },
      {
        "@type": "ImageObject",
        "url": "https://romans-cdn.rlab.net/images/ExtraLarge/39003145-ac97-4346-a528-06c948a35bb6.jpg",
        "name": "https://romans-cdn.rlab.net/images/ExtraLarge/39003145-ac97-4346-a528-06c948a35bb6.jpg"
      },
      {
        "@type": "ImageObject",
        "url": "https://romans-cdn.rlab.net/images/ExtraLarge/5f056a46-b6df-458d-a933-591dd0958336.jpg",
        "name": "https://romans-cdn.rlab.net/images/ExtraLarge/5f056a46-b6df-458d-a933-591dd0958336.jpg"
      }
    ],
    "name": "Classic Cotton Denim Jacket",
    "category": "Black Jackets",
    "description": "",
    "offers": {
      "@type": "Offer",
      "url": "/classic-washed-denim-jacket-15005608",
      "availability": "http://schema.org/InStock",
      "price": "35.00",
      "priceCurrency": "GBP",
      "priceValidUntil": "",
      "shippingDetails": []
    },
    "color": "Black",
    "header": "Complete the Look",
    "brand": {
      "@type": "Brand",
      "name": "Roman Originals"
    }
  }
]

There’s no attempt here to record the different sizes. It’s got incomplete “url” entries, and includes the “Product” schema.org not only for the main product, but for the items in the related sections. This one offers multiple images, I don’t see that as useful, mainly because one of those images will be the “main” one, but there’s nothing there to indicate which it is.

Again we see nothing to try and capture the complexity of what’s in or out of stock.

The standard here is lower than next.co.uk

Asos.com Schema.org Product example

Here’s one from Asos.com

{
  "@context": "https://schema.org/",
  "@graph": [
    {
      "@type": "Product",
      "name": "ASOS DESIGN halter neck channel mesh maxi dress in hot pink",
      "sku": "128845123",
      "color": "HOT PINK",
      "image": "https://images.asos-media.com/products/asos-design-halter-neck-channel-mesh-maxi-dress-in-hot-pink/204663000-1-hotpink",
      "brand": {
        "@type": "Brand",
        "name": "ASOS DESIGN"
      },
      "description": "Dresses by ASOS DESIGN The kind of dress that deserves attention Halterneck style Cut-out details Tie-back fastening Thigh-high split Regular fit",
      "productID": 204663000,
      "url": "https://www.asos.com/asos-design/asos-design-halter-neck-channel-mesh-maxi-dress-in-hot-pink/prd/204663000",
      "offers": {}
    }
  ]
}

That’s much shorter.

I’m not sure what this “@graph” thing is about. I’m going to check if this page validates against the Parser - Yes it does. But I had to paste the code in because schema.org was being blocked from validating.

Ok the “@graph” thing seems to come from the fact that the schema.org is done with json+ld, and the you can read it’s specifcation @graph I can’t say I feel as though I understand what it’s trying to tell me. It looks like they’ve got lost in a sea of specific, similar, but different terms. It looks like the main point is that you can put many different schema.org types at the top level rather than having many separate <script></script> tags.

From a content point of view, it has even less information than the other examples. Name, image, brand, description, price and url.

Nest.co.uk Product Schema.org example

Nest.co.uk - not to be confused with next.co.uk, has this:


{
  "@context": "http://schema.org",
  "@type": "Product",
  "productID": "192839-GB",
  "sku": "192839-MAS",
  "name": "Louis Poulsen PH 5 Contemporary Hues Pendant Light",
  "description": "Henningsen created the now-iconic PH 5 out of his (and his mother&rsquo;s!) dislike of the harsh, unflattering lightbulbs of the time. He meticulously designed the 5 shades that make up the pendant in order for them to work together to diffuse and cast light evenly, making for a pleasant, glare-free ambience. Enjoy the PH 5 over your dining table, in the hallway or living room, or anywhere you want a pop of colour and beautiful, natural light.Part of the Louis Poulsen PH 5 family. Find out more about this classic light in our blog - Design Icon: Louis Poulsen PH 5 Pendant Lamp\n",
  "brand": {
    "@type": "Brand",
    "name": "Louis Poulsen"
  },
  "offers": [
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 612,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205709-GB",
        "sku": "205709-STK",
        "gtin13": "5703411768037",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Modern White / Pale Rose",
        "disambiguatingDescription": "Modern White / Pale Rose, Diameter: 50cm"
      }
    },
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 700,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205690-GB",
        "sku": "205690-STK",
        "gtin13": "5703411768792",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Hues of Red",
        "disambiguatingDescription": "Hues of Red, Diameter: 50cm"
      }
    },
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 700,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205687-GB",
        "sku": "205687-STK",
        "gtin13": "5703411768600",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Hues of Green",
        "disambiguatingDescription": "Hues of Green, Diameter: 50cm"
      }
    },
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 700,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205691-GB",
        "sku": "205691-STK",
        "gtin13": "5703411767061",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Hues of Rose",
        "disambiguatingDescription": "Hues of Rose, Diameter: 50cm"
      }
    },
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 743,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205688-GB",
        "sku": "205688-STK",
        "gtin13": "5703411769171",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Hues of Grey",
        "disambiguatingDescription": "Hues of Grey, Diameter: 50cm"
      }
    },
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 743,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205686-GB",
        "sku": "205686-STK",
        "gtin13": "5703411768419",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Hues of Blue",
        "disambiguatingDescription": "Hues of Blue, Diameter: 50cm"
      }
    },
    {
      "@type": "Offer",
      "availability": "https://schema.org/InStock",
      "price": 743,
      "priceCurrency": "GBP",
      "itemCondition": "http://schema.org/NewCondition",
      "itemOffered": {
        "@type": "Product",
        "productID": "205689-GB",
        "sku": "205689-STK",
        "gtin13": "5703411768983",
        "name": "Louis Poulsen PH 5 Pendant Light Contemporary Hues",
        "color": "Hues of Orange",
        "disambiguatingDescription": "Hues of Orange, Diameter: 50cm"
      }
    },
    {
      "@type": "AggregateOffer",
      "lowPrice": 612,
      "highPrice": 743,
      "priceCurrency": "GBP",
      "offerCount": 7
    }
  ],
  "image": "https://dm4c9mjc2jvtf.cloudfront.net/product-media/270Y/1000/1000/Louis-Poulsen-PH5-Pendant-Light-Modern-White-Pale-Rose.jpg"
}

They sell lighting, and this has some really interesting differences to the other clothes based retailers.

We have a Product, which contains offers, which contain a Product. It does validate. We have something disambiguate the various “offers”. The productIDs and skus duplicate, which you wouldn’t actually expect from a stock keeping point of view, so there’s something not quite accurate there. A “sku” is a “stock keeping unit” which means it should differ for different things. The gtin13 does differ in this way though.

Conclusions on the Survey

We don’t see uniformity in what information to include in the schema.org Product items. We don’t have agreement on how to encode the variants that a product may have. Each example does very well in it’s own product category on google, (for me anyhow) so they can all be considered leaders for some specific search queries, so we can’t even say one is right and one is wrong.

I do wonder what you could actually do with all this from a search engine provider point of view. If you had agreement over the structure, sure, but without that how do you make sense of it.

Next is using the name of the offer to disambiguate the variants, Nest is using a special term for it. Neither are are using the ProductGroup type which is meant for things that vary in specific ways, which is the case here. So I guess that’s out.

I also note that all examples have used the json+ld format, as opposed to microdata which I think makes sense.

None are showing “ratings”, or “materials”. Most have “color”.