Review Schema Markup: How to Add Individual Reviews and Get Star Ratings in Google
Last Updated: February 25, 2026 · 11 min read
Star ratings in Google Search results are one of the highest-impact SEO wins available to any website. A listing with stars instantly stands out against plain blue links — and the click-through rate improvement can be dramatic. According to multiple industry studies, rich results with star ratings receive 15–35% more clicks than equivalent listings without them.
Those stars come from two schema types working together: Review (individual reviews) and AggregateRating (the average summary). Understanding the difference between them — and exactly which one to use — is the first step to earning visible stars in Google Search. This guide covers every aspect: implementation, eligible page types, common mistakes, and real-world examples for e-commerce, recipes, local businesses, and software apps.
1. Review vs AggregateRating — What's the Difference?
Review
A single specific review written by one person. Contains the reviewer's name, rating, and review body text.
author fieldAggregateRating
A summary of all reviews — the average rating and total count. This is what actually produces stars in Google SERP snippets.
ratingValue + reviewCount or ratingCountbestRating and worstRating are strongly recommendedYou can use both together for maximum impact: display your AggregateRating (to get the stars) along with an array of individual Review objects (to give Google the underlying review content). You can also use either one alone — but only AggregateRating is guaranteed to produce stars in the snippet.
2. Step-by-Step Implementation Guide
Collect real reviews from real users
Schema markup only amplifies what already exists. If you have fewer than 5 genuine reviews, collect them first. Never fabricate reviews — Google manual actions for review spam can penalise your entire domain.
Determine your parent entity type
AggregateRating must be a property of a supported type such as Product, Recipe, LocalBusiness, SoftwareApplication, Book, Course, or Event. It cannot float standalone without a parent entity.
Build the JSON-LD script block
Create a <script type="application/ld+json"> block in the <head> or <body> of your page. JSON-LD is Google's preferred format and does not require modifying your visible HTML.
Set ratingValue, bestRating, worstRating accurately
Use the actual numeric average (e.g. "4.7"), not a fraction ("4.7/5"). Explicitly set bestRating: "5" and worstRating: "1" — without these, Google must guess.
Display the reviews visibly on the page
Google checks that the markup matches what users can see. Pages that only have the schema but hide reviews behind a login or never render them server-side often see stars suppressed.
Validate with Google's Rich Results Test
Use the validator below or visit search.google.com/test/rich-results to check for errors. Common issues include missing required fields, incorrect type references, and mismatched counts.
3. Example 1: Product Page (E-commerce)
The most common use case. Add AggregateRating as a nested property of your Product schema, and include an array of individual Review objects for full coverage.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Ergonomic Office Chair Pro",
"image": "https://example.com/chair.jpg",
"description": "Adjustable lumbar support, breathable mesh back,
5-year warranty.",
"brand": { "@type": "Brand", "name": "ComfortDesk" },
"sku": "CDC-CHAIR-001",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"bestRating": "5",
"worstRating": "1",
"reviewCount": "284",
"ratingCount": "412"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"name": "Best chair I have ever owned",
"reviewBody": "After 6 months of daily use in my home office,
this chair has completely eliminated my back pain.
Assembly was straightforward and the lumbar support
is excellent.",
"author": { "@type": "Person", "name": "Sarah M." },
"datePublished": "2026-01-15"
},
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4",
"bestRating": "5"
},
"name": "Great chair, minor armrest issue",
"reviewBody": "Very comfortable and good build quality.
The armrests could be a bit firmer but overall
I would recommend this to anyone working from home.",
"author": { "@type": "Person", "name": "James T." },
"datePublished": "2026-02-01"
}
]
}4. Example 2: Recipe Page
Recipe pages are among the highest-visibility rich result types in Google. Combining AggregateRating inside your Recipe schema can show stars alongside cook time and calorie count in a single rich snippet.
{
"@context": "https://schema.org",
"@type": "Recipe",
"name": "Classic Basil Pesto Pasta",
"image": "https://example.com/pesto-pasta.jpg",
"author": { "@type": "Person", "name": "Emma Rossi" },
"datePublished": "2026-01-10",
"description": "A quick 20-minute pesto pasta using fresh basil,
pine nuts, and Parmesan.",
"prepTime": "PT10M",
"cookTime": "PT10M",
"totalTime": "PT20M",
"recipeYield": "4 servings",
"recipeCategory": "Pasta",
"recipeCuisine": "Italian",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"bestRating": "5",
"worstRating": "1",
"reviewCount": "1042"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"name": "Made this every week for a month",
"reviewBody": "So simple and so delicious. I add a squeeze of
lemon and it's perfect every time.",
"author": { "@type": "Person", "name": "Lucia B." },
"datePublished": "2026-02-05"
}
]
}5. Example 3: Local Business
For local businesses, AggregateRating nested inside LocalBusiness (or a subtype like Restaurant, DentalClinic, HairSalon, etc.) can unlock stars in organic results. Note: stars from third-party platforms like Google Maps are separate and are not controlled by this markup.
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "The Golden Fork",
"image": "https://example.com/golden-fork.jpg",
"url": "https://thegoldenfork.example.com",
"telephone": "+1-555-0100",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "45 Maple Street",
"addressLocality": "Portland",
"addressRegion": "OR",
"postalCode": "97201",
"addressCountry": "US"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"bestRating": "5",
"worstRating": "1",
"reviewCount": "318"
}
}6. Example 4: Software Application
SaaS products, mobile apps, WordPress plugins, and browser extensions can all use SoftwareApplication schema with AggregateRating. This is especially useful for landing pages that showcase user reviews next to a download or signup CTA.
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "TaskFlow Pro",
"operatingSystem": "All",
"applicationCategory": "BusinessApplication",
"offers": {
"@type": "Offer",
"price": "9.99",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"bestRating": "5",
"worstRating": "1",
"reviewCount": "2104"
}
}7. reviewCount vs ratingCount Explained
This trips up many implementations. Use the wrong one and your counts will be inaccurate, which can trigger a Google quality warning:
| Property | What it counts | When to use |
|---|---|---|
| reviewCount | Ratings that include written review text | When users write reviews (not just click stars) |
| ratingCount | Total ratings including star-only (no text) | When users can rate without writing a review |
| Both together | ratingCount ≥ reviewCount always | Best practice — provide both when you track both |
⚠️ Important: At minimum, include either reviewCount or ratingCount. If you only have one number, use reviewCount as the default. Google requires one of these two properties for AggregateRating to be considered valid.
8. Which Page Types Get Star Ratings?
Google only shows stars for certain content types. Adding Review schema to ineligible pages wastes effort and can trigger a spam flag.
✅ Eligible for star ratings
- • Product pages (e-commerce, physical or digital)
- • Recipe pages
- • Software / app pages
- • Book pages
- • Course pages
- • Event pages
- • LocalBusiness pages
- • Movie / TV show pages
- • Editorial review articles (critic reviewing a thing)
❌ Not eligible — Google will not show stars
- • Self-review (reviewing yourself/your own services)
- • Generic content / blog posts
- • Homepages with sitewide aggregate ratings
- • Employment and jobs content
- • Government / political content
- • Businesses reviewing their own business
- • Review aggregators with no original text
- • Category / listing pages
9. Top 7 Review Schema Mistakes
🚩 Self-serving reviews: the website reviews its own products/services
✅ Google explicitly disallows structured data for "a business reviewing its own business products or services." The Review author must be an independent third party.
🚩 ratingValue formatted as "4.5/5" instead of "4.5"
✅ Use only the number: "4.5". The scale is communicated separately via bestRating ("5") and worstRating ("1").
🚩 No reviewer name in the author field
✅ Every Review must have an author with a name property. "Anonymous" is acceptable as a last resort but reduces data quality.
🚩 reviewCount inflated beyond actual reviews on page
✅ The count must reflect real reviews that actually exist. Do not use your total review count from a third-party platform that users cannot see on this page.
🚩 AggregateRating with no visible reviews on the page
✅ Google checks that reviews are accessible to users. Show at least 3–5 reviews in the page HTML. Reviews hidden behind pagination or locked behind login are often unindexed.
🚩 Missing bestRating/worstRating properties
✅ Without these, Google has to assume you're using a 1–5 scale. Explicit is always better — include bestRating: "5" and worstRating: "1" in every AggregateRating.
🚩 Using Review schema on a page type that is not eligible
✅ Adding AggregateRating to a generic informational article or a homepage will not produce stars and may trigger a spam classification. Match schema to eligible content types only.
10. Best Practices & Expert Tips
💡 Always include datePublished on each Review
Dates increase trust signals and allow Google to surface recent reviews. Stale data looks suspicious.
💡 Use the specific sub-type, not just LocalBusiness
Use Restaurant, DentalClinic, AutoRepair etc. instead of generic LocalBusiness — more precise types unlock more rich features.
💡 Keep reviewCount in sync with your database
Serve the count dynamically from your database. Hard-coding it means it drifts out of sync and can trigger a manual review.
💡 Do not include schema for reviews on third-party platforms
Only mark up reviews that actually live on your own page. Claiming Google or Yelp review counts as your own violates guidelines.
💡 Combine with other schema types for maximum rich results
A Product schema can include Price, Availability, AggregateRating, and Reviews together — giving you stars, price, and in-stock status in one snippet.
💡 Monitor in Google Search Console
After deploying, check the Enhancements section of Search Console for any Review structured data errors. Impressions may take 2–4 weeks to reflect.
11. Frequently Asked Questions
Can I add Review schema to my homepage?▼
No. Google does not show star ratings on homepages, category pages, or general service pages. Review schema must be attached to a specific product, recipe, event, business, or similar entity page.
Do I need to show the reviews on the page itself?▼
Yes. Google's guidance states that structured data should reflect content that is visible to users. Pages where the reviews are hidden, behind a login, or only rendered client-side after load are frequently ineligible for stars.
Can I use Google or Trustpilot reviews in my Review schema?▼
No. You can only mark up reviews that your own site hosts. Claiming counts from third-party platforms in your schema is a violation of Google's structured data policies and can result in a manual action.
How many reviews do I need before stars appear?▼
Google does not publish a minimum. In practice, pages with fewer than 3–5 reviews rarely see stars displayed. A higher reviewCount accompanied by visible reviews on the page improves display likelihood.
My schema validates but stars still don't show. Why?▼
Passing validation is necessary but not sufficient. Google also evaluates: whether reviews are visible on the page, whether the page type is eligible, whether the site has enough authority/trust, and whether the data matches the visible page content.
Can I use a 1–10 rating scale instead of 1–5?▼
Yes. Set bestRating: "10" and worstRating: "1" and provide ratingValue as a number on that scale (e.g. "8.5"). Google will interpret and display correctly as long as the scale is explicit.
What is the difference between Review and Opinion?▼
On Schema.org, Opinion is a subtype of CreativeWork and is not used for structured data rich results. Use Review for all review-type content that you want Google to process for star ratings.
Should I use Review schema on a comparison article?▼
Only if the article is explicitly presenting a critic's review of a specific item. A general comparison article ("Product A vs Product B") does not qualify without a clear, attributable editorial review with a rating.
Does marking up reviews from imports (CSV) count?▼
Yes, as long as those reviews were written by real users and are displayed on your page. The source doesn't matter — authenticity and visibility do.
How do I handle negative reviews in schema?▼
Include them. Do not cherry-pick only positive reviews for your schema while showing mixed reviews on the page — the aggregate rating must reflect the true average of all reviews, including negative ones.
Validate Your Review Schema
Check your Review and AggregateRating JSON-LD for eligibility errors before deploying.
Validate Review Schema →