How to Fix Critical Review Snippet Errors in Schema.org Structured Data
2/19/2026

If you've added review snippets to your website's structured data only to see "critical issues" in Google's Rich Results Test, you're not alone. Review schema errors are among the most common structured data mistakes, and they can prevent your star ratings from appearing in search results.
In this article, I'll walk you through the exact errors we encountered and how to fix them, using a real-world example from a web performance services website.
The Problem: Critical Review Snippet Errors
When testing our structured data in Google's Rich Results Test, we encountered three critical errors, all pointing to the same root cause:
error Website Performance & Development Services 1 critical issue
The error repeated three times because we had issues with both the Service schema and individual Review objects. I've published another article on how to fix "invalid type for field" schema error separately. Let's break down what was wrong and how to fix it.
Common Review Schema Mistakes
Mistake #1: Trailing Commas in JSON
One of the most frequent JSON-LD errors is the trailing comma. While JavaScript allows trailing commas, strict JSON does not.
Incorrect:
{
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5", // ❌ Trailing comma
}
}
Correct:
{
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5" // ✅ No trailing comma
}
}
Mistake #2: Wrong Placement of aggregateRating and review
This was our main issue. We had placed aggregateRating and review inside the hasOfferCatalog object, when they should be direct properties of the Service.
Incorrect Structure:
{
"@type": "Service",
"name": "Website Performance & Development Services",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"itemListElement": [...],
"aggregateRating": {...}, // ❌ Wrong location
"review": [...] // ❌ Wrong location
}
}
Correct Structure:
{
"@type": "Service",
"name": "Website Performance & Development Services",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"itemListElement": [...]
},
"aggregateRating": {...}, // ✅ Service level
"review": [...] // ✅ Service level
}
The key insight: aggregateRating and review should be siblings of hasOfferCatalog, not nested inside it.
Mistake #3: Missing itemReviewed Property
Even with correct placement, reviews need to specify what's being reviewed using the itemReviewed property.
Incomplete Review:
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "Simon Wang"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"reviewBody": "Quick solutions, top-notch skills, and outstanding communication."
// ❌ Missing itemReviewed
}
Complete Review:
{
"@type": "Review",
"itemReviewed": {
"@id": "https://www.sanganiweb.com/#services" // ✅ References the Service
},
"author": {
"@type": "Person",
"name": "Simon Wang"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"reviewBody": "Quick solutions, top-notch skills, and outstanding communication."
}
The Complete Fixed Solution
Here's the final, working structured data that passes validation:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://www.sanganiweb.com/#organization",
"name": "SanganiWeb",
"url": "https://www.sanganiweb.com",
"logo": {
"@type": "ImageObject",
"url": "https://www.sanganiweb.com/images/logo.png"
},
"sameAs": [
"https://www.linkedin.com/company/sanganiweb/",
"https://www.facebook.com/sanganiweb",
"https://x.com/ASamadSangani"
],
"founder": {
"@type": "Person",
"name": "Abdul Samad"
}
},
{
"@type": "WebSite",
"@id": "https://www.sanganiweb.com/#website",
"url": "https://www.sanganiweb.com",
"name": "SanganiWeb",
"publisher": {
"@id": "https://www.sanganiweb.com/#organization"
},
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.sanganiweb.com/blog?search={search_term_string}",
"query-input": "required name=search_term_string"
}
},
{
"@type": "WebPage",
"@id": "https://www.sanganiweb.com/#homepage",
"url": "https://www.sanganiweb.com",
"name": "SanganiWeb – Web Performance & SEO Optimization",
"isPartOf": {
"@id": "https://www.sanganiweb.com/#website"
},
"about": {
"@id": "https://www.sanganiweb.com/#organization"
},
"primaryImageOfPage": {
"@type": "ImageObject",
"url": "https://www.sanganiweb.com/images/og-image.jpg"
},
"inLanguage": "en-US"
},
{
"@type": "Service",
"@id": "https://www.sanganiweb.com/#services",
"name": "Website Performance & Development Services",
"provider": {
"@id": "https://www.sanganiweb.com/#organization"
},
"areaServed": {
"@type": "Place",
"name": "Worldwide"
},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "SanganiWeb Services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Emergency Website Fix"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Core Web Vitals Optimization"
}
}
]
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "5",
"reviewCount": "36"
},
"review": [
{
"@type": "Review",
"itemReviewed": {
"@id": "https://www.sanganiweb.com/#services"
},
"author": {
"@type": "Person",
"name": "Simon Wang"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"reviewBody": "Quick solutions, top-notch skills, and outstanding communication."
},
{
"@type": "Review",
"itemReviewed": {
"@id": "https://www.sanganiweb.com/#services"
},
"author": {
"@type": "Person",
"name": "Armo Faiver"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"reviewBody": "Hidden-gem seller on Fiverr. Long-term collaboration guaranteed."
}
]
}
]
}
Implementation in React/Next.js
If you're using React or Next.js, here's how to implement this correctly:
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@graph": [
// ... your schema objects here
]
}),
}}
/>
Quick Checklist for Review Schema
Before deploying your review structured data, verify:
- [ ] No trailing commas in JSON objects
- [ ] aggregateRating is at the Service/Product level, not nested in catalogs
- [ ] review array is at the Service/Product level, not nested in catalogs
- [ ] Each Review has an itemReviewed property
- [ ] Each Review has an author with name
- [ ] Each Review has a reviewRating with ratingValue and bestRating
- [ ] Rating values are strings (e.g., "5" not 5)
- [ ] reviewCount matches the actual number of reviews
- [ ] All required @type properties are present
- [ ] All URLs use HTTPS and match your actual site
Testing Your Structured Data
Always test your structured data using these tools:
- Google Rich Results Test: https://search.google.com/test/rich-results
- Schema.org Validator: https://validator.schema.org/
- Google Search Console: Monitor for structured data errors after deployment
Why This Matters for SEO
Properly implemented review snippets can:
- Display star ratings in search results
- Increase click-through rates by 15-30%
- Build trust with potential customers
- Stand out in competitive search results
- Provide social proof directly in SERPs
Common Pitfalls to Avoid
- Fake Reviews: Only include genuine customer reviews. Google can penalize sites with fabricated reviews.
- Self-Reviews: Reviews should be from customers, not the business owner.
- Inconsistent Data: Ensure review counts and ratings match what's displayed on your page.
- Wrong Schema Type: Use the appropriate type (Product, Service, LocalBusiness, etc.) for what you're offering.
Conclusion
Review snippet errors can be frustrating, but they're usually caused by simple structural issues in your JSON-LD. The three main fixes are:
- Remove trailing commas
- Place aggregateRating and review at the correct schema level
- Include itemReviewed in each review object
By following the structure shown in this article, your review snippets should validate correctly and you'll be one step closer to seeing those coveted star ratings in Google search results.
Need help with website performance or SEO optimization? Contact us for expert web development services.
Found this helpful? Share your experience with structured data implementation in the comments below!