Search code examples
blogsschema.orgreview

Proper Schema.org markup for product reviews - that are blog posts


What's the proper Schema.org JSON-LD for a blog post / article that is solely meant to be a review for a product? Example of a practical usage that's ubiqutous on the web: I own a website that has a blog writing reviews and providing affiliate links (for example Amazon).

Technically, this is a Product, it's a Review, and obviously it's an Article (BlogPosting?).

On the Product you can nest the Review structure. So, this seems to be more focused with the pages content and this is the one I would assume is to be used. But, it is still an article and technically the site doesn't offer the product itself making the Product type seem incorrect.

So how exactly are you supposed to handle affiliate markup like this for blog sites without getting potentially dinged for marking up misleading information?


Solution

  • It depends on how expressive you want to be. For consumers interested in reviews, the first snippet would typically be all they need, as it’s likely not relevant to them if the review is published as blog post, as article, as forum post etc.


    The minimum would be a Review with itemReviewed:

    {
      "@context": "https://schema.org/",
      "@type": "Review",
      "itemReviewed": {
        "@type": "Product"
      }
    }
    

    If you want to convey that the review is published as a blog post, you could use BlogPosting in addition:

    {
      "@context": "https://schema.org/",
      "@type": ["Review", "BlogPosting"],
      "itemReviewed": {
        "@type": "Product"
      }
    }
    

    If the BlogPosting consists of more than just the Review, but the Review is the primary content, you could use mainEntity with separate entities (and if it’s not the primary entity, you could use hasPart instead):

    {
      "@context": "https://schema.org/",
      "@type": "BlogPosting",
      "mainEntity": {
        "@type": "Review",
        "itemReviewed": {
          "@type": "Product"
        }
      }
    }
    

    And if you want to provide data about the web page which contains the blog posting which is/contains the review, you could use ItemPage with mainEntity:

    {
      "@context": "https://schema.org/",
      "@type": "ItemPage",
      "mainEntity": {
        "@type": ["Review", "BlogPosting"],
        "itemReviewed": {
          "@type": "Product"
        }
      }
    }
    
    {
      "@context": "https://schema.org/",
      "@type": "ItemPage",
      "mainEntity": {
        "@type": "BlogPosting",
        "mainEntity": {
          "@type": "Review",
          "itemReviewed": {
            "@type": "Product"
          }
        }
      }
    }