Review schema markup explained
What review schema markup is
Review schema markup is structured data you add to a page so search engines can read a review as a review rather than as ordinary text. It records who wrote it, what it is about, and what rating they gave, in a format defined at schema.org.
It is what makes a star rating possible in a search result. It does not make one happen — Google decides that separately — but without the markup there is nothing for it to decide about.
Review, AggregateRating and the thing they attach to
Three types get mixed up constantly, and they do different jobs.
| Type | What it describes | When to use it |
|---|---|---|
| Review | One review by one person | A single testimonial, with author and rating |
| AggregateRating | The average and the count | “4.8 from 312 reviews” — the summary, not the individual reviews |
| The parent item | What is being reviewed | Product, LocalBusiness, Organization, Service, Recipe, Book, Course, Event, SoftwareApplication |
Review and AggregateRating are never standalone. They are nested inside the thing they are about. Markup that declares an AggregateRating with nothing attached to it is invalid, and it is the most common mistake in this area.
What valid markup looks like
JSON-LD in a script tag is the format Google prefers. This is an AggregateRating on a Product, which is the eligible case.
| Schema type | Review rich results | Notes |
|---|---|---|
| Product | Eligible | The route that still works |
| Recipe, Book, Course, Event, Movie, Software | Eligible | Only if the page really is one of these |
| LocalBusiness | Not shown since 2019 | Self-serving reviews were excluded |
| Organization | Not shown since 2019 | Same exclusion |
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Merino Wool Scarf",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "312",
"bestRating": "5"
}
}
</script>Four things make it valid: ratingValue is a number, reviewCount or ratingCount is present and not zero, the rating scale is stated or defaults to 5, and the marked-up reviews are actually visible on the page. Marking up reviews that a visitor cannot see is a guidelines violation and gets the rich result removed.
How to check whether yours works
Google’s Rich Results Test tells you whether the markup is valid and eligible. Search Console reports what Google has actually indexed and any errors it found across the site, which is the more useful signal because it reflects real pages rather than a single test.
Validation is not the same as display. A page can pass every test and still show no stars, either because of the self-serving restriction above or because Google simply chose not to.
What our widget outputs
Our widget emits Product schema with an AggregateRating built from your collected reviews. Product is the type that still produces star ratings in search results, so that is the type we use.
You do not have to set anything up. Connect your reviews, place the widget, and the markup goes out with it, formatted the way Google reads it.
It is on by default and there is a toggle to turn it off. The one time to switch it off is when another plugin on the same page already emits review markup — two conflicting sets are worse than one, and Google will usually ignore both.