Skip to content
Instant · runs in your browser

Review Schema Generator for Editorial Review JSON-LD

Review JSON-LD for the 17 types Google shows review snippets for.

Review schema generator output is only worth generating if someone other than you wrote the review. Google ignores self-serving reviews, and that phrase covers more ground than most people assume: a review of your own product, on your own site, written by you or by your company, is not eligible for a review snippet no matter how correct the markup is. The block will validate. It will parse. It will do nothing. Everything below assumes you're marking up an editorial review of something you don't sell.

Leave blank unless you know you need it. If you type something Google does not recognise, we flag it rather than putting a made-up type in your markup.

Year first, then month, then day: 2024-03-14.

Dominate AI Search Using a Proven System

BlazeHive runs the whole system for you - finds the keywords buyers actually search, writes the pages end to end, and publishes them so you show up in Google and in AI answers. Free trial, no card.

Start with BlazeHive Free trial

The self-serving rule decides whether review markup is worth doing

Google's review snippet guidelines exclude reviews a business writes about itself. In practice that rules out most of the Review markup on the web:

  • A SaaS company marking up a 5-star testimonial about its own product.
  • An agency putting a Review block on its own homepage.
  • A store publishing its own average rating for its own inventory as an editorial review.

What does qualify:

  • A publication reviewing a product, a movie, a book, or a piece of software.
  • A directory or comparison site reviewing a business it isn't affiliated with.
  • A customer review collected from a third party and attributed to that person, on a page where the review is visibly theirs.

The distinction is the author. If the author on the block resolves to the same entity as the thing being reviewed or the site publishing it, the review is self-serving. That's why the generator treats author name as required and describes it as a person or an organization, never the site itself.

What the subtype field actually sets

The More specific type field on this page does not change the @type of the review. The review is always Review. The subtype sets the @type of itemReviewed - the thing under review.

It accepts exactly the seventeen types Google documents as eligible for review snippets:

Book, Course, CreativeWorkSeason, CreativeWorkSeries, Episode, Event, Game, HowTo, LocalBusiness, MediaObject, Movie, MusicPlaylist, MusicRecording, Organization, Product, Recipe, SoftwareApplication.

Anything outside that list is flagged as unrecognized and dropped, with the output falling back to Product. There's a reason the list is a whitelist rather than free text: reviewing a type Google doesn't recognize for snippets produces markup that is syntactically fine and functionally inert, and you'd never know from a validator. If your subject is genuinely something else, the honest answer is that a review snippet isn't available for it.

Product is the default and the right choice for most physical and digital goods. SoftwareApplication is the correct type for apps and SaaS. LocalBusiness covers a review of a restaurant or a service business by someone unaffiliated with it.

3 more fields feed the same node rather than the review: name is the name of the thing reviewed, page URL becomes itemReviewed.url, and image URLs become itemReviewed.image. Name is required - a review of something unnamed identifies nothing.

Ratings need a scale, not just a number

2 fields build the reviewRating node, and a third matters by its absence:

  • ratingValue - the score. Required. 4.5 is fine; so is 9.
  • bestRating - the top of the scale. Defaults to 5 if left blank, which is why a 9-out-of-10 score with an empty bestRating is a silent error waiting to happen. Fill it in whenever your scale isn't out of five.
  • worstRating isn't on this form. It defaults to 1, which is correct for virtually every scale in use.

2 checks run on what you type. A rating value that isn't a number is flagged. A rating value above the best rating - 9 out of 5 - is flagged, because that combination is the most common way a review block ends up meaningless. Neither check blocks output; both appear as notices.

Whatever scale you use, it has to be the scale shown on the page. A visible "9/10" and a marked-up 4.5 is a mismatch, and mismatches between structured data and visible content are what manual actions are made of.

Author, publisher, and date

  • author is emitted as a Person with name and, if you supply an author URL, url. This is who wrote the review.
  • publisher is emitted as an Organization with a name. This is the site hosting the review. On an editorial review, author and publisher are genuinely different: Jane Rivera writing for Example Media.
  • datePublished wants ISO 8601. 2024-03-14 or 2024-03-14T09:00:00+01:00. March 14, 2024 gets a notice.
  • reviewBody is the review text itself. It's recommended rather than required, and a Review node without one is a rating with no reasoning attached. Include it.

Blank fields never reach the output. There's no "author": null, and a nested object that would hold nothing but a @type is dropped entirely rather than shipped empty.

A worked schema-builder example

An editorial review of a piece of software, subtype SoftwareApplication:

{
  "@context": "https://schema.org",
  "@type": "Review",
  "itemReviewed": {
    "@type": "SoftwareApplication",
    "name": "Kestrel Log Viewer 3.2",
    "url": "https://kestrel.example.com"
  },
  "reviewRating": {
    "@type": "Rating",
    "ratingValue": "3.5",
    "bestRating": "5"
  },
  "author": {
    "@type": "Person",
    "name": "Jane Rivera",
    "url": "https://example.com/about/jane-rivera"
  },
  "datePublished": "2024-03-14",
  "reviewBody": "Fast on 10GB files and the regex filter is genuinely good, but saved searches vanish on upgrade and support took nine days to answer.",
  "publisher": {
    "@type": "Organization",
    "name": "Example Media"
  }
}

6 properties, no padding. Only what Google documents as required or recommended for Review is emitted, and the escaping of <, >, and & as \u003c, \u003e, and \u0026 means a review body quoting some HTML can't terminate the <script> element it's pasted into.

Review schema, aggregateRating, and Product markup

These get confused constantly, so:

  • Review is one review by one author. Use it when a page contains a single editorial review.
  • aggregateRating is a summary of many ratings - a value plus a count. It needs both to be valid; supply one without the other and the node is dropped. It's legitimate when you're aggregating other people's ratings, not your own.
  • Product markup with a nested review is what you want on an ecommerce product page. The root type is Product, not Review, and the review hangs off it. If that's your case, use the product generator rather than this one.

A standalone Review block on an ecommerce product page is the wrong shape and, if it's your own product, self-serving on top of that.

Run the finished block through Google's Rich Results Test for eligibility and the schema.org validator for vocabulary. If review markup is one line item on a much longer content program, BlazeHive automates SEO content end to end, structured data included.

Dominate AI Search Using a Proven System

BlazeHive runs the whole system for you - finds the keywords buyers actually search, writes the pages end to end, and publishes them so you show up in Google and in AI answers. Free trial, no card.

Start with BlazeHive Free trial

Frequently Asked Questions

Can I mark up testimonials on my own website?

You can generate valid markup for them, and Google will disregard it. Testimonials you collected about your own business are self-serving reviews and are excluded from review snippets. Publish them for humans; don't expect stars.

What happens if I leave bestRating blank?

It defaults to 5. That's correct for a 5-point scale and wrong for anything else, and nothing will warn you at crawl time. If your scale is out of ten or out of 100, fill the field.

Does the subtype change the type of the review?

No. The review is always @type: Review. The subtype sets itemReviewed.@type - what's being reviewed. That's why the list is Google's seventeen review-eligible types rather than every type on schema.org.

Do I need a reviewBody?

Not to validate, but yes in practice. A rating with no text is a number with no argument behind it, and it gives every downstream consumer of the markup nothing to quote.

Should the author be a person or my company?

Whichever actually wrote it, as long as it isn't the same entity as the thing reviewed. A named person with a bio page is the strongest version. The site's own name as author on a review of the site's own product is the pattern Google filters.

Why is my rating value flagged?

2 checks fire: a value that doesn't parse as a number, and a value higher than bestRating. The second usually means a 10-point score with the default 5-point scale still in place.

Related free tools

All tools →