Product Review Schema: Fixing Review Markup and Display
Customer reviews do two jobs on a product page: they reassure the shopper in front of you, and, when they are marked up properly, they can earn review stars in search.
Shops usually lose both at once because the reviews live inside a widget that loads after the page, the markup rates the shop instead of the product, or three different apps describe the same reviews in three different ways. This guide covers how individual Review markup differs from a summary rating, how to get widget reviews into the page, which reviews you may mark up, and how to check the result.
- Review and AggregateRating are different things
- What a single Review needs
- Reviews that only exist inside a widget
- Store reviews, product reviews and whose opinion it is
- Diagnosing why stars are missing
- Where review markup comes from on each platform
- The fix, step by step
- Keeping review markup healthy
- Questions and answers
Review and AggregateRating are different things
Two schema.org types describe reviews, and product pages usually need both. Mixing them up is behind a large share of the review problems the Ecommerce Audit reports.
Review | AggregateRating | |
|---|---|---|
| What it describes | One person's opinion: their score, their words, their name and the date. | A summary: the average score and how many ratings it comes from. |
| Where it goes | In the review property of the Product, one object per review
shown. | In the aggregateRating property of the Product, once. |
| What it must match | A review a shopper can actually read on that page. | The average and count displayed near the product name. |
| Typical fault | Written for reviews that are only on page 4 of a widget, or with "Verified Buyer" as the author. | Score or count out of step with the visible figures (covered in the aggregateRating guide). |
A shop with 300 reviews of a kettle should not put 300 Review objects in its markup. Mark up the reviews that are visible when the page first loads, usually the first five to ten, and let the AggregateRating carry the total. That keeps the markup honest about what is on the page and keeps the block a sensible size.
Technical errors inside the summary rating, such as a missing count, a score outside the scale or a decimal comma, are covered in Fixing aggregateRating errors. The price, offer and identifier side of the same Product block is in Fixing Product schema errors. This guide deals with the reviews themselves: where they come from, whether they may be marked up, and how they reach the page.
What a single Review needs
Google's review snippet documentation asks for a small set of fields on each Review. Most failures are not missing fields but fields filled with the wrong thing.
author: aPersonorOrganizationwith aname. Use the display name shown beside the review on the page, such as "Priya S." for a fictional customer. Badges like "Verified Buyer", placeholder text like "Customer", and anything promotional are not names.reviewRating: aRatingwithratingValue, plusbestRatingif your scale is not 1 to 5.datePublished: the date the review was written, in ISO 8601 format such as2026-08-14. Recommended rather than required, but review apps nearly always have it and it helps show the reviews are current.reviewBody: the text of the review as shown. Keep any shortening consistent with what the page displays.itemReviewed: only needed when the Review stands on its own rather than sitting inside the Product. Nested inside a Product, the parent is the item reviewed.
A product with its first reviews marked up
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"@id": "https://example.co.uk/products/enamel-camping-kettle#product",
"name": "Enamel camping kettle, 1.2 litre",
"image": "https://example.co.uk/images/enamel-kettle.jpg",
"sku": "FFK-12",
"brand": { "@type": "Brand", "name": "Fernfold" },
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "58"
},
"review": [
{
"@type": "Review",
"author": { "@type": "Person", "name": "Priya S." },
"datePublished": "2026-08-14",
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Boils quickly on a small gas stove and the handle stays cool enough to hold."
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "Tom W." },
"datePublished": "2026-07-30",
"reviewRating": { "@type": "Rating", "ratingValue": "4" },
"reviewBody": "Solid kettle. The enamel chipped slightly on the base after a month of use."
}
]
}
</script>
The offer is left out of this example to keep the review part readable; on a live shop page the same block carries the offer as well.
Pros and cons are not for shop pages
Schema.org has positiveNotes and negativeNotes for listing pros and cons,
and Google can show them in results. Google's documentation limits that appearance to editorial product
review pages, such as a magazine testing kettles, and says merchant product pages and customer reviews
are not eligible. Adding pros and cons markup to your own product pages will not produce the feature,
so it is not worth the effort.
Reviews that only exist inside a widget
Most shops collect reviews through an app: Judge.me, Yotpo, Reviews.io, Trustpilot product reviews, Okendo, Stamped or a platform's own reviews. How that app puts reviews on the page decides whether search engines see them at all.
| How the app loads reviews | What a crawler gets | What to do |
|---|---|---|
| Written into the page HTML on the server (theme block, app embed that renders server-side, or a platform metafield) | Reviews and markup in the first response | Nothing, beyond checking the markup is correct. |
| Injected by JavaScript after load | Possibly seen after rendering, possibly not; slower to be picked up | Look for a server-side or SEO option in the app, or render a snapshot of recent reviews in the template. |
| Inside an iframe from the app's domain | Content belongs to the other domain, not your page | Switch to an embed that writes into your page, or show a server-rendered summary alongside it. |
| Loaded only when the shopper clicks a "Reviews" tab or scrolls far down | Often nothing, because crawlers do not click or scroll | Load the first set with the page and keep the tab purely visual, hidden with CSS rather than fetched on demand. |
To see which case you have, open the product page, press Ctrl+U (Cmd+Option+U on a Mac) and search the raw source for a phrase from one of the visible reviews. If it is missing, the reviews arrive later by script. Then run the URL through the Rich Results Test and open the rendered HTML: if the phrase appears there but not in the source, Google can probably read it after rendering, but other crawlers, including many AI assistants that fetch pages without running scripts, will not.
Store reviews, product reviews and whose opinion it is
Review platforms usually collect two kinds of feedback. Product reviews are about the item: fit, quality, how it performs. Store or service reviews are about the shop: delivery speed, packaging, customer service. Many shops show a store badge, such as "4.8 from 2,000 reviews", near the basket button on every product page.
That store score must not be marked up as the product's rating. It does not describe the kettle, the same number appears on every product, and the reviews behind it are about your business rather than about the item. Google does not show review stars where a business marks up reviews about itself on its own site, and a shop rating copied onto every Product is exactly that situation dressed up as product data. The aggregateRating guide sets out that policy in full; the practical point for a shop is to keep the store badge as a visual element only.
Reviews gathered by a review platform
Collecting product reviews through a third-party platform is normal. What matters is that the reviews are genuine customer opinions of that specific product, that they are shown on the product page, and that the markup describes those displayed reviews. What goes wrong is copying in figures that belong elsewhere: an average from a marketplace listing, a rating from a comparison site, or a manufacturer's global score that includes reviews from other retailers you do not display.
Reviews shared across variants and bundles
If a jumper in six colours has one page, pooling reviews across the colours is reasonable, because the page is about the jumper. If each colour has its own indexable page, showing the same pooled reviews on all six is common and acceptable when the page says so, but be consistent: the markup on each page should describe the reviews that page shows. For a bundle, do not borrow the ratings of the individual items unless the page makes clear which product each review is about.
Diagnosing why stars are missing
Work through these in order. Each rules out a cause before you spend time on the next.
- Are the reviews in the page? Search the raw source and the rendered HTML for a phrase from a visible review. If they are in neither, no markup fix will help until the widget problem is solved.
- Is there review markup at all? In the source, search for
"Review"andaggregateRating. Some apps output review text visibly but no structured data unless an SEO or "rich snippets" option is switched on in their settings. - How many blocks describe the product? Count the
"@type": "Product"matches. Two or three Products, each with a different rating, is a common result of a theme, an SEO plugin and a review app all adding markup. - Is the rating attached to the product? A rating on the
Organization, theWebPageor a free-floating Review with noitemReviewedwill not produce product stars. - Do the numbers match the page? Compare the average and count in the markup with the figures near the product name, and each marked-up review with what a shopper can read.
- Does the Rich Results Test show a Review snippet or Product snippet? Valid items with no errors mean the page is eligible. If stars still do not appear after a recrawl, Google has chosen not to show them for that query, which it does for many eligible pages.
Where review markup comes from on each platform
Shopify
Themes often output a Product block with an aggregateRating read from the review app's metafields, and many review apps add their own block too. Decide which one owns the review markup: usually the app, since it has the individual reviews. Then remove the rating lines from the theme's block, or turn off the app's markup and let the theme print both summary and reviews from the metafields. Do not leave both on.
WooCommerce
WooCommerce stores product reviews as WordPress comments and its built-in structured data includes the rating and recent reviews when reviews are enabled. SEO plugins such as Yoast (with its WooCommerce add-on) or Rank Math can take over the Product markup, and external review plugins may add another layer. Check which plugin outputs each Review and keep one source. The setting that limits reviews to verified owners, under WooCommerce, Settings, Products, helps show reviews come from real buyers.
Headless and custom builds
Nothing is automatic. Fetch reviews from the review provider's API on the server, render the first set into the HTML, and build the Review objects from the same data. Cache sensibly, but refresh often enough that a new review does not leave the markup and the page disagreeing for days.
The fix, step by step
Step 1
Map where your reviews come from
List
every source of review content and review markup on one best-selling product page: the review app, the
theme, any SEO plugin, a store rating badge and any manufacturer or marketplace feed. For each, note
whether it shows reviews, outputs structured data, or both. Search the page source for aggregateRating
and "Review" to find markup you did not know was there. This map decides which source keeps
its markup and which ones you switch off later.
Step 2
Get the reviews into the page HTML
Check whether a phrase from a visible review appears in the raw page source. If it only appears after scripts run, or only after clicking a reviews tab, look in the review app for a server-side, SEO or theme block option, or change the template to print the rating summary and the first few reviews on the server. Shoppers see no difference, but crawlers and AI assistants that do not run JavaScript can now read the reviews.
Step 3
Separate product reviews from store reviews
Make sure only reviews of this specific product feed the product's markup. Remove any
store or service rating that has been placed in aggregateRating, any figure copied from
a marketplace, comparison site or manufacturer, and any fixed rating typed into the theme. Keep the store
badge on the page if it helps conversion, but as a visual element only, with no structured data describing
it as a rating of the product.
Step 4
Mark up the individual reviews shown
Add a review array to the Product with one Review for each review visible when
the page loads, usually five to ten. Give each an author with the display name shown on
the page, a reviewRating with its score, a datePublished and the reviewBody
text. Never use a badge such as "Verified Buyer" as the author name, and do not mark up reviews that
only appear on later widget pages.
Step 5
Connect reviews to the right Product
Nest
the reviews and the summary rating inside the Product they describe, or, if your setup outputs them as
separate nodes, give the Product an @id and point each Review's itemReviewed
at it. Check that nothing attaches ratings to the Organization, the WebPage
or a LocalBusiness node. On variant pages, make sure the reviews and rating describe the
product the page is actually selling.
Step 6
Switch off duplicate review markup
Choose one owner for the review markup, usually the review app because it holds the individual reviews, and turn off rating and review output everywhere else: remove the rating lines from the theme's Product block, disable the SEO plugin's review option or the app's snippet option. The goal is one Product per page carrying one rating and one set of reviews, all agreeing with what the shopper sees on screen.
Step 7
Test the page and watch the report
Run the live URL through the Rich Results Test and confirm the Product or Review snippet item is valid, then open the rendered HTML to confirm the reviews are present. Request indexing for a handful of key products with URL Inspection in Search Console. Over the following weeks, watch the Review snippets and Product snippets reports, and rerun the Ecommerce Audit after any review app or theme update.
Keeping review markup healthy
- One owner. Write down which app or template produces review markup, so a new plugin or theme update that adds a second source is spotted quickly.
- Same data, same moment. Build the visible reviews and the markup from the same source so they can never drift apart.
- Handle zero reviews. Products with no reviews yet should output no review markup at all, rather than an empty rating.
- Collect reviews properly. Ask every buyer, not only happy ones, publish critical reviews as well as positive ones, and label any incentivised reviews clearly.
- Recheck after changes. Review app updates, theme changes and switches between review providers are when review markup most often breaks or doubles up.
For the wider picture of product page quality, see product review trust signals, and the Ecommerce SEO Guide for how reviews fit alongside the rest of the audit.
1. Do I need both Review and AggregateRating markup on a product page?
Either one on its own can make a product page eligible for review stars, but together they describe the page best. The AggregateRating gives the average and the total number of ratings, while the individual Reviews show the actual opinions a shopper can read. Mark up the reviews visible when the page loads rather than every review you hold, and let the summary rating carry the full count. Both must match what is displayed on the page.
2. Can I mark up my Trustpilot or Google store rating on product pages?
No. A store rating describes your business, its delivery and its service, not the product on the page, so using it as the product rating misrepresents the product. Google also does not show stars for businesses marking up reviews about themselves on their own site. Keep the badge visible if shoppers find it reassuring, but leave it out of the structured data. Only genuine reviews of the specific product, shown on that page, belong in the Product markup.
3. My review app shows reviews but Google sees none. Why?
The app is probably loading reviews with JavaScript after the page, inside an iframe, or only when a shopper opens a reviews tab. Google may render some of this, but slowly and not reliably, and many other crawlers never run scripts at all. Check the raw page source for a phrase from a visible review. If it is missing, look for a server-side or theme block option in the app, or print the first reviews in your template.
4. Who should be named as the author of a review?
Use the name the reviewer chose to display beside their review on the page, such as a first name and initial. The author must be a person or organisation, so labels like Verified Buyer, Customer or Anonymous Shopper do not belong in the name field. If your review app shows only a badge and no name for some reviews, consider asking reviewers for a display name when they submit, so the page and the markup both show who wrote each review.
5. Should I add pros and cons markup to my product pages?
It will not help on a shop page. Google supports pros and cons, marked up with positiveNotes and negativeNotes, only on editorial product review pages, such as a publication that tests and compares products it does not sell. Its documentation says merchant product pages and customer reviews are not eligible for that appearance. If you write your own buying guides that review products, the markup can apply there, but not on the product pages themselves.
6. Is it acceptable to hide negative reviews?
Removing genuinely abusive, irrelevant or fraudulent reviews is reasonable, and most review platforms have moderation rules for that. Hiding honest negative reviews to push up your average is a different matter. It misleads shoppers, makes your rating markup a misleading description of customer opinion, and in the UK can fall within the rules on misleading reviews in consumer protection law. This is not legal advice, but publishing honest criticism and replying to it helpfully is the safer and more credible approach.
7. How long after fixing will review stars appear?
There is no fixed time and no guarantee. Once the Rich Results Test shows a valid item, request indexing for your most important products in Search Console, and Google will usually recrawl them within days, with the rest of the catalogue following as it is recrawled. Even then, Google decides query by query whether to show stars, so some eligible pages will not get them. Track the Review snippets and Product snippets reports rather than individual searches.
The Ecommerce Audit checks your most important store pages for valid Product and review schema, alongside product page completeness, category depth, faceted navigation, images, internal links and product page speed.
Open Ecommerce Audit Fixes โ