Aller au contenu principal
Urgence critique Avis clients

AggregateRating : avis Shopify lisibles IA

Mis à jour le Contenu à jour
#aggregate-rating#avis#reviews#schema-org#crawlers#llm
Share
Cet article inclut un quiz, testez vos connaissances en fin de lecture ! Aller au quiz

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 :

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.

Comparaison HTML natif vs JavaScript : les avis en JSON-LD server-side sont visibles pour GPTBot, ClaudeBot, PerplexityBot, tandis que les avis chargés en JavaScript sont invisibles
Figure 1 : Ce que voient les crawlers IA : le HTML server-side vs. le DOM après exécution du JavaScript

Matrice des crawlers IA et du rendu JavaScript

CrawlerOpérateurExécute le JavaScript ?Source
GPTBotOpenAINonOpenAI docs, Vercel 500M+ req
OAI-SearchBotOpenAINon (non documenté explicitement)OpenAI bots
ChatGPT-UserOpenAINonMême source
ClaudeBotAnthropicNon (“ne comptez pas sur le JavaScript”)Anthropic privacy
Claude-SearchBotAnthropicNonMême source
PerplexityBotPerplexityNonPerplexity crawlers
Meta-ExternalAgentMetaNonMeta webmasters
CCBotCommon CrawlNon (officiel)Common Crawl FAQ
MistralAI-UserMistralMode session navigateur, sans respect de robots.txtdocs.mistral.ai/robots
Google-ExtendedGoogleOui (réutilise le Web Rendering Service de Googlebot)Google crawlers
Applebot / Applebot-ExtendedAppleOuiApple support
BingbotMicrosoftOui, 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

AppWidgetJSON-LD par défautChemin SSR documenté
LooxClient-sideInjection JSNon documenté publiquement
Judge.meClient-sideOption activable, injection JSNon documenté publiquement
YotpoClient-sideInjection JS (admis par Yotpo)Non
StampedClient-sideNon (installation manuelle requise)Oui, manuel
Reviews.ioClient-sideScripts clients par défautNon documenté
OkendoServer-sideSnippet Liquid natifOui, documenté
OpinewClient-sideJS par défaut, ou SEO app tierceOui, 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 :

AppNamespace à utiliser
Judge.meproduct.metafields.judgeme.badge (contient du HTML) + métafields numériques exposés
Okendoproduct.metafields.okendo.summaryData.reviewAverageValue et .reviewCount
Opinewproduct.metafields.opinew_metafields.reviews_rating et .reviews_count
Yotpoproduct.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 :

  • ratingValue est obligatoire
  • Au moins un de ratingCount ou reviewCount est obligatoire
  • ratingValue doit être entre worstRating et bestRating (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 :

  1. curl -A "GPTBot" -sL "URL-produit" | grep aggregaterating : doit retourner une ligne avec le JSON-LD
  2. Google Rich Results Test : doit afficher “Review snippets” valide
  3. 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


Prêt à vérifier votre store ? Lancer un audit GEO gratuit →

Questions fréquentes

Pourquoi mes avis Loox, Judge.me ou Yotpo sont invisibles pour ChatGPT ?
Ces apps injectent leurs étoiles et leur AggregateRating via JavaScript après le chargement de la page. Les crawlers IA comme GPTBot, ClaudeBot, PerplexityBot, Meta-ExternalAgent et CCBot n'exécutent pas le JavaScript. Ils ne voient que le HTML initial envoyé par le serveur, qui ne contient aucune donnée d'avis.
Le feed Google Merchant Center ne résout-il pas le problème ?
Partiellement. Le feed GMC alimente le carousel produit de ChatGPT (83% des carousels viennent de Google Shopping) et celui de Perplexity. Mais il ne couvre pas les réponses textuelles de ChatGPT, les citations, Claude, Mistral Le Chat, Meta AI, Grok, DeepSeek, ni les agents MCP ou browser. Pour ces surfaces, l'AggregateRating en HTML reste indispensable.
Quelle app d'avis expose l'AggregateRating en HTML natif sur Shopify ?
Okendo est la seule app qui documente publiquement une injection server-side via un snippet Liquid. Stamped fournit du JSON-LD mais exige une installation manuelle dans le thème. Loox, Judge.me, Yotpo, Reviews.io injectent leur AggregateRating côté client par défaut. Opinew est hybride.
Shopify expose-t-il nativement l'AggregateRating dans son schema ?
Non. Le filtre Liquid {{ product | structured_data }} génère Product, Offer, Brand et Image, mais omet délibérément aggregateRating et review. La raison officielle dans le repo Dawn : Shopify ne fait remonter que des données concrètes du catalogue, pas celles des métafields d'apps tierces.
Comment tester si mon AggregateRating est lu par les crawlers IA ?
Utilisez la commande curl -A 'GPTBot' -sL 'https://votre-store.com/products/slug' | grep -i aggregaterating. Si rien ne matche, vos avis sont invisibles. Validez ensuite avec Google Rich Results Test et schema.org Validator.
Quel schema.org utiliser pour les avis ?
Le type AggregateRating avec au minimum ratingValue et l'un des deux champs ratingCount ou reviewCount. La valeur ratingValue doit être entre bestRating (par défaut 5) et worstRating (par défaut 1). À émettre seulement si le produit a au moins 1 avis réel.
🧠 Testez vos connaissances
1 / 5