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
Reviewblock 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.5is fine; so is9. - bestRating - the top of the scale. Defaults to
5if 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
Personwithnameand, if you supply an author URL,url. This is who wrote the review. - publisher is emitted as an
Organizationwith 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-14or2024-03-14T09:00:00+01:00.March 14, 2024gets 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, notReview, 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.