What a crawler reads on your product page

Review Optimiza writes your ratings and reviews into the page's HTML, so they arrive with the page instead of waiting for a widget to load. Here is exactly what gets written, and where each part comes from.

GET /products/merino-trail-runner

Example
<html lang="en"><head>  <title>Merino Trail Runner | Example Store</title>  …  <script type="application/ld+json">  {    "@context": "https://schema.org",    "@type": "Product",    "name": "Merino Trail Runner",    "description": "Lightweight merino runner …",    "image": "https://cdn.shopify.com/…/merino-trail-runner.jpg",    "url": "https://example.myshopify.com/products/merino-trail-runner",    "offers": {      "@type": "Offer",      "availability": "https://schema.org/InStock",      "price": "189.00",      "priceCurrency": "USD"    },    "aggregateRating": {      "@type": "AggregateRating",      "ratingValue": "4.8",      "reviewCount": "312"    },    "review": [      {        "@type": "Review",        "author": "Priya S.",        "datePublished": "2026-08-02",        "name": "Best trail shoe I have owned",        "reviewBody": "Light, warm and dry after …",        "reviewRating": {          "@type": "Rating",          "bestRating": "5",          "ratingValue": "5",          "worstRating": "1"        }      },      …    ]  }  </script></head><body>  …  <script src="https://…/reviews-widget.js" defer></script></body>

Select a note to find it in the source.

What the markup declares

The example page read back: five Schema.org types, nested inside one Product. The JSON-LD declares them, and the Structured HTML carries the same information as plain hidden HTML.

Test a page in Google's Rich Results Test (opens in a new tab)

Example page /products/merino-trail-runner

5 types detected
  • Product

    Merino Trail Runner

    The product itself, from Shopify.

    1 per selected product

    • name
    • description
    • image
    • url
    • offers
    • aggregateRating
    • review
  • Offer

    USD 189.00

    The price and currency of the product's cheapest variant.

    1 per product

    • price
    • priceCurrency
    • availability
  • AggregateRating

    4.8 from 312 reviews

    The average rating and total review count from your review provider.

    Only with reviews

    • ratingValue
    • reviewCount
  • Review

    8 reviews

    Up to 8 of the product's reviews, in your customers' words.

    Up to 8

    • author
    • datePublished
    • name
    • reviewBody
    • reviewRating
  • Rating

    8 ratings

    Each review's score on a 1 to 5 scale.

    1 per review

    • ratingValue
    • bestRating
    • worstRating

Valid markup makes your ratings readable. Whether a search engine shows stars in its results is up to the search engine.

How it gets there, and stays current

No theme code
Two app embeds, switched on once in the theme editor, print the markup into your pages.
The app stores each product's markup in its metafields, and the embeds print it into the page. Deselect a product and its markup is removed.
app.structured_dataapp.structured_data_microdata
Updated every day
Ratings and reviews are refreshed automatically once a day.
You can also run a manual sync once every 24 hours. Every sync is listed on the Sync Status page with its result, and the dashboard flags one that fails.
Not tied to one review platform
Yotpo, Okendo, and Klaviyo all work today.
One provider is active at a time. When you switch, the app removes the old provider's markup and asks you to re-fetch. Your theme doesn't change.
You choose the products
Pick which products carry markup, up to your plan's limit.
The Free plan covers up to 10 products. Paid plans raise the limit.
Compare plans

Check it in your own page source

The Free plan covers up to 10 products. Connect your store, switch on the embeds, then open any selected product page and view its source.
Features | Review Optimiza