
Element Code: RI-012
What this check actually flags
This check fires when a page clearly presents review content, think star widgets, customer testimonials with scores, or an editorial verdict, while the HTML carries no Review or AggregateRating structured data. Google can read the visible text just fine. What it cannot do without markup is trust that "4.6 out of 5" is a rating, tie that number to the specific product or recipe on the page, and turn it into a review snippet with stars under your title in the results.
I run into this constantly in audits: the review system renders beautifully for humans while the structured data layer was never wired up, or a theme update quietly dropped the markup and nobody noticed because the page still looks fine in a browser. The visible reviews and the machine readable reviews are two separate systems, and this check is telling you the second one is missing.
Review, AggregateRating, or both
These two types get mixed up all the time, so let's settle it. A Review is one written evaluation: it has an author, a body, and a single reviewRating. An AggregateRating is a statistical summary: the average score across many ratings plus a count of how many people rated. They are not interchangeable, and the stars you see in search results are usually powered by the aggregate.
Both belong nested inside the thing being reviewed. You do not publish a lonely Review block floating in the page; you publish a Product, Recipe, or SoftwareApplication entity that contains a review property and an aggregateRating property. Google is explicit that review markup must describe the primary item on that page, not something mentioned in passing.
Why the stars are worth the effort
Review snippets do one job: they make your result physically bigger and visually different from the plain links around it. Nobody serious will promise you a fixed CTR lift, and you should side-eye anyone quoting a universal percentage, but on commercial queries where half the results carry stars and yours does not, you look like the off-brand option.
Eligibility is limited, and this is where teams waste time. Google's review snippet documentation lists the supported content types: Book, Course, Event, Local business, Movie, Product, Recipe, and Software App. And there is a big carve-out: since Google's September 2019 review rich results update, self-serving reviews are ineligible, meaning a LocalBusiness or Organization cannot earn stars from reviews about itself hosted on its own site. If that is your situation, no amount of markup brings the stars back, and that is by design, not a bug in your implementation.
| Property | Applies to | Status | Notes |
|---|---|---|---|
itemReviewed | Review, AggregateRating | Required | The thing being reviewed, typed as Product, Recipe, and so on; satisfied automatically when you nest |
reviewRating.ratingValue | Review | Required | The numeric score of that single review |
author | Review | Required | A Person or Organization with a real name, not a username |
ratingValue | AggregateRating | Required | The average score across all ratings |
ratingCount or reviewCount | AggregateRating | One required | How many ratings feed the average |
bestRating / worstRating | Both | Conditional | Only needed when your scale is not 1 to 5 |
datePublished | Review | Recommended | Cheap to add if your review system stores dates, so add it |
How to detect missing or broken review markup
- Rich Results Test: paste the URL into Google's Rich Results Test and check whether "Review snippets" appears in the detected items. It also surfaces errors like a missing itemReviewed or an unparseable rating value.
- Search Console: the Review snippets report under Enhancements shows valid and invalid items across the whole property. A template-level failure shows up as a cliff in the valid count, which is your fastest early warning after a release.
- Screaming Frog: enable JSON-LD extraction plus Google rich result validation under Config, then crawl and work the Structured Data tab. Cross-reference it against pages whose visible HTML contains rating strings but report no review features; that intersection is your gap list.
- View source: for spot checks, search the raw HTML for application/ld+json and read what is actually in there. Tag managers and review plugins love injecting half-formed blocks that look like markup and validate as nothing.
How to fix it, step by step
- Confirm the page type is on the eligible list above. If you are trying to get stars on a service page or your own homepage, stop here and spend the effort elsewhere.
- Decide what you have: one editorial review, aggregated user ratings, or both. Most ecommerce and recipe templates want both.
- Generate the values from your live review database. The numbers must move when new reviews come in; a hardcoded 4.8 in a template is fiction, and it is also a guideline violation that can cost you every rich result on the site.
- Nest the review and aggregateRating properties inside the main entity for the page and output it as a single JSON-LD block.
- Validate, deploy, request indexing on a couple of representative URLs, then watch the Search Console report over the following weeks.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Acme Standing Desk",
"image": "https://example.com/desk.jpg",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"reviewCount": 213
},
"review": [{
"@type": "Review",
"author": {"@type": "Person", "name": "Dana K."},
"datePublished": "2026-05-14",
"reviewRating": {"@type": "Rating", "ratingValue": 5},
"reviewBody": "Sturdy frame, quiet motor, easy assembly."
}]
}What good looks like
Every templated page with visible reviews carries markup generated from the same data source as the visible widget. The Search Console report shows valid items climbing with zero errors. The numbers in the markup match the numbers on screen to the decimal. And stars appear on a meaningful share of your eligible URLs, never all of them, because Google shows snippets when it decides the query deserves one, and that part is not yours to control.
- Mark up only reviews visitors can actually read on that page
- Pull ratingValue and reviewCount from your live review data
- Nest review and aggregateRating inside the reviewed item
- Use real author names for individual reviews
- Validate in the Rich Results Test before and after deploy
- Don't add review markup about your own Organization or LocalBusiness; self-serving reviews are ineligible
- Don't invent, round up, or freeze rating numbers in a template
- Don't mark up reviews copied from third party sites
- Don't leave the author as "admin" or a bare username
- Don't expect stars on every query; Google decides when to show them
FAQ
My markup validates, so where are my stars?
Review or AggregateRating: which one actually gets the stars?
Can I mark up my Google Business Profile reviews on my site?
Do star ratings improve rankings?
What rating scale should I use?
Want the whole structured data layer checked, not just this one issue?
A single missing schema type is usually a symptom. My advanced SEO audit reviews every rich result opportunity on your site, what is broken, what is missing, and what is quietly violating guidelines.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







