You have 47 five-star reviews on your product page. They are visible, they look great, and customers read them. Google does not know they exist. The star ratings that show up in search results, those rich snippets with the gold stars and review count, come from structured data markup, not from what is visible on the page. If you have not added Review or AggregateRating schema to your pages, Google is ignoring the social proof you worked hard to collect.
This is one of the most common missed opportunities in local SEO and e-commerce. The reviews are there. The trust signals are on the page. But the structured data layer that would surface them in search results is missing entirely.
What Google requires
For review stars to appear in search results, Google requires specific schema.org markup. For a single review, you need a Review type with author, reviewRating (including ratingValue and bestRating), and either a datePublished or itemReviewed. For aggregate ratings, the summary that shows "4.7 out of 5 based on 47 reviews," you need an AggregateRating type with ratingValue, reviewCount or ratingCount, and bestRating.
These must be nested inside a parent type that Google supports for review snippets. Google shows review stars for Product, LocalBusiness, Book, Course, Event, Recipe, SoftwareApplication, and a handful of other types. They explicitly do not show review stars for standalone pages, blog posts, or category pages. If you add AggregateRating to a generic WebPage, Google ignores it.
The most common implementation error is adding AggregateRating without a parent type. A JSON-LD block with just "@type": "AggregateRating" and no enclosing Product or LocalBusiness entity will not generate rich results. Google needs to know what the rating applies to.
The visible-vs-structured gap
The audit problem is specific: your page shows reviews visually, but the structured data either does not exist, is incomplete, or does not match the visible content. Google's guidelines require that structured data reflect the content on the page. If your JSON-LD says you have a 4.8 rating from 200 reviews, but the page shows 4.6 from 185 reviews, that is a structured data spam signal.
The Social Proof Schema Audit checks for this gap. It scans the page for visible review indicators (star images, rating numbers, review counts, testimonial blocks) and compares them against the JSON-LD or Microdata schema on the page. It flags pages where reviews are visible but no schema exists, pages where schema exists but does not match the visible content, and pages where the schema type is not eligible for review rich results.
Self-reviews are a penalty risk
A pattern that Google has cracked down on repeatedly is businesses marking up their own testimonials as Review schema. If you wrote the testimonials yourself, or solicited them and control which ones appear, Google considers this self-serving review markup. In April 2023, Google's review system update specifically targeted pages with review schema that did not reflect genuine independent reviews.
The safer approach for testimonials is to mark them up as Recommendation or simply leave them as unstructured content. Reserve Review and AggregateRating for verified third-party review platforms (Google Business Profile, Yelp, Trustpilot) where you can point to an independent source.
For local businesses, the strongest social proof schema comes from linking your LocalBusiness entity to your Google Business Profile URL via sameAs, then letting Google pull the review data itself. This avoids the self-review problem entirely and keeps your structured data in sync with what Google already knows about your business.
Getting the markup right
Start with the parent type. If you are a local business, use LocalBusiness or the appropriate subtype (Restaurant, MedicalBusiness, LegalService). If you sell products, use Product. Nest AggregateRating inside the parent with accurate numbers pulled from your actual review source.
For individual reviews, include the full Review object with author (a Person type with name), reviewRating with both ratingValue and bestRating, and datePublished. If you have more than 3 or 4 reviews, use AggregateRating rather than listing every individual review in the JSON-LD. Google does not need all of them to show the snippet.
If you are building a local business site and want to make sure your schema covers all the bases, the Multi-Location Schema Audit handles the broader schema picture for businesses with multiple locations. I discuss the importance of getting these details right early in The $97 Launch, especially for service businesses where trust signals drive conversions.
Related tools
- Schema Validator validates JSON-LD against Google's rich result requirements
- Rich Results Eligibility Audit checks per-type required and recommended fields
- Multi-Location Schema Audit validates LocalBusiness schema across branches
- GBP Review Audit audits Google Business Profile review signals
- Trust Signal Surface Audit evaluates broader trust indicators on your pages
Fact-check notes and sources
- Google's supported types for review rich results: Google Search Central, "Review snippet" structured data documentation, updated 2024. Lists Product, LocalBusiness, Book, Course, Event, Recipe, SoftwareApplication, and others.
- Self-review markup guidelines: Google Search Central, "Review snippet" page, section "Don't mark up content that is not visible to users" and "Don't add fake reviews."
- April 2023 Reviews System Update: Google Search Central Blog, "April 2023 reviews update" announcement. Expanded beyond product reviews to service reviews and other types.
- AggregateRating required properties: schema.org AggregateRating documentation specifies ratingValue, ratingCount/reviewCount. Google requires bestRating when the scale is not 1-5.
- Google pulling reviews from GBP via sameAs: Google Search Central, "Local Business" structured data documentation, sameAs and url property guidance.
This post is informational, not SEO-consulting advice. Google's rich result eligibility requirements change over time.