Learn · Structured data
Review schema explained
Review schema is structured data that describes a review of a product, business or service so search engines can display star ratings — the gold-star rich results — underneath your site in the search listings. In 2026, Google reads two related Schema.org types: Review (a single review) and AggregateRating (the overall star rating and review count).
Last reviewed by the Reviews Widget product team.
What review schema is
Review schema is structured data in the schema.org vocabulary that tells search engines a piece of content is a review: who wrote it, what it is about, the star rating and the text. It is normally written as a JSON-LD block in the page's HTML.
Structured data does not change what a page says; it changes how reliably a machine can read it. That matters for classic rich results and, increasingly, for AI answer engines summarising a business from its own site.
Review vs AggregateRating
| Review | AggregateRating | |
|---|---|---|
| Describes | One individual review | The summary of many reviews |
| Key properties | author, reviewRating, reviewBody, datePublished | ratingValue, reviewCount or ratingCount |
| Usually nested in | The item being reviewed | The item being reviewed |
| Used alone? | Yes, but weak on its own | Risky — engines expect reviews behind the number |
A minimal working example
The smallest well-formed block for a local business with reviews:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Acme Café",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "217"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "Sam T." },
"datePublished": "2026-06-14",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5",
"worstRating": "1"
},
"reviewBody": "Best flat white in the neighbourhood."
}]
}Reviews Widget outputs a superset of this automatically for every embed, matched to the reviews actually rendered on the page, so you never author the JSON-LD yourself.
What Google actually shows in search
When a page is eligible, review rich results can add gold stars, the numeric rating and the review count beneath the title in search. Eligibility is the operative word: valid markup makes a page a candidate, it does not entitle it to the treatment.
Google decides per query and per page whether to render a rich result at all. Correct markup that produces no visible stars is a normal outcome, not a bug in your implementation.
Google's self-serving review policy
Google excludes self-serving reviews from review rich results: reviews about a business, displayed on that business's own site. This applies even when the reviews are genuine and originally came from Google, Trustpilot, Yelp, TripAdvisor, Facebook, Booking.com, Airbnb, Amazon, ProductReview.com.au, G2 or Etsy. Embedded reviews are a conversion asset, not a star-snippet tactic.
It is worth being blunt about this, because the widget market is full of the opposite claim. Where review stars legitimately do appear for a business in search, they usually come from Google's own Business Profile data in the local results, not from JSON-LD on the business's website.
Product review markup is different: reviews of a product you sell, on that product's page, can be eligible when fed by genuine per-product review data.
Mistakes that break review rich results
| Mistake | Symptom | Fix |
|---|---|---|
| Marking up an unsupported entity type | Rich Results Test finds no eligible item | Nest ratings under LocalBusiness, Product, Recipe, Event, etc. |
| AggregateRating with no Review objects | Markup valid, rich result never appears | Include the individual reviews behind the number |
| Non-default rating scale, no bounds | Ratings misread, e.g. 8 out of 5 | Set bestRating and worstRating explicitly |
| Markup describing content not on the page | Risk of a manual action for hidden content | Only mark up reviews the visitor can actually see |
| Two conflicting AggregateRating blocks | Engines pick one, often the wrong one | Emit one aggregate per entity per page |
| Stale counts hard-coded in the template | Schema disagrees with visible content | Generate the JSON-LD from the same data you render |
A five-minute validation checklist
- Run the live URL through Google's Rich Results Test and confirm zero errors.
- Confirm the
ratingValuematches the average shown on the page. - Confirm
reviewCountmatches the reviews actually available. - Check only one aggregate exists per entity on the page.
- Re-check after any redesign — templates are where duplicate blocks creep in.
Sources & further reading
- Google Search Central — review snippet guidelines — Eligibility rules and the self-serving exclusion
- Google Search Central — structured data general guidelines — Hidden-content and accuracy requirements
- Schema.org — Review — Canonical property definitions
- Google Rich Results Test — The validator referenced in the checklist