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 · 200 · text/html
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.
Example page /products/merino-trail-runner
5 types detectedProduct
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