Le problème : vos avis chargés en JavaScript sont invisibles pour la majorité des IA
Les avis clients sont l’un des signaux de confiance les plus forts pour les agents d’achat IA. Pourtant, sur la majorité des stores Shopify, les étoiles affichées aux visiteurs humains ne sont jamais lues par ChatGPT, Perplexity, Claude, Mistral Le Chat et la plupart des autres LLMs.
La raison est technique. Loox, Judge.me, Yotpo, Reviews.io et la majorité des apps d’avis injectent leur AggregateRating côté client, via JavaScript, après le chargement de la page. Les crawlers IA récupèrent uniquement le HTML source initial retourné par le serveur : ils n’exécutent pas le JavaScript. Dans ce HTML source, il n’y a ni étoiles, ni note moyenne, ni compteur d’avis.
Un store avec 5 213 avis et une note de 4,8/5 est donc présenté aux IA comme un store à zéro avis, zéro étoile.
Le test simple pour vérifier votre store
Depuis un terminal, lancez cette commande en remplaçant l’URL par l’une de vos fiches produit :
curl -A "GPTBot" -sL "https://votre-store.com/products/exemple" | grep -i "aggregaterating"
Si la commande ne retourne rien, votre AggregateRating n’est pas dans le HTML natif. Il est injecté en JavaScript, donc invisible pour GPTBot et tous les crawlers IA qui fonctionnent de la même manière.
Vous pouvez valider avec deux outils officiels :
- Google Rich Results Test : onglet “Afficher le code source testé” pour voir exactement ce que Googlebot interprète
- Schema.org Validator : structure et validité du JSON-LD
Pourquoi les crawlers IA ne rendent pas le JavaScript
Les principaux crawlers IA fonctionnent en mode HTTP simple, sans navigateur headless. Ils envoient une requête, lisent le HTML reçu, et passent au document suivant. Cette contrainte n’est pas anecdotique : elle est documentée par les éditeurs des modèles, mesurée sur de gros volumes, et recoupée entre études.
Matrice des crawlers IA et du rendu JavaScript
| Crawler | Opérateur | Exécute le JavaScript ? | Source |
|---|---|---|---|
| GPTBot | OpenAI | Non | OpenAI docs, Vercel 500M+ req |
| OAI-SearchBot | OpenAI | Non (non documenté explicitement) | OpenAI bots |
| ChatGPT-User | OpenAI | Non | Même source |
| ClaudeBot | Anthropic | Non (“ne comptez pas sur le JavaScript”) | Anthropic privacy |
| Claude-SearchBot | Anthropic | Non | Même source |
| PerplexityBot | Perplexity | Non | Perplexity crawlers |
| Meta-ExternalAgent | Meta | Non | Meta webmasters |
| CCBot | Common Crawl | Non (officiel) | Common Crawl FAQ |
| MistralAI-User | Mistral | Mode session navigateur, sans respect de robots.txt | docs.mistral.ai/robots |
| Google-Extended | Oui (réutilise le Web Rendering Service de Googlebot) | Google crawlers | |
| Applebot / Applebot-Extended | Apple | Oui | Apple support |
| Bingbot | Microsoft | Oui, partiel (evergreen via Edge) | Bing blog |
Sur 12 crawlers majeurs, seuls Googlebot, Bingbot et Applebot rendent le JavaScript de façon fiable. Tous les autres lisent uniquement le HTML initial.
Ce que cela signifie pour votre store
Si votre AggregateRating est chargé en JavaScript et que vous voulez apparaître dans :
- Les réponses textuelles de ChatGPT (via Bing + GPTBot/OAI-SearchBot) : invisible
- Les citations Claude (via ClaudeBot) : invisible
- Les réponses Perplexity (via PerplexityBot) : invisible
- Mistral Le Chat : invisible
- Meta AI dans WhatsApp, Instagram et Facebook : invisible
- Grok sur X, DeepSeek, Qwen : invisible
- Les agents MCP custom (Zapier, n8n, Make) qui se multiplient en 2026 : invisible
- Les agents browser qui scrapent le HTML des pages : invisible
Le feed Google Merchant Center, que nous détaillons plus bas, couvre une partie du problème : mais seulement pour 2 surfaces IA sur plus de 12.
Pourquoi Shopify n’expose pas nativement l’AggregateRating
Le filtre Liquid officiel {{ product | structured_data }} produit un schema Product minimal contenant @context, @id, @type, brand, category, description, image, name, offers et url. Il n’inclut pas aggregateRating, review ni rating, comme documenté sur la référence Shopify.
La raison a été donnée publiquement par un mainteneur du thème Dawn dans l’issue GitHub #3535 :
“We are only returning fields in the structured data that come from concrete data, not sourced from metafields.”
Les avis vivent dans des métafields d’apps tierces (Loox, Judge.me, Yotpo, etc.). Shopify ne les remonte donc pas dans son schema par défaut. Sur un thème officiel Online Store 2.0 (Dawn, Craft, Sense, Studio, Crave, Taste, Ride, Origin, Colorblock, Publish), le HTML server-side d’une fiche produit ne contient aucune donnée d’avis. Tout passe par les widgets JS des apps.
Analyse détaillée des 7 principales apps d’avis Shopify
Loox
Rendu du widget : app block via Shopify Online Store 2.0, script loox core exécuté côté client.
JSON-LD AggregateRating : Loox annonce générer automatiquement du JSON-LD Product, Offer et AggregateRating (Loox rich results blog). La documentation publique ne précise pas explicitement si cette injection est server-side via un block Liquid du theme app extension, ou client-side via script : en pratique, elle fonctionne comme une injection JS dans le DOM.
Syndication Google Merchant Center : disponible à partir du plan Scale, nécessite au minimum 50 avis publiés, syndication de tous les avis vérifiés sans filtre (Loox GMC help).
Judge.me
Rendu du widget : template Liquid <div class="jdgm-widget jdgm-preview-badge" data-id="{{ product.id }}">{{ product.metafields.judgeme.badge }}</div> hydraté par widget.js côté client (Judge.me Liquid code).
Rich snippets JSON-LD : option à activer dans Settings → Advanced → Rich Snippets. Judge.me recommande d’activer le JSON-LD et de désactiver le microdata pour éviter les doublons.
Syndication Google Merchant Center : setup manuel via Settings → Google and SEO → Google Shopping. Nécessite un minimum de 50 avis, des identifiants produit (GTIN de préférence), et une validation manuelle Google de 2 à 4 semaines (Judge.me GMC help).
Yotpo
Rendu du widget : Yotpo l’admet dans sa propre documentation : “Yotpo’s JavaScript automatically loads on your product pages, detects the product, fetches the latest review data, and injects the perfect JSON-LD schema into the page’s code” (Yotpo blog). C’est donc une injection côté client par construction.
Syndication Google Merchant Center : disponible sur Starter, Pro, Premium, Enterprise (pas sur Free). Nécessite 50 avis totaux et 3 avis minimum par produit. UGC photos réservé à Premium et Enterprise (Yotpo GMC syndication).
Stamped
Rendu du widget : client-side via <script> avant </body> (Stamped install).
JSON-LD AggregateRating : Stamped fournit un bloc JSON-LD à coller manuellement dans product.liquid, qui lit les métafields Stamped et produit un AggregateRating server-side (Stamped rich snippets). Sans cette installation manuelle, rien n’apparaît côté serveur.
Reviews.io
Rendu par défaut : 3 <script> avant </body> + un placeholder <div data-sku> (Reviews.io rich snippets). Injection client-side. Rich snippets limités aux plans Start-Up, Grow, Plus, Launch, Launch Plus.
Okendo
Rendu du widget : pré-rendu server-side selon la doc marketing Okendo (site speed reviews).
JSON-LD AggregateRating : Okendo est la seule app qui documente officiellement une injection server-side via un snippet Liquid. Le guide officiel demande de créer snippets/okendo-reviews-json-ld.liquid, d’y inclure {% render 'okendo-reviews-json-ld' %} dans theme.liquid, et de lire les métafields product.metafields.okendo.summaryData.reviewAverageValue et product.metafields.okendo.summaryData.reviewCount (Okendo rich snippets).
C’est aujourd’hui la seule app du marché Shopify avec un chemin SSR natif clairement documenté.
Opinew
Approche hybride : Opinew fournit un snippet qui lit des métafields côté serveur (product.metafields.opinew_metafields.reviews_count, .reviews_rating), puis utilise un script client-side pour créer un élément <script type="application/ld+json"> et l’injecter dans le DOM après le load (Opinew rich snippets).
Opinew s’intègre aussi avec des apps SEO tierces comme JSON-LD for SEO, Yoast SEO et SEO Booster, qui lisent les métafields Opinew server-side et émettent le JSON-LD dans le HTML natif. C’est la voie qui garantit la visibilité IA avec Opinew.
Synthèse : AggregateRating server-side par app
| App | Widget | JSON-LD par défaut | Chemin SSR documenté |
|---|---|---|---|
| Loox | Client-side | Injection JS | Non documenté publiquement |
| Judge.me | Client-side | Option activable, injection JS | Non documenté publiquement |
| Yotpo | Client-side | Injection JS (admis par Yotpo) | Non |
| Stamped | Client-side | Non (installation manuelle requise) | Oui, manuel |
| Reviews.io | Client-side | Scripts clients par défaut | Non documenté |
| Okendo | Server-side | Snippet Liquid natif | Oui, documenté |
| Opinew | Client-side | JS par défaut, ou SEO app tierce | Oui, via app tierce |
Le feed Google Merchant Center : une solution partielle
Toutes les grandes apps d’avis proposent une syndication vers Google Merchant Center. Ce chemin permet d’alimenter le carousel produit de ChatGPT (83% des carousels viennent de Google Shopping d’après l’étude Peec AI relayée par Search Engine Land) et celui de Perplexity.
Ce que le feed GMC couvre
- Le carousel produit ChatGPT (via Google Shopping)
- Le carousel produit Perplexity si le marchand est enrôlé dans le Perplexity Merchant Program
- Google Shopping classique
- Partiellement les carousels Google AI Mode
Ce que le feed GMC ne couvre pas
- Les réponses textuelles et citations ChatGPT (pipeline Bing crawler, 87% des citations SearchGPT matchent Bing top 20 selon Seer Interactive)
- Les réponses textuelles Perplexity (crawler PerplexityBot sur HTML)
- Claude, Mistral Le Chat, Meta AI, Grok, DeepSeek, Qwen, Pi, Cohere (tous crawler-only)
- Les citations dans Google AI Overviews
- Les agents MCP custom (Zapier, n8n, Make, ChatGPT Apps)
- Les agents browser en live (Comet, Claude Computer Use, Browser Use)
Pour ces surfaces, l’AggregateRating doit être présent dans le HTML natif, en JSON-LD ou microdata, extractible sans exécution de JavaScript.
Setup du feed GMC : pas par défaut, pas automatique
Aucune des 3 principales apps (Loox, Judge.me, Yotpo) n’active la syndication GMC par défaut. Chaque app exige un toggle manuel, des prérequis spécifiques et une validation Google en plusieurs semaines. Voir le tableau ci-dessus pour les exigences par app.
Le correctif : exposer l’AggregateRating en HTML server-side
Même avec un widget client-side, toutes les apps d’avis écrivent les données dans des métafields Shopify accessibles côté serveur. Ces métafields sont lus au moment du rendu Liquid, ce qui permet d’émettre un JSON-LD directement dans le HTML initial.
Voici un exemple de snippet Liquid à placer dans sections/main-product.liquid ou templates/product.liquid :
{% if product.metafields.reviews.rating_count and product.metafields.reviews.rating_count != "0" %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"@id": "{{ shop.url }}{{ product.url }}#product",
"name": {{ product.title | json }},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{{ product.metafields.reviews.rating.value }}",
"reviewCount": "{{ product.metafields.reviews.rating_count }}",
"bestRating": "5",
"worstRating": "1"
}
}
</script>
{% endif %}
Le namespace product.metafields.reviews.* est celui historique de l’app officielle Product Reviews by Shopify (aujourd’hui dépréciée). Pour les autres apps, adaptez le namespace :
| App | Namespace à utiliser |
|---|---|
| Judge.me | product.metafields.judgeme.badge (contient du HTML) + métafields numériques exposés |
| Okendo | product.metafields.okendo.summaryData.reviewAverageValue et .reviewCount |
| Opinew | product.metafields.opinew_metafields.reviews_rating et .reviews_count |
| Yotpo | product.metafields.yotpo.reviews_average et .reviews_count (confirmé par la communauté, non documenté publiquement) |
Règles à respecter pour un JSON-LD valide
D’après la spec officielle Google :
ratingValueest obligatoire- Au moins un de
ratingCountoureviewCountest obligatoire ratingValuedoit être entreworstRatingetbestRating(par défaut 1 et 5)- N’émettez pas d’AggregateRating si le produit a 0 avis (déclenche des warnings dans la Search Console)
Validation finale
Après ajout du snippet, validez par 3 canaux :
curl -A "GPTBot" -sL "URL-produit" | grep aggregaterating: doit retourner une ligne avec le JSON-LD- Google Rich Results Test : doit afficher “Review snippets” valide
- Schema.org Validator : doit valider la structure
Données de contexte : combien d’IA lisent votre HTML ?
La plateforme Vercel, qui opère un CDN mesurant le trafic des crawlers IA, a publié en 2025 une analyse de plus de 500 millions de requêtes GPTBot et 370 millions de requêtes ClaudeBot par mois. Sur cet échantillon, aucun des deux crawlers n’exécute le JavaScript (Vercel AI crawler).
Yext a analysé 6,8 millions de citations IA et identifié que 86% des citations IA proviennent de sources contrôlées par la marque (site propre, feeds, FAQ structurées) (Yext press release). L’investissement sur son propre HTML est donc plus rentable que de dépendre exclusivement de sources tierces.
Articles liés
- Schema.org Product sur Shopify : guide complet
- Vendre dans ChatGPT : le guide Shopify 2026
- Perplexity Shopping : guide marchand Shopify
- robots.txt et crawlers IA : ce qu’il faut autoriser
- E-E-A-T pour l’IA : comment les agents évaluent la confiance
- Golden Record : complétude des données produit
Prêt à vérifier votre store ? Lancer un audit GEO gratuit →