You've seen them — those gold stars sitting right under a search result, before anyone even clicks. They make one listing pop while every other result looks flat. If you've been wondering why your competitors have review schema markup showing and you don't, this post is for you.
The frustrating part is that the stars aren't automatic. Google won't pull your Trustpilot rating and just display it. You have to tell Google, in a specific machine-readable format, that a page contains review data. That format is called structured data, and when you get it right, Google can show rich results — including those star ratings — directly in the search snippet. Let's walk through exactly how to do it.
What Review Schema Markup Actually Is
Schema markup is a vocabulary of tags — defined at schema.org — that you embed in your page's HTML. It doesn't change what visitors see. It changes what search engines understand. The two schema types that produce star ratings in Google search results are Review (a single review) and AggregateRating (an average across many reviews). You'll almost always want AggregateRating — it's what shows a score like 4.8 out of 5 based on 143 reviews.
The format Google prefers is JSON-LD: a small block of JSON you drop into a <script> tag in the page's <head> or <body>. It's separate from your visible HTML, which makes it easier to add without breaking your design. Microdata and RDFa are older alternatives — they work, but JSON-LD is cleaner and Google explicitly recommends it.
Which Pages Can Actually Show Stars
Before you write a single line of markup, you need to know Google's eligibility rules. Stars don't appear for every page type — only specific ones. As of the current Google documentation, rich review results are eligible for:
- Products (e.g. a specific item you sell)
- Books
- Recipes
- Movies, TV episodes, and courses
- Local businesses
- Software applications
What's not eligible: your homepage, a generic services page, or a blog post. Google explicitly won't show aggregate stars for pages that represent a business as a whole rather than a specific, reviewable thing. This trips up a lot of SaaS companies — you can't just slap AggregateRating on your homepage and expect stars. You need a specific product or app page.
For SaaS, your best bet is a dedicated product page or a page for a specific plan or feature. Mark it up as a SoftwareApplication type and nest the AggregateRating inside it.
Step-by-Step: Writing the Review Schema Markup
Step 1 — Choose your entity type
Decide what the page is about. A physical product? Use Product. A SaaS tool? Use SoftwareApplication. A local service? Use LocalBusiness. The entity type is the outer wrapper — the AggregateRating or Review goes inside it.
Step 2 — Gather the numbers you'll need
For AggregateRating you need three things: your average score (ratingValue), the total number of ratings (ratingCount or reviewCount), and the scale (bestRating and worstRating). These must reflect real reviews that are visible on the page. Google's policy is clear: the markup must match what a user can actually read. If you embed testimonials on the page with aboast, those are the reviews your markup should reflect.
Step 3 — Write the JSON-LD block
Here's a minimal, correct example for a SaaS product page. Drop this inside a script tag with type="application/ld+json":
{ "@context": "https://schema.org", "@type": "SoftwareApplication", "name": "Aboast", "applicationCategory": "BusinessApplication", "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.8", "ratingCount": "143", "bestRating": "5", "worstRating": "1" } }
Keep the values as strings, not numbers — Google's parser handles both, but strings are safer across validators. And always include bestRating and worstRating. If you omit them, Google assumes a 1–5 scale, which is usually fine — but being explicit avoids any ambiguity.
Step 4 — Add individual Review items (optional but powerful)
You can nest individual Review objects inside your entity alongside the AggregateRating. Each Review needs: author (with a name), reviewRating (with ratingValue), and reviewBody (the actual text). Adding individual reviews gives Google richer signals and can improve your chances of rich result eligibility. It also means the structured data mirrors what's actually on the page — which is exactly what Google wants to see.
The Rules Google Will Penalise You For Breaking
Google's structured data policies aren't suggestions. Violate them and you lose the rich results — sometimes permanently for that page. The most common mistakes:
- Marking up reviews that aren't visible on the page. If a user can't read the review text, you can't mark it up. Hidden divs don't count.
- Self-serving reviews. Reviews written by the business about itself, or by employees, violate the policy.
- Inflated ratings. Your markup must reflect your actual average. Don't round 4.3 up to 4.9.
- Putting AggregateRating on a homepage or category page. These aren't eligible entity types. Google will ignore the markup or, worse, flag the page.
- Stale numbers. If your review count in the markup is 143 but you only have 12 reviews on the page, that's a mismatch Google will catch.
The underlying principle is simple: the markup should describe what's actually on the page, accurately, for real users. Build your testimonial display first, then write the markup to match it.
Testing and Validating Your Markup
Once you've added the JSON-LD block, validate it before you ship. Use Google's Rich Results Test (search.google.com/test/rich-results) — paste your URL or the raw code. It'll tell you whether the markup is valid, what rich results you're eligible for, and flag any missing required fields.
Also check Schema.org's validator at validator.schema.org. It's stricter and catches things the Google tool sometimes misses — like using a property that doesn't exist on the type you declared.
After the page is live, go to Google Search Console → Enhancements → Review snippets. It takes a few days for Google to crawl and process the markup. If you see errors there, fix them — they're specific and actionable. If you see the page listed as "Valid", you're in the queue for rich results.
One thing worth knowing: valid markup doesn't guarantee stars will appear. Google decides whether to show rich results based on its own quality signals. But without valid markup, you have zero chance. Valid markup gives you a real one.
Keeping Your Markup in Sync With Real Reviews
This is the part most teams get wrong after the initial setup. They write the markup once, ship it, and never touch it again. Six months later the page shows 12 reviews but the markup still says 143. Or the average drops from 4.8 to 4.6 and the markup doesn't reflect it.
From what we've seen at aboast, teams that dynamically generate their review schema from the same data source that powers their testimonial widget — rather than hardcoding it — have far fewer compliance issues and don't have to remember to update markup manually. When a new testimonial comes in and gets approved, the count and average update automatically in both the visible widget and the JSON-LD block.
If you're on a static site or CMS without dynamic schema generation, set a recurring reminder — monthly is fine — to check that your ratingValue and ratingCount still match what's on the page. It's a five-minute audit that protects your rich results.
For more on building a testimonial display that actually earns you reviews worth marking up, see our posts on collecting customer testimonials and embedding testimonials on product pages. And if you want to understand how review volume affects conversion beyond SEO, this one's worth a read too.
Review schema markup is one of those rare SEO tasks where the effort is low and the upside is visible — literally visible, in the search results. Get the reviews on the page first, write markup that matches them exactly, validate it, and keep it in sync. If you want a faster path to having real testimonials on the right pages in the right format, aboast handles the collection, display, and structured data output so you can focus on the product instead of the plumbing.
Try aboast
Collect testimonials in five minutes.
Free forever plan, no credit card required. Get a branded collection link and start shipping social proof today.
Start free