E-commerce

Verified reviews: collecting them and declaring them in schema

A review is verified when the system can prove the writer bought that product. Here is how to tie it to the order and declare it in JSON-LD.

Key points

  • Verified means tied to a real order, not merely to a confirmed email.
  • aggregateRating and review must describe what the page shows.
  • The declared review count must match the reviews actually published.
  • An incentive conditioned on a positive score makes the review unfair.

A review is verified when the system can prove its author bought that product, and the page says so with markup that matches what it displays.

What makes a review verified

  • The link to the order lives in the database, not in the text: the review carries a reference to the order or order line that produced it.
  • The displayed name belongs to the buyer, shortened to a first name and initial, with the publication date visible beside it.
  • Moderation follows a written, public rule: insults and personal data are removed, low scores are not.

A confirmed email is not enough: anyone can confirm an address. The signal that counts is the shipped order, and the page has to say so in plain words, for example "Verified purchase" next to the date.

The schema, without inventing

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Zaino 24 litri",
  "offers": { "@type": "Offer", "price": "89.00", "priceCurrency": "EUR", "availability": "https://schema.org/InStock" },
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.6", "reviewCount": "37" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Marta B." },
      "datePublished": "2026-10-12",
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "Tiene la forma anche vuoto."
    }
  ]
}

The block declares only what the page shows: name, price, availability, average score, review count and one full review. If the page publishes 37 reviews, reviewCount is 37; if it publishes 12 while the database holds 200, you declare 12.

FieldWhere it sitsRule
ratingValueinside aggregateRatingThe average of the reviews published, not of every review received
reviewCountinside aggregateRatingHow many reviews are visible on the page
authorinside reviewA real person or initials, never an invented name
datePublishedinside reviewThe same date shown next to the review
reviewBodyinside reviewThe published text, not rewritten

The code: check what the page declares

# quante volte la pagina dichiara un voto aggregato
curl -s https://www.esempio.it/prodotto/esempio | grep -o '"aggregateRating"' | wc -l

# il numero dichiarato coincide con le recensioni visibili?
curl -s https://www.esempio.it/prodotto/esempio | grep -o '"reviewCount":"[0-9]*"'

If the second command returns a number different from what you count on screen, the markup is out of step and gets ignored. Check the published page, not the template: many themes build the JSON-LD from the reviews present in the database rather than the approved ones.

The limitation to name

Markup does not make a review true: if the scores are bought, the schema makes things worse, because it exposes the gap with unfair-commercial-practice rules. Support for rich results also changes over time, so check the search engine documentation on the day you publish instead of copying an article.

Where to continue

Three records for the review page: review-01, review-02 and the testimonial category, which covers the single-quote case. For the markup read Product schema for an ecommerce site, the guide how to add schema markup and FAQPage for the questions at the bottom of the product page.

Frequently asked questions

How do I know a review is genuine?

There must be a reference to the order that produced it, shown on the page next to the date. If the shop exposes no link to the purchase, the review is anonymous even when it reads as detailed.

Can I ask for a review in exchange for a discount?

You can invite a review, not buy a score. An incentive conditioned on a positive verdict makes the review unfair; if you offer a reward, it must apply to any score and it must be disclosed.

Do I need aggregateRating to get stars in Google?

Yes, the aggregate score is what the engine uses for stars. Without real reviews published on the page the markup gets ignored: no stars beats a false declaration.

Do reviews on a third-party platform count for the product schema?

No. The schema describes what the page shows; reviews collected elsewhere are not visible on your product page and do not belong in it. You can link to them, not aggregate them.

What happens when the schema does not match the page?

The engine ignores the markup and, if the mismatch is systematic, can drop the rich result for the whole site. Regenerate the count every time a review is approved.