What AggregateRating is
Per Schema.org v30.0, AggregateRating is 'the average rating based on multiple ratings or reviews.' Type hierarchy: Thing > Intangible > Rating > AggregateRating. The required-by-Google fields are ratingValue, ratingCount or reviewCount (at least one), itemReviewed (handled implicitly when AggregateRating is a sub-object on Product). Recommended: bestRating and worstRating to disambiguate the rating scale.
The self-serving review rule on Shopify
Google's review snippet documentation words the self-serving rule precisely: if the entity being reviewed controls the reviews about itself, its pages that use LocalBusiness or any other Organization structured data are ineligible for the star review feature. The rule is about businesses rating themselves. A Product's AggregateRating, built from ratings your customers gave the product and shown on the product page, falls outside it. The rules that do apply to product ratings: they must be sourced directly from users, visible on the page, not aggregated from other websites, and not fake or undisclosed incentivized reviews.
Shopify review apps that emit AggregateRating cleanly
The 2026 Shopify review-app market splits into two groups. (1) Review apps such as Yotpo, Stamped.io, Judge.me, Reviews.io, Okendo and Loox, some of which print their own AggregateRating from an app block. (2) Custom in-house systems built on Shopify metafields or metaobjects, which require the merchant to author AggregateRating JSON-LD by hand. Shopify's own Product Reviews app is no longer available on the App Store. Either way, Shopify defines two standard metafields for the summary: reviews.rating (type rating, the average) and reviews.rating_count (an integer, the number of ratings), and asks rating apps to keep them updated.
AggregateRating fields
The properties that matter: ratingValue (Number/Text — the average, e.g. 4.8), ratingCount (Integer — total ratings received), reviewCount (Integer — total reviews received; can equal ratingCount), bestRating (Number/Text — the highest possible, e.g. 5), worstRating (Number/Text — the lowest possible, e.g. 1).
JSON-LD example — AggregateRating from a third-party review app
The block below shows AggregateRating inside a Shopify Product block, built from Shopify's standard product-rating metafields. reviews.rating is a rating-type metafield, so its .value is a rating object with rating, scale_min and scale_max properties; reviews.rating_count is a whole number. The scale comes from the metafield, so bestRating and worstRating always match the app's scale.
Validation
Rich Results Test against a PDP with AggregateRating should report Product detected with the AggregateRating parsed and no errors, under Product snippets or Merchant listings. Errors come from missing required properties: ratingValue, or both ratingCount and reviewCount. A clean test means the markup is eligible; Google still decides whether stars appear.
Shopify gotchas on AggregateRating
Four gotchas. First: emitting AggregateRating with ratingValue '0' and ratingCount '0' on products that haven't been reviewed (branch on the metafields, see above). Second: reading a metafield that doesn't exist. There is no reviews.rating_value; the standard keys are reviews.rating (a rating object, so you need .value.rating) and reviews.rating_count. Third: emitting AggregateRating both from your manual block AND from a review-app's auto-emitted block, producing duplicate AggregateRating on one Product. Fourth: hard-coding bestRating as 10 when the app uses a 1–5 scale, causing 4.8 to render as '4.8 out of 10'. Reading scale_max from the metafield avoids it.