← Guides

Why can’t ChatGPT see my product reviews?

The product page is readable, but the reviews are not

Shopify sends the product title, price and description in the initial HTML. Review apps often send an empty widget container, then fetch the customer comments with JavaScript. A person sees the reviews after the widget loads. A crawler that does not run the widget sees no review text.

We checked three live Shopify product pages on 27 July 2026. Yotpo, Okendo and Loox appeared across the sample. Review body text was readable in the initial HTML on 0 of 3 pages.

This measures the HTTP response, not what ChatGPT says about a product. It shows which review facts are available to a crawler before JavaScript. It does not prove when an answer engine will crawl the page or how it will use the result.

The three outcomes we found

What the initial HTML containedPagesWhat a crawler can recover
Full customer review bodies in JSON-LD1 of 3Five review comments plus their structured fields
AggregateRating only1 of 3Average score and review count, but no reasons behind the score
No review bodies or aggregate rating1 of 3No review evidence from the product page
Readable review text outside scripts0 of 3No customer comment in the page text

Run the three checks on a real product

Use a product with published reviews. Replace the exact sentence below with a line from one of those reviews. A zero is useful evidence: it tells you which layer is missing.

URL='https://yourstore.com/products/your-product'
UA='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot'

# 1. Is a known customer sentence readable outside scripts and styles?
curl -sL -A "$UA" "$URL" | perl -0pe 's{<script\b[^>]*>.*?</script>}{}gis; s{<style\b[^>]*>.*?</style>}{}gis; s{<[^>]+>}{ }g' | grep -Fci 'an exact sentence from a published review'

# 2. Are full review bodies present in structured data?
curl -sL -A "$UA" "$URL" | grep -o '"reviewBody"[[:space:]]*:' | wc -l

# 3. Is there at least an aggregate score?
curl -sL -A "$UA" "$URL" | grep -o '"aggregateRating"[[:space:]]*:' | wc -l

What the app names do and do not tell you

The app name is not the result. Theme code, app settings and product data decide what reaches the response. Check the exact live product URL after every theme or app change.

Yotpo documents automatic JSON-LD with the product name, price, review count and average rating. That is an aggregate signal. Its documented default does not promise customer review bodies in the initial HTML.

Okendo documents native AggregateRating JSON-LD. Its current guide says a featured Review object requires review data from the Storefront API and custom JSON-LD. It also warns that a hand-coded widget container can force a full client-side load.

Loox says its rich snippets are on by default and that its site mapping makes review data crawlable. Loox widgets still load in the background. Run the three checks above to see which facts the exact product response contains.

Fix the text first

Put a short set of real customer excerpts in the server-rendered product template. Include enough text to explain why buyers liked or disliked the product. A score alone cannot answer that question.

Keep the interactive widget for sorting, photos and pagination. The server-rendered excerpt is the stable copy a crawler and a no-JavaScript client can read.

Do not hide the excerpt only in a script block. It should be ordinary page text tied to the product the review describes.

Then make the structured data match

Add Product structured data with an AggregateRating when the score and count are real. Add Review objects only for reviews that are published on that product page. Each object should carry the actual author, rating and review body.

Google recommends putting Product structured data in the initial HTML. It supports both AggregateRating and nested Review properties. A valid score can help a machine identify the rating, while a Review body supplies the customer’s reason.

Read the generated JSON-LD before publishing it. Confirm that the product, count, score, author and review text match the live page. Structured data that names the wrong product or invents a review is worse than no markup.

Verify the final response

Re-run all three commands after the change. The first should find the exact review sentence. The second should report the number of Review bodies you chose to publish. The third should find the aggregate rating when you use one.

Also inspect the page source and test the Product object with Google’s Rich Results Test. A rendered widget is not proof that the initial HTML changed.

Sources

Frequently asked

Are product reviews visible to Google but not AI crawlers?

They can be. Googlebot renders JavaScript, while major AI vendors do not publish a JavaScript-rendering promise for their retrieval crawlers. Check the initial HTML rather than assuming every crawler loads the widget.

Is AggregateRating enough?

It preserves the average score and review count. It does not preserve what customers said. Publish a small set of real review excerpts as page text when the reasons matter.

Does JSON-LD make ChatGPT cite my product?

No. JSON-LD makes product and review facts easier to identify in the response. It does not guarantee a crawl, citation or answer.

Should I replace my review app?

Not before checking the response. The same app can produce different output under different themes and settings. Fix the server-rendered excerpt or structured-data setup, then test again.

Last updated 2026-08-02.

Check your own site

Run the homepage access, policy and response-content checks. The full diagnosis is free and needs no account.

Complete results at a shareable link. No signup or credit card.