Schema

How to Add Review Schema for Star Ratings in Google

Those gold stars under a search result are one of the few rich result features you can add yourself with a few lines of code. Done right, they make your listing the one a scanning eye stops on. Done wrong, they do nothing, or worse, they trip a manual action. The catch most people never hear is that the single most common use, a local business putting its five star reviews on its own homepage, has been ineligible since 2019. This is what actually works, with real code.

Review schema is structured data that tells Google a rating lives on your page. It comes in two flavors that people constantly mix up. A Review describes one rating from one person, with an author and usually a written opinion. An AggregateRating summarizes a pile of ratings into an average and a count, the four point seven out of five from two hundred and three reviews you see everywhere. They are different objects, they attach to different things, and Google has different eligibility rules for each.

Before you write a line of it, understand what the stars are and are not. They are a presentation feature, not a ranking boost. They will not push your page up a single position. What they do is make the result physically larger and more eye catching, which tends to lift click through rate. That is the whole payoff, and it is a real one, but it means review markup is worth adding only where it is honest and eligible. The rest of this page is about staying on the right side of that line.

What is the difference between Review and aggregateRating schema?

A Review is a single rating with an author and a text body. An aggregateRating is the summary of many ratings, carrying an average value and a count. You can use either alone or both together, but both must always be nested inside a parent item, such as a Product or a Recipe, never floating on their own.

The mistake I see most is treating AggregateRating as a standalone block. It is not a valid top level type for a rich result. It has to be a property of something Google reviews, and that something is the real subject of the markup. If you sell a stand mixer, the Product is the parent and the aggregateRating hangs off it. If you publish a recipe, the Recipe is the parent. The rating describes that item, so it must live inside it.

A single Review needs three things to be useful: an author (a Person or Organization, with a real name, not the word "Anonymous"), a reviewRating with a ratingValue, and the thing being reviewed as the parent. An AggregateRating needs a ratingValue and either a reviewCount or a ratingCount. Leave out the count and Google treats the markup as incomplete and skips the stars entirely. If you are fuzzy on how any of these objects nest, the broader explainer on what schema markup is and why it matters walks through the parent-child structure before you get into a specific type.

Which item types are eligible for review stars?

Google shows review stars only for a defined set of types: Product, Recipe, Book, Movie, Course, Event, SoftwareApplication, LocalBusiness, Organization, and a handful of others. The most painful exclusion is the one people want most. A LocalBusiness or Organization cannot show stars from reviews of itself published on its own site.

The supported list is finite and Google publishes it. The common, safe, high value cases are products in an online store, recipes on a food blog, books, online courses, software and apps, and individual events. For those, review and aggregate rating markup works as expected and the stars can appear. If your page is genuinely about one of those things, you are in good shape.

Where it falls apart is the most requested scenario of all: a plumber, a dentist, a law firm wanting the testimonials on their homepage to render as gold stars in search. That is a LocalBusiness or Organization reviewing itself, and Google calls it a self-serving review. It is technically valid markup. The Rich Results Test will even say it is eligible. But Google will not display the stars, by policy, and has not since 2019. I will cover exactly why in the next section, because it is the single biggest source of wasted effort I run into during a schema markup audit.

Why can't I show review stars for my own business?

In September 2019 Google stopped displaying review rich results for self-serving reviews, meaning ratings of a business that the business itself controls and publishes on its own pages. The reason is trust: a company grading itself has every incentive to inflate the score, so Google removed that loophole. The markup is not penalized, it is simply ignored for display.

This is the rule that breaks the most projects, so it is worth being precise. The block applies specifically to LocalBusiness and Organization (and their subtypes) when the review or aggregate rating is hosted on a site the business owns. A roofing company can put a glowing testimonial wall on its homepage, mark it up flawlessly, pass every validator, and the stars will never show. Google made the change because self-published self-praise was being abused to manufacture five star results, and there was no way for a search engine to trust a grade an entity assigns to itself.

The honest path forward is to stop trying to force it. Real star ratings for a service business come from where the public actually leaves reviews: the Google Business Profile, where verified customer ratings show in Maps and the local pack. If you genuinely sell a discrete product or course on your site, mark that up instead, because a product is a legitimate review target. And if a third party with editorial independence reviews your business and publishes it on their own site, they can mark up that review on their page. What you cannot do is grade yourself and expect Google to broadcast the grade. Anyone who tells you otherwise is selling markup that will sit there doing nothing.

What does correct review schema actually look like?

Use JSON-LD inside a script tag. Nest the rating inside the item it describes, give every aggregateRating a value and a count, and give every single Review a named author and a ratingValue. Here is a complete, eligible example for a product with both an aggregate rating and one individual review.

This is a real, valid block for a product page. It includes the aggregate (the average across all reviews) and one individual review with its author. Every number here must also be visible to a human reading the page, which is the rule the next section is about.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Cedar Cutting Board, 18 inch",
  "image": "https://example.com/img/cedar-board.jpg",
  "description": "Hand-finished cedar cutting board, 18 by 12 inches.",
  "brand": { "@type": "Brand", "name": "Northwoods Goods" },
  "sku": "NW-CB-18",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "128",
    "bestRating": "5",
    "worstRating": "1"
  },
  "review": {
    "@type": "Review",
    "author": { "@type": "Person", "name": "Dana Reyes" },
    "datePublished": "2026-04-18",
    "reviewBody": "Heavier than I expected and the finish is flawless. Two years in and no warping.",
    "reviewRating": {
      "@type": "Rating",
      "ratingValue": "5",
      "bestRating": "5",
      "worstRating": "1"
    }
  }
}
</script>

A few things to notice. The aggregateRating and the review are both properties of the Product, not separate top level objects. The reviewCount is present, so Google has the denominator it needs. Both ratings include bestRating and worstRating; these default to 5 and 1 if omitted, but stating them removes ambiguity if your scale is different. The author has a real name. If you want to generate a block like this for your own item without hand writing the braces, the schema generator outputs the same structure and is a faster way to avoid a stray comma.

Why must the schema match what's visible on the page?

Google requires that every rating, count, and review you put in the markup also appear in the visible content on the same page. Marking up a 4.9 average that no human can see anywhere is a guidelines violation that can trigger a manual action and remove all your rich results, not just the fabricated ones.

This is non-negotiable and it is where good intentions go wrong. If your JSON-LD claims an aggregate rating of 4.8 from 312 reviews, a visitor must be able to find that 4.8 and that 312, or the underlying reviews, somewhere on the rendered page. Structured data is supposed to mirror content, not invent it. Marking up ratings that exist only in the code, or numbers that do not match what is shown, is exactly the kind of thing Google's spam team issues manual actions for. A "Structured data issue" manual action can strip rich results from your whole site.

The same applies to individual reviews. If you mark up a five star review from "Dana Reyes," that review's text and rating need to actually render on the page, not sit hidden in markup while the visible section shows different testimonials. The safe mental model is: write the visible content first, then describe exactly that content in the schema. Never the reverse. When I build review markup into a client site, the markup is generated from the same data that renders the on-page reviews, so the two can never drift apart. That is the only way to keep it both effective and clean over time.

How do I test review schema with the Rich Results Test?

Run your URL or pasted code through Google's Rich Results Test at search.google.com/test/rich-results. It tells you whether the page is eligible for a review snippet and lists every error and warning. Eligible means the markup is valid and could show stars, but Google still decides case by case whether to display them.

The workflow is simple. Paste your live URL or the raw HTML into the Rich Results Test. It parses the page, detects the review markup, and reports it under a "Review snippets" result. Errors are hard failures, usually a missing required field like ratingValue or a missing author, and they must be fixed. Warnings flag recommended fields you left out, such as datePublished; they will not block the snippet but are worth filling in. The companion Schema Markup Validator at validator.schema.org checks raw schema.org correctness without Google's eligibility layer, which is useful when you want to know if the JSON itself is well formed.

Two expectations to set before you test. First, "eligible" is not "guaranteed." The test confirms your markup qualifies; Google's live ranking systems still choose whether to render stars for any given query, and they often do not for self-serving cases even when the test passes. Second, if you tested a self-reviewing LocalBusiness and saw it pass, that pass is real but meaningless for display, which is the trap the test does not warn you about. After fixing errors and deploying, use the URL Inspection tool in Search Console to ask Google to recrawl, then watch the Enhancements reports for the review snippet status over the following days. Stars do not appear instantly; recrawl and re-evaluation take time.

Related Internal Links

Use these to connect review markup to the wider schema work and to the service that handles it end to end.

FAQ

Can I add review schema for reviews of my own business?

No. Since September 2019 Google does not show review rich results when a business marks up reviews of itself on its own site, called self-serving reviews. Star ratings still work for products, recipes, books, courses, software, and similar item types, just not for LocalBusiness or Organization reviewing itself.

What is the difference between Review and aggregateRating schema?

A Review is a single rating with an author and a body of text. An aggregateRating is a summary of many ratings with an average value and a review count. You can use one or both, but every rating value and count in the markup must match the reviews actually visible on the page.

Why are my star ratings not showing up in Google?

The most common reasons are self-serving review markup that Google ignores, ratings in the schema that do not appear in the visible content, an unsupported item type, or a missing required property like ratingValue or author. Even with valid markup, Google decides whether to display rich results and never guarantees them.

Do review stars in search results improve rankings?

Review stars are not a direct ranking factor. They do not move you up the results, but they make your listing visually stand out, which can raise click through rate. The benefit is attention and clicks, not position.

Want your review markup done right, not just done?

Joseph W. Anady builds eligible, guidelines-clean review and rating schema that matches your visible content, and tells you honestly when stars are not possible for your page so you do not waste effort on markup Google will ignore.

Impression Growth Library

Crafted by ThatDeveloperGuy.com