Those star ratings you see under a product or business in search results are not automatic — they come from Review and AggregateRating schema. This structured data tells search engines and AI systems that real people rated something, how highly, and how many of them did. Add it correctly and you become eligible for star-rating rich results and far more likely to be surfaced when an AI assistant recommends products or services. Add it wrong, or fake it, and you risk a manual penalty. Here is how to do it properly.
Review vs AggregateRating: know the difference
These two schema types work together but describe different things. Review represents a single review — one author, one rating, one body of text. AggregateRating represents the summary of many reviews — an average score and a total count, such as 4.6 stars from 213 ratings. Most sites want both: individual reviews for depth and the aggregate for the headline star display.
AggregateRating attaches to a parent item — a Product, a LocalBusiness, a Recipe, a Course, or another supported type — not to a page in the abstract. Its core properties are ratingValue (the average), reviewCount or ratingCount (how many), and usually bestRating and worstRating to define the scale. This markup builds on the same JSON-LD foundations as everything else — our guide to JSON-LD and Schema.org covers the syntax if you are new to it.
Where review schema is allowed — and where it is not
Google's rules here are strict, and breaking them is the number one way sites lose their stars. Review and rating markup is allowed on specific types such as Product, LocalBusiness, Recipe, Book, Course, Event, and a handful of others. It is not allowed for reviews of an entire organization or website by that same organization — you cannot mark up "reviews of us, on our own site" as ratings for your homepage. That self-serving pattern is exactly what triggers penalties.
The ratings must also be genuinely visible to users on the same page. Schema is a machine-readable copy of what a person can see; it is not a place to inject numbers that appear nowhere on the page. If your product page shows 4.6 stars from 213 reviews, the schema restates that. If the page shows nothing, the schema should not claim a rating. For products specifically, review data pairs naturally with our Product schema guide for e-commerce; for physical businesses, with LocalBusiness schema.
Why ratings matter for AI recommendations
When an AI assistant is asked to recommend a product, a tool, or a local service, it leans on signals of quality and consensus. Structured rating data is one of the clearest such signals it can read: a machine-readable statement that many people rated this thing, and rated it well. Sites that expose honest AggregateRating data give answer engines a concrete reason to include them; sites that leave ratings locked inside images or JavaScript widgets give the model nothing to work with.
Honesty is the entire game. AI systems and search engines cross-reference. A page claiming 5.0 stars from 4,000 reviews with no visible reviews and no corroboration elsewhere is a red flag, not an advantage. Accurate, verifiable ratings that match what users actually see build the trust that gets you recommended.
Implementing it without getting penalized
Keep it simple and truthful. Mark up ratings only on the specific item being reviewed, using a supported type. Make sure the rating and count in your schema exactly match what is displayed on the page. Do not aggregate reviews from other sites and present them as your own. Do not mark up ratings for your whole business on your homepage. And validate everything with Google's Rich Results Test before you ship, so you catch a disallowed type or a missing property before it costs you.
Done right, review schema is one of the most visible wins in structured data — real stars in search and a genuine edge in AI recommendations. To check whether your rating markup is valid and actually readable by crawlers and AI, run the CheckMy.site scanner and confirm your stars are working for you, not sitting broken in the code.