AggregateRating Schema

How to implement AggregateRating schema markup for star ratings in search results, what schema.org/AggregateRating covers vs. what Google requires for review snippets, and eligibility and spam policies.

First published: Jun 27, 2026 · Last updated: Jul 17, 2026 · Advanced
demand #15 in Structured Data#40 in On-Page#193 in Technical SEO#267 on the site
1 evidence signal on this page

AggregateRating schema (schema.org/AggregateRating) marks up the average of many ratings or reviews of an item, as opposed to Review, which marks up one person's opinion. It's usually nested inside a parent type's aggregateRating property (Product, LocalBusiness, Recipe, and others), which is why it can skip itemReviewed — but Google also accepts a non-nested AggregateRating that names itemReviewed directly; either way the item being rated needs a name. Google's required properties for the star rich result are ratingValue, at least one of ratingCount or reviewCount, and itemReviewed (unless nested); bestRating and worstRating are recommended. The eligibility rule people get wrong: self-serving ratings are ineligible for the star feature specifically on LocalBusiness and Organization types — a business rating itself — but Product, Recipe, Movie, and most other supported types remain eligible for genuine ratings. ratingCount (all ratings, star-only included) and reviewCount (people who left a review, with or without a rating) are different numbers. Valid markup only earns star-rating eligibility, not ranking, and fake ratings can trigger a manual action.

TL;DR — AggregateRating is usually nested inside a parent type’s aggregateRating property (Product, LocalBusiness, Recipe, Book, Course, Event, Movie, SoftwareApplication, and others), which is why nested examples omit itemReviewed — but Google’s spec also supports a non-nested AggregateRating that names itemReviewed directly. Either way, the item being rated needs a name. Google’s required properties for the star rich result are ratingValue, at least one of ratingCount/reviewCount, and itemReviewed when not nested; bestRating/worstRating are recommended (essential for non-1–5 scales). The eligibility rule to get exactly right: self-serving ratings are ineligible for the star feature specifically on LocalBusiness/Organization — a business rating itself — while Product, Recipe, Movie, and most other supported types stay eligible for genuine ratings. ratingCount (all ratings, star-only included) and reviewCount (people who left a review, with or without a rating) are different numbers. Valid markup earns star eligibility, not ranking, and fabricated ratings can trigger a structured-data manual action. This topic is cross-listed under structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. and under ecommerce SEOEcommerce SEO is the practice of optimizing an online store so its product and category pages rank in organic search and attract purchase-intent visitors. It uses the same Google algorithm as any other site, but compounds the usual SEO work with commerce-specific challenges like faceted navigation, product variants, and platform-imposed URLs. because ratings markup is a recurring ecommerce audit item.

AggregateRating vs. Review — the distinction everything hinges on

Most competitor guides blur these two types into one flat requirements list. They’re distinct:

  • Review marks up one reviewer’s opinion of an item — a single person, a single reviewRating, a body of review text.
  • AggregateRating marks up the statistical average of many ratings — ratingValue plus a count.

Many real implementations use both together, nested inside the same parent type: an aggregateRating for the overall score and an array of review objects for individual opinions. Google’s guidance runs one direction, not both: if you’re already marking up multiple individual reviews, add an aggregate rating alongside them. That doesn’t mean an AggregateRating on its own needs invented Review objects to go with it — a page with only an aggregate and no individual reviews is a normal, complete implementation. If you only remember one thing: Review = one opinion, AggregateRating = the average of many. For the single-reviewer side, see the Review schemaReview schema (schema.org/Review) is structured data for a single critic's or user's evaluation of one specific thing — one author, one itemReviewed, one reviewRating — distinct from AggregateRating, which summarizes many reviews into an average. sibling.

Nested vs. non-nested — two valid ways to attach it

AggregateRating has no independent meaning on its own page, but it isn’t strictly “nest it or nothing” either. Google supports two shapes:

  • Nested (the common pattern) — AggregateRating sits inside another type’s aggregateRating property (Product, LocalBusiness, Recipe, and the rest of the supported list below). Because the parent type already identifies the item, a nested AggregateRating omits itemReviewed — but the parent item still needs a name.
  • Non-nestedAggregateRating can also stand on its own, provided it supplies itemReviewed naming the thing being rated. This is less common in practice but it’s a documented, valid path, not a workaround.

Either shape needs the reviewed item’s name somewhere — on the parent when nested, inside itemReviewed when not. The host types Google supports for the review/star rich result are a finite list: Book, Course, Event, LocalBusiness, Movie, Product, Recipe, Software App, plus additional supported nesting types (CreativeWorkSeason, CreativeWorkSeries, Episode, Game, MediaObject, MusicPlaylist, MusicRecording, and Organization).

The practical consequence: putting aggregateRating on an unsupported type won’t render stars even if the markup validates cleanly. Validation and rich-result eligibility are two different bars.

Google’s spec (stricter than bare schema.orgSchema markup is code that uses the schema.org vocabulary to label what your content means so search engines can understand it and show rich results. It's most often written in JSON-LD, and it's not a direct ranking factor.) for the star rich result. The itemReviewed row depends on which shape you’re using:

PropertyStatusWhat it is
itemReviewedRequired if non-nested; omit if nestedThe item being rated. Nested inside a parent type, this is implied by the nesting and the parent’s own name — set it explicitly only when AggregateRating stands alone
ratingValueRequiredThe average score, e.g. 4.6
ratingCount or reviewCountOne requiredSample size behind the average
bestRatingRecommendedTop of the scale (defaults to 5)
worstRatingRecommendedBottom of the scale (defaults to 1)
Evidence for this claim Google requires ratingValue plus ratingCount or reviewCount for aggregate-rating review snippets, subject to the surrounding item requirements. Scope: Google Search review snippet properties; Schema.org itself permits broader uses. Confidence: high · Verified: Google: Review snippet structured data

Two formatting rules from schema.org’s own usage notes that cause avoidable validation failures: use real digit characters (0–9), not look-alike Unicode symbols, and use a period as the decimal separator, not a comma. "4,6" is a common mistake in locales that use comma decimals.

TIP Catch an impossible rating before you publish it

This check keeps the average, scale, and supporting count together so a valid-looking number does not hide an ineligible aggregate.

Build the rating block and fix its field-level errors with my free Schema Markup Generator Free

  1. Choose the real parent type and enter the average shown on the page.
  2. Add ratingCount or reviewCount using the count users can verify.
  3. Keep ratingValue inside the declared bestRating and worstRating scale, then copy the corrected JSON-LD.
Both errors describe the same evidence problem: the average needs a real sample size and a scale that can contain it.

The generator reports two issues. The AggregateRating needs ratingCount or reviewCount, and ratingValue 6 cannot exceed bestRating 5. The code preview shows the incomplete aggregateRating nested in a Product.

ratingCount vs. reviewCount — a real distinction

Many guides use these interchangeably, or shrink reviewCount down to just “written reviews.” Google’s current property definitions are more specific:

  • ratingCount — the total number of ratings, including star-only submissions with no accompanying review text.
  • reviewCount — the number of people who provided a review, with or without an accompanying rating. It isn’t strictly “written reviews only” — it’s keyed to people who reviewed, whether or not they also left a numeric rating.

In practice, on most rating/review platforms these still land as different numbers, because not everyone who leaves a star rating writes a review and not everyone who writes a review attaches a star. A store might show 4.6 stars from a ratingCount of 1,200, where 340 people (reviewCount) actually left review text. Map the definitions above onto however your own platform separates “rated” from “reviewed” rather than assuming the site’s rating/review split matches this example exactly. Google requires at least one of the two properties; supply the one that matches what your platform actually tracks, and don’t inflate either to a number your page can’t support.

bestRating / worstRating — include them off the default scale

Google assumes a 1–5 scale when these are absent. If you rate on 1–10, out of 100, or any non-default range, you must set bestRating/worstRating or Google may misread the scale — a 9.2 on a 10-point scale, left unqualified, gets interpreted as 9.2 out of 5, which is nonsensical.

The self-serving reviews rule — scoped precisely

This is the single most-mangled point in the topic, so I’ll state it exactly.

Google’s wording: “If the entity that’s being reviewed controls the reviews about itself, their pages that use LocalBusiness or any other type of Organization structured data are ineligible for star review feature.” Read the scope carefully — it names LocalBusiness and Organization (and their subtypes). It’s about a business rating itself as a business. Evidence for this claim Google requires ratings represented in structured data to be visible to users and prohibits misleading or fabricated review markup. Scope: Google Search structured-data and review snippet policies; violations can remove feature eligibility. Confidence: high · Verified: Google: Review snippet structured data

It does not apply to Product. A webshop can legitimately show star ratings on its own product pages — that’s the average of genuine customer ratings of a product it sells, not the business rating itself. Recipe, Movie, Book, SoftwareApplication, and the rest of the supported list stay eligible too, subject to the ratings being genuine.

This rule dates to a September 2019 Google policy change (“Making Review Rich Results more helpful”), which introduced the “self-serving” framing — including reviews of your own business embedded directly or pulled in via a third-party widget. (I’m paraphrasing the reasoning of that announcement rather than quoting it; the current, citable statement of the rule is the Review snippet documentation quoted above.) The upshot: a third-party review widget on your own LocalBusiness/ Organization page is still self-serving and still ineligible for stars.

Organization is exactly why the Organization schemaOrganization schema (schema.org/Organization) is structured data that describes the business or entity itself — name, logo, official URL, social profiles, contact info, and identifiers — rather than a page's content. Google says it can help disambiguate your brand and some properties can influence visual elements like Knowledge Panel/attribution; it has no required properties and doesn't guarantee a Knowledge Panel. sibling is relevant here — it’s one of the two host types where self-hosted ratings won’t earn stars.

Genuine ratings only — the spam and manual-action policy

Two flat rules from Google’s guidance:

  • Don’t aggregate from other sites. Google: “Don’t aggregate reviews or ratings from other websites.” Scraping ratings from elsewhere into your own markup is out.
  • Ratings must be from real users. Google’s structured-data policies frame genuine ratings as enforced, not aspirational — its recipe-specific example notes that “reviews or ratings not by actual users may result in manual action.” That principle generalizes to the reviews policy across types.

A structured-data manual action for misleading or fake ratings removes rich-result eligibility for the page. This is enforced, not theoretical. Also make the review content genuinely present on the page — Google expects the marked-up ratings to be readily available to users on the same page, about a specific item, not a category or a list.

Where AggregateRating sits in the wider picture

Like all structured data, AggregateRating affects rich-result eligibility, not ranking — the broader Schema MarkupSchema markup is code that uses the schema.org vocabulary to label what your content means so search engines can understand it and show rich results. It's most often written in JSON-LD, and it's not a direct ranking factor. and Structured Data hubs make that case in full, so I won’t re-litigate it here. aggregateRating is a recommended property on Product (the most common real-world host) and on ProductGroup for variant-level rating rollups — both natural next reads. Use JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal.; it’s Google’s recommended format and the one every example in this article uses.

Bing and other engines: schema.org is a joint Google/Microsoft/Yahoo/Yandex vocabulary, and Bing’s general structured-data documentation confirms it reads schema.org/JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. markup. What isn’t currently verifiable against first-party Microsoft documentation is a type-specific claim of parity with Google’s AggregateRating requirements — Bing publishes no comparable per-type required/recommended breakdown and no self-serving-reviews policy documentation the way Google does, and its rich-result surface for ratings is narrower and less documented. Don’t assume Bing’s eligibility rules mirror Google’s point-for-point; treat this as an open question rather than a confirmed one until Bing publishes its own AggregateRating-specific guidance.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.