Product Review Schema: The Complete Setup Guide for Shopify (2026)
Product, Review, and aggregateRating markup is what puts stars in Google. A clean, copy-ready setup for a Shopify store, plus the mistakes that void it.
Which schema types do product review stars need?
Three types, nested. A Product describes the item. Inside it, a Review carries one individual review (author, rating, body), and an aggregateRating carries the summary (average score and review count). Google reads the Product as the parent and the other two as properties hanging off it.
You do not always need every type. A single highlighted review can sit under review. A star rating built from many reviews sits under aggregateRating. Most stores want both: the average for the star snippet, and at least one full review so the markup has a real, attributable voice behind the number.
- Product: the parent type, with at least a name. This is what the stars attach to.
- aggregateRating: ratingValue (the average) and reviewCount or ratingCount.
- Review: author, reviewRating with ratingValue, and the review body.
- reviewRating needs bestRating if your scale is not the default of 5.
How do the three types nest in JSON-LD?
Use a single JSON-LD script with "@type": "Product" at the top. Give it a name, then add an "aggregateRating" object and a "review" property (an array if you list several). The aggregateRating object holds ratingValue and reviewCount. Each review object holds an author, a reviewRating with its own ratingValue, and the text.
The shape is a tree, not a flat list. The Product is the trunk; aggregateRating and review are branches. Keep them inside the Product braces rather than as separate top-level blocks, so Google reads them as belonging to that one item. One product, one Product node, with its ratings and reviews nested underneath.
Do the reviews have to be visible on the page?
Yes. Google requires that the reviews and ratings you mark up are visible to a person on that same page. Marking up a 4.8 average with no reviews shown, or numbers that do not match what the shopper sees, is a structured-data violation that gets the rich result dropped or the page flagged.
This is the rule most Shopify setups quietly break. The theme prints a JSON-LD block with an average rating, but the actual reviews live inside a JavaScript widget that loads after the page. To a shopper it looks fine. To Google the marked-up number has no visible content backing it. The schema and the on-page reviews have to be the same reviews, rendered into the page, not a number floating free of its evidence.
What reviews am I not allowed to mark up?
Self-serving reviews of your own organisation are not eligible for the product star snippet. You cannot mark up reviews of your store, your brand, or your service and have them render as stars on a product. The product star result is for reviews of the product itself, written by customers, not testimonials about how great the company is.
In practice this rules out a few common shortcuts: a "what customers say about us" testimonial block marked up as product reviews, reviews you wrote or solicited about your own organisation, and ratings aggregated across the whole shop rather than tied to the specific item on the page. Tie each rating to the product a buyer is looking at, sourced from buyers.
- Allowed: customer reviews of the specific product on the page.
- Not allowed: reviews of your organisation or brand presented as product stars.
- Not allowed: a site-wide average reused on every product page.
- Risky: reviews you cannot show are genuine and visible on the page.
Where does the schema go on a Shopify store?
On Shopify the product template renders the JSON-LD. Many themes ship a basic Product block already; review apps often inject their own aggregateRating into it, or print a competing block. The goal is one clean Product node per product page, with the ratings nested inside, matching the reviews shown on screen.
The friction is that the average comes from the review app while the Product schema comes from the theme, and the two do not always agree. If the app renders reviews client-side, the visible reviews and the marked-up rating can drift apart, or the reviews can be missing from the HTML entirely. The clean setup keeps the numbers and the visible reviews in the same source so they cannot diverge.
What are the common validation errors?
Run any product page through Google's Rich Results Test and the Schema Markup Validator before trusting it. The errors cluster into a short list, and most are about a value being absent or about the markup describing something the page does not show.
Fix the errors (red) first; they block the rich result. Warnings (yellow) are recommended fields that strengthen eligibility but will not stop the stars on their own. Re-test after every theme or app change, because an app update can silently rewrite the block.
- Missing field "aggregateRating" or "review": Google has no rating to render stars from.
- Missing "name" on the Product: the stars have nothing to attach to.
- ratingValue with no reviews visible on the page: the visible-content rule, broken.
- Reviews not in the HTML: the widget loaded them after the crawl, so the markup points at nothing.
What does a clean setup actually require?
Three things have to line up: correct nesting, a value in every required field, and visible reviews that match the markup. Get the Product, Review, and aggregateRating nested properly, populate the required fields, and make sure the reviews you mark up are present and visible in the page itself.
The hard part on Shopify is rarely the JSON-LD shape; it is that the reviews live in a widget and never make it into the HTML the markup claims to describe. Most review apps were built for the on-page shopper and stop there. Getting your existing reviews rendered into the page, so the schema has real visible content behind it, is the gap BetterReviews is built to close.
- Do I need both Review and aggregateRating?
- For the star snippet you need aggregateRating, because the stars are drawn from the average and the count. Adding at least one Review is recommended, so the markup has a real attributable voice behind the number rather than a bare score. Both nest inside the same Product.
- Why are my stars not showing even though the schema validates?
- Usually because the reviews are not visible on the page. Validation checks the JSON-LD shape, not whether the reviews are rendered for a shopper. If your reviews load from a JavaScript widget after the page, the markup passes but the visible-content rule fails, and Google withholds the rich result.
- Can I mark up testimonials about my store as product reviews?
- No. Self-serving reviews of your own organisation are not eligible for the product star snippet. The product star result is for customer reviews of the specific product on the page, not testimonials about the company. Marking up brand testimonials as product reviews voids the result.
- Does Shopify add product review schema automatically?
- Partly. Most themes print a basic Product block, and review apps often inject an aggregateRating into it. The gap is that the visible reviews frequently live in a client-side widget, so the marked-up rating can have no visible content behind it. You have to confirm the reviews are in the page HTML.