Review schema: who can earn star ratings, and who cannot
Google will not show stars for reviews you control about yourself. Here is who is eligible, every property that matters, and the lines you must not cross.
What review schema is — and who is allowed stars
Review schema is the structured data that attaches a rating to a named item — one branch of schema markup. Google reads it and may print a review snippet: the stars, the score and the count beneath your search result.
Here is the restriction almost nobody writes up.
Google's review snippet reference (last updated 8 September 2026) supports Local business and Organization reviews only for sites that capture reviews about other businesses or organisations. If the reviewed entity controls the reviews about itself, its pages using those types are ineligible for the star review feature.
Read that twice if you run a brand site. The twelve testimonials on your homepage cannot earn stars — not because your code is wrong, but because you collected them about yourself.
Eligibility is Google's decision, not a function of whether your markup validates. These are the primary item types it names:
| Item type | What to know |
|---|---|
| Product | The commonest legitimate use. Reviews must be genuine and visible on the page. |
| Local business | Supported only for sites that review other businesses. Reviews you collect about yourself are ineligible. |
| Recipe | Also pairs with the recipe carousel. |
| Event | The event's own required properties still have to be valid. |
| Course list | Applies where course list markup is in place, not a lone course page. |
| Software App | Covers the app, not the company that makes it. |
| Book | Separate from the Book Actions programme. |
| Movie | Critic reviews need a publisher. |
Google also supports reviews on a further set of schema.org types and their subtypes:
| Also supported | What it is |
|---|---|
| CreativeWorkSeason · CreativeWorkSeries · Episode | Serialised content — a series, a season, a single episode. |
| Game · MediaObject · MusicPlaylist · MusicRecording | Games, media files, playlists and tracks. |
| Organization | Same restriction as Local business: only for sites that review other organisations. Your own testimonials stay ineligible. |
Article, Service and Job posting are on neither list. Review markup there is valid schema.org code that will never draw a star.
So is it still worth adding? On a supported type, with genuine reviews you did not collect about yourself, yes. Anywhere else, no. You gain machine-readable context nobody has promised to use, and you take on guideline risk for a snippet that cannot appear.
Review vs AggregateRating: two tags, two jobs
Review marks up one individual review — one author, one score, one date. AggregateRating marks up the summary — the average score across many ratings, plus how many there were. Almost every star rating you see in search is AggregateRating, because Google prints the average, not one person's opinion.
- Review needs a reviewer and the item. Use it for the individual reviews on the page.
- AggregateRating needs a value and a count — the "4.3 out of 5 from 412 ratings" line.
- Both can sit on one item: the aggregate as the summary, nested Review objects underneath.
- Either way, the ratings must be visible to a visitor on that page. Describing ratings a user cannot see is the most common reason review snippets quietly stop appearing.
Review properties: required, recommended, and what breaks
Four things are required: what was reviewed, who reviewed it, the rating object, and the score inside it. Everything else is recommended — the snippet can render without it, but you lose accuracy.
| Property | Status | What it does | What breaks without it |
|---|---|---|---|
| itemReviewed (with name) | Required | Names the thing being reviewed. | Google cannot tell what the rating is about. Item ineligible. |
| author (with name) | Required | Who wrote the review — Person or Organization. | Invalid. Also do not use your site name as the author. |
| reviewRating | Required | The Rating object that holds the score. | Nothing to show. Snippet cannot render. |
| reviewRating.ratingValue | Required | The numeric score given. | Invalid rating. Item dropped from eligibility. |
| bestRating | Recommended | Top of your scale. Google assumes 5 if absent. | A 9-out-of-10 score is read as 9 out of 5, and renders wrong or not at all. |
| worstRating | Recommended | Bottom of your scale. Google assumes 1 if absent. | Scales starting at 0 get misread. |
| datePublished | Recommended | When the review was written. | No freshness signal. Old reviews look current. |
| reviewBody | Recommended | The written text of the review. | Rating with no substance behind it. |
| publisher | Recommended | The outlet, for critic reviews. | Critic reviews lose attribution. |
AggregateRating properties: ratingCount is not reviewCount
AggregateRating needs the item, the average value, and at least one count. The two count properties are not interchangeable.
| Property | Status | What it means |
|---|---|---|
| itemReviewed (with name) | Required | The item the average belongs to. |
| ratingValue | Required | The average score, as a number. |
| ratingCount | At least one of these two is required | How many ratings the item has, including star-only ones with no text. |
| reviewCount | At least one of these two is required | How many reviews the item has — these may or may not carry a rating. |
| bestRating | Recommended | Top of the scale. Defaults to 5. |
| worstRating | Recommended | Bottom of the scale. Defaults to 1. |
Worked example. A copper water bottle on a D2C store collects 412 star ratings, of which 58 people also wrote something. That is ratingCount 412 and reviewCount 58 — not 412 twice, and not 58 in both fields. Supply both when you have both.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Copper Water Bottle 1L",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.3",
"bestRating": "5",
"worstRating": "1",
"ratingCount": "412",
"reviewCount": "58"
}
}
Google's review guidelines — and what changed on 24 July 2026
On 24 July 2026, per Google's documentation updates log, a new review snippet guideline was added covering fake and undisclosed incentivised reviews. In plain English: the reviews have to be real, and anything you gave in exchange has to be disclosed.
The full set of rules you have to clear before marking anything up:
- No fake or undisclosed incentivised reviews. Google's wording: "Don't include fake or undisclosed incentivized reviews on your page or in your structured data markup." Its examples: reviews not based on a genuine experience, and reviews given in exchange for an undisclosed benefit.
- Disclose any benefit given. A discount, a free sample or a prize draw entry counts, and the disclosure has to be clear and prominent.
- No reviews you control about yourself. Local business and Organization are supported only for sites capturing reviews about other businesses or organisations. Where the reviewed entity controls the reviews, those pages are ineligible for the star review feature.
- Reviews must be on the page, visible to a user, and about the exact item you marked up.
- Only mark up ratings your own site hosts. Pulling an average in from a marketplace or a maps profile and declaring it as yours is not allowed.
One more honest note, because the opposite gets sold a lot. Structured data is not an AI visibility tactic. Google's guidance on its AI features (last updated 10 July 2026) states there are no additional technical requirements and no special structured data needed to appear in AI Overviews or AI Mode. Review markup governs rich-result eligibility in Search. That is the whole of its job.
Why we decline testimonial markup — and what we do instead
From our own client work: this request reaches us every few months. "We have twelve glowing testimonials on the homepage. Can you make the stars show up in Google?"
We say no, and we give the same two reasons each time.
First, it would not work. Google supports Organization and Local business reviews only for sites that review other organisations, and testimonials you gathered about yourself are the exact case its documentation rules out. The page is ineligible before the markup is even written.
Second, the downside is not zero. Markup that misrepresents a page is exactly what a manual action for spammy structured data exists to catch. Trading site-wide credibility for a snippet that cannot render is a bad bet.
So we do not put Review or AggregateRating markup on our own testimonials, or on a client's. Here is what we do instead:
- Send rating demand to Google Business Profile. Real customer reviews there already carry stars in Maps and local results — see how to optimise the profile so they get seen.
- Fix the local fundamentals first. A profile nobody surfaces collects no reviews. Work the local SEO checklist before chasing stars.
- On ecommerce, collect genuine reviews on product pages and mark those up. Product is an eligible type, which makes it the one place stars are properly winnable — the ecommerce SEO guide covers the page structure.
- Treat review volume and sentiment as its own workstream, not a markup job. In regulated sectors it needs a defined process, as in our take on healthcare reputation management.
Testimonials still belong on the page. They convert. They just do not get stars.
Three patterns that risk a manual action
Almost every review snippet problem we audit is one of these three.
| Pattern | Why it fails | Do this instead |
|---|---|---|
| Marking up reviews not visible on the page | Marked-up content must be available to the user. Snippets get withheld. | Render the reviews and the average in the HTML a visitor sees, then mark up what is there. |
| Aggregating ratings your site does not host | Importing a marketplace or maps average claims reviews that are not yours. | Only aggregate ratings collected and displayed on your own site. |
| Review markup on your own testimonials | Where the reviewed entity controls the reviews, the page is ineligible — so the markup only creates misrepresentation risk. | Keep testimonials unmarked. Build real reviews on the profile and on product pages. |
Where to add the markup, and how to check it
One WordPress trap first. Do not paste a JSON-LD block into the post editor. Many sites — ours included — strip in-body JSON-LD to stop duplicate schema, so it silently disappears on save. It belongs in your SEO plugin's custom schema field, your theme head, or the plugin that already holds your real review data.
- Confirm the item type is supported and that you do not control the reviews about the item. If either fails, stop here.
- Check the reviews are real, yours and visible. If any of the three is false, the markup is a liability.
- Build the block. Our schema markup generator produces the object with the right property names.
- Paste it into AIOSEO > Schema > Custom Schema (or your own plugin's equivalent), never into the body.
- Validate the live URL in Google's Rich Results Test, then watch the matching Search Console enhancement report for errors.
- Keep the numbers in sync. A hardcoded ratingValue drifts within a month. Generate it from live review data.
Where to go from here
Stars are winnable. They are just not winnable on reviews you own.
For most Indian businesses that leaves two real places: product pages carrying genuine customer reviews, and the Google Business Profile that already shows ratings. Both run on review collection, not markup. Get that right and the snippet follows, with nothing on the page you would have to defend.
Frequently asked questions
Does review schema work on a blog post or service page?
No. Google's review snippet reference, last updated 8 September 2026, names Product, Local business, Recipe, Event, Course list, Software App, Book and Movie as the primary supported types, plus a set of creative-work, media and Organization types. Article and Service are on neither list, so markup there never produces a star rating.
Can I put AggregateRating on my homepage using client testimonials?
No. Google supports Local business and Organization reviews only for sites that capture reviews about other businesses or organisations. Where the reviewed entity controls the reviews about itself, those pages are ineligible for the star review feature. We decline this on client sites because it cannot work and it creates misrepresentation risk for nothing.
What is the difference between ratingCount and reviewCount?
ratingCount is how many ratings the item has, including star-only ones with no written text. reviewCount is how many reviews it has, which may or may not carry a rating. At least one of the two is required on AggregateRating. Supply both when you hold both.
Does review schema help with AI Overviews or AI Mode?
No. Google's guidance on its AI features, last updated 10 July 2026, states there are no additional technical requirements and no special structured data needed for AI Overviews or AI Mode. Review markup decides rich-result eligibility in Search, nothing more.
Do I need bestRating and worstRating?
Recommended, not required. Google assumes a scale of 1 to 5 when they are missing. If your scale is anything else — out of 10, or starting at 0 — include both, or a score like 9 is read as 9 out of 5 and renders wrongly or not at all.
Real reviews, on the profile that already shows stars
We build review collection, profile optimisation and local visibility into one programme — no markup shortcuts.
Related guides
Make Digital Hangover a preferred source
One tap tells Google to show more of our SEO and marketing coverage in your Top Stories.
