Guide : ProductGroup Schema

Comment utiliser ProductGroup schema à groupe produit variants (size, color, material) avec hasVariant, variesBy, et productGroupID — plus le item_group_id difference et pourquoi Bing ne fait pas prise en charge il.

Première publication : 27 juin 2026 · Dernière mise à jour : 3 août 2026 · Avancé

ProductGroup schema wraps a définir de Produit variants — a shirt's sizes et colors — sous un parent donc Google understands ils sont options de le même élément, pas séparé produits. c’est additive: chaque variant est encore a complet Produit avec son propre sku/gtin, price, et availability, et ProductGroup ties les ensemble avec hasVariant (nested, unique-page sites), variesBy (qui attributs differ), et productGroupID (le parent sku). Le unique la plupart courant mistake est writing variesBy as plain strings — il doit utiliser complet schema.org URLs comme https://schema.org/color; dans mon testing le JSON-LD encore valide mais le grouping ne fait pas trigger (Google ne fait pas document que échec mode, donc vérifier il yourself). Deux plus traps: productGroupID (sur la page schema) n’est pas Merchant Center's item_group_id (a produit-feed attribut) — séparé systèmes, rien auto-syncs les, donc utiliser matching valeurs deliberately; et Bing ne fait pas consume ProductGroup markup à tout (per Microsoft's Fabrice Canel, Sept 2024, a reported statement, pas a Microsoft doc). Mon règle avec tout schema holds ici: implement il parce que il earns vous a recherche fonctionnalité, pas parce que plus markup est automatiquement meilleur — il aids understanding et merchant-listing eligibility, il ne fait pas faire a variant classer.

«> TL;DR — ProductGroup (Google’s Feb 2024 addition) wraps variant Product

objects under one parent so Google understands “same item, different options.” It’s additive — each variant keeps full Product markup (sku/gtin, offers, image, availability). Link them with hasVariant (nested, single-page sites) or isVariantOf + inProductGroupWithID (flat, multi-page sites); declare the varying axes with variesBy — which must use full schema.org URLs (https://schema.org/color), not plain strings (the #1 implementation mistake — validates either way, but grouping quietly won’t trigger in practice, which isn’t a documented Google behavior); and share a productGroupID (plain text parent sku, not a URL). productGroupID is not Merchant Center’s item_group_id — separate systems, nothing auto-syncs them, so use matching values on purpose. Only name is strictly required. And Bing doesn’t consume ProductGroup at all (Fabrice Canel, Sept 2024). Schema aids understanding and merchant-listing eligibility — it isn’t a ranking factor. » (Traduction) (Résumé en français de la section dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«## Where this sits » (Traduction) (Résumé en français de la section dix-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«This is the schema-implementation deep dive — the full JSON-LD, the property-by-property reference, the Merchant Center reconciliation, and the troubleshooting. The upstream strategy question — should a given variant get its own indexable URL at all, and how do Shopify/WooCommerce/BigCommerce/Magento differ — is its own topic (product variant SEO). This article assumes you’ve already made those calls and now need the markup right. It also sits under the broader schema markup and structured data hubs, and it’s a sibling of Product schema (for a single, non-varying item, plain Product is all you need — ProductGroup is for a family of variants). » (Traduction) (Résumé en français de la section vingt, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«## Why ProductGroup exists » (Traduction) (Résumé en français de la section vingt et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«Google’s own framing: “To help Google better understand which products are variations of the same parent product, use the ProductGroup class with associated properties variesBy, hasVariant, and productGroupID to group such variants together.” The motivating categories are exactly what you’d expect — “apparel, shoes, furniture, electronic devices, and luggage… sold in different variations (for example various sizes, colors, materials, or patterns).”

Preuve à l’appui de cette affirmation Google documents ProductGroup relationships including variesBy, hasVariant, productGroupID, and inverse variant references. Portée : Google Search product-variant requirements; use the pattern matching the site's URL architecture. Niveau de confiance : élevé · Vérifié : Google: Product variants

» (Traduction) (Résumé en français de la section vingt-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«The payoff is eligibility, not ranking: “Adding this markup also makes your products eligible for display with variant information in merchant listing experiences.” Same caveat that applies to all structured data — it aids understanding and rich-result eligibility, it doesn’t move you up the results. » (Traduction) (Résumé en français de la section vingt-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«## It’s additive — this is the mental model that prevents most mistakes » (Traduction) (Résumé en français de la section vingt-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«ProductGroup wraps Product; it doesn’t replace it. The ProductGroup object itself isn’t offered for sale — it has no single price, because “the coat” costs different amounts depending on which variant you buy. Every variant remains a full Product with its own sku/gtin, image, offers, and availability. If you find yourself trying to put a single offers/price on the ProductGroup, stop — that’s the tell that you’ve confused the wrapper for the thing being sold.

Preuve à l’appui de cette affirmation ProductGroup groups variant Product entities; it does not replace the Product data required for individual variants. Portée : Google Search product-variant guidance; each purchasable variant retains its relevant Product and Offer data. Niveau de confiance : élevé · Vérifié : Google: Product variants

» (Traduction) (Résumé en français de la section vingt-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«## The three core properties » (Traduction) (Résumé en français de la section vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

ProductGroup ajoute le parent relationship; il jamais remplace le Produit markup on chaque sellable variant. Source : Patrick Stox

A ProductGroup named Wool winter coat declares productGroupID 44E01 et variesBy valeurs en utilisant complet schema.org URLs pour color et size. Il connects à green petit, green grand, et blue petit Produit variants. Chaque variant garde a unique SKU, Offer, image, et availability. Le connection peut utiliser hasVariant dans a nested model or isVariantOf dans a flat model.

© Patrick Stox LLC · CC BY 4.0 ·

«### hasVariant (and isVariantOf) » (Traduction) (Résumé en français de la section vingt-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«hasVariant is “a nested Product property that is one of the variants of the ProductGroup property… A ProductGroup typically has multiple nested variant Product properties.” You put your variant Product objects inside the group. » (Traduction) (Résumé en français de la section vingt-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«The inverse also exists: “a variant Product property can reference back to its parent ProductGroup using the isVariantOf property on the Product property.” Which one you use depends on your site’s URL structure (next section). » (Traduction) (Résumé en français de la section trente, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«### variesBy — full schema.org URLs, not plain strings » (Traduction) (Résumé en français de la section trente et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«variesBy declares “aspects by which the variants in the ProductGroup vary (for example, size or color).” The critical detail, verbatim from Google’s properties table: “Reference these variant-identifying properties through their full Schema.org URL.” » (Traduction) (Résumé en français de la section trente-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«That means: » (Traduction) (Résumé en français de la section trente-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

"variesBy": ["https://schema.org/size", "https://schema.org/color"]

«not "variesBy": ["size", "color"]. This is the single most common implementation mistake in this entire topic. What’s documented: Google’s property table requires the full URL form — nothing more specific than that. What’s not documented: Google doesn’t publish what happens if you skip it. In my own testing and consistent with other practitioners’ reports, the JSON-LD still passes syntax validation and nothing errors out, but the enhanced grouping behavior doesn’t trigger — treat that as a strongly observed pattern, not an official Google statement, and verify it against your own markup rather than taking it as gospel. » (Traduction) (Résumé en français de la section trente-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«The supported dimensions are https://schema.org/color, https://schema.org/size, https://schema.org/suggestedAge, https://schema.org/suggestedGender, https://schema.org/material, and https://schema.org/pattern. » (Traduction) (Résumé en français de la section trente-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

«### productGroupID — plain text, and not item_group_id » (Traduction) (Résumé en français de la section trente-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

productGroupID est “le identifier de le produit groupe (aussi connu as le parent sku). Ce identifier doit être provided pour le ProductGroup property or, alternatively, en utilisant inProductGroupWithID property pour variants.” c’est a plain texte identifier — Google’s propre exemple est "44E01" — pas une URL. ne pas over-generalize le variesBy “complet schema.org URL” règle à ce champ; ils sont différent règles pour différent jobs.

Un difficile constraint: “Si vous provide le identifier pour les deux le ProductGroup property et son variant Produit properties, ils doit match.” Google’s docs state le requirement mais ne pas document ce que se produit quand c’est violated. Fondé on mon propre testing (pas a documented Google échec mode), a typo or a template/environment leak que changements le valeur on un variant page drops que variant out de le groupe avec aucun visible erreur — lune page simplement arrête étant lire as partie de le family. Treat que as observed behavior worth verifying yourself, pas an official spec.

Deux implementation patterns: nested vs. flat

Votre Structure d’URL decides qui pattern vous utiliser.

Unique-page sites — nested (hasVariant). Tout variants sont selectable on un URL (via dropdowns/swatches). “Pour unique-page sites web seulement: L’URL (sans variant selectors) où le ProductGroup property est located.” il y a exactly un canonical URL pour le entier groupe, et vous nest chaque variant Product à l’intérieur le ProductGroup via hasVariant.

Multi-page sites — flat (isVariantOf + inProductGroupWithID). Chaque variant a son propre dedicated URL. Ici “ce ne fait pas appliquer since là est aucun unique URL canonique representing le ProductGroup property.” Chaque page doit carry complet, self-contained markup pour le entities défini on que page — vous ne pas share un bloquer à travers pages. Chaque variant Product références son parent avec isVariantOf, et le groupe lien est carried par inProductGroupWithID: “Chaque produit groupe doit ont a unique ID dans son corresponding données structurées markup, specified avec le inProductGroupWithID property.”

Soit façon, “Chaque variant doit have a unique ID in its corresponding données structurées markup (Par exemple, en utilisant the sku or gtin properties).”

Un plus requirement personnes miss on multi-page setups: variants doit être reachable par a distinct, preselectable URL. Google: “Le site doit ont le ability à preselect chaque variant directement avec a distinct URL (en utilisant URL requête parameters), Par exemple https://www.example.com/winter_coat/size=small&color=green.” A variant que seulement apparaît après a client-side click, avec aucun URL à point à, ne peut pas être validated or indexé as son propre chose.

  • Requis on ProductGroup: simplement name (e.g., "Wool winter coat").
  • Recommended: variesBy, hasVariant, productGroupID, brand, description, aggregateRating, review, hasAdultConsideration, and (single-page sites seulement) url.

Technically seulement name est requis — mais variesBy et productGroupID sont functionally charger-bearing. Skip les et le JSON-LD valide pendant que le grouping behavior vous wanted jamais montre up. (aggregateRating et review ici sont le même types vous’d utiliser standalone — voir le AggregateRating et Examiner schema deep dives.)

productGroupID vs. Merchant Center’s item_group_id — le reconciliation nobody explique

Ce is the confusion point que la plupart competitor content skips entirely, so it’s worth being precise.

  • productGroupID est a schema.org / sur la page données structurées champ. Il feeds organique Recherche’s understanding de lune page.
  • item_group_id est a Google Merchant Center produit-feed attribut. Merchant Center: “Utiliser le élément groupe ID [item_group_id] attribut à groupe produit variants dans votre produit données.” Il feeds Shopping ads et gratuit listings.
Preuve à l’appui de cette affirmation Merchant Center item_group_id groups variants in product data, while ProductGroup.productGroupID and Product.inProductGroupWithID are on-page structured-data properties. Google's docs cross-reference the concepts but do not establish automatic synchronization or a universal requirement that the literal values match across feed and markup. Portée : product data Niveau de confiance : élevé · Vérifié : Item group ID [item_group_id]

Ils sont deux séparé systèmes, et Google fait pas automatiquement sync les. Meilleur pratique — et ce est echoed à travers le meilleur tiers implementation guides — est à utiliser le même identifier valeur pour les deux, donc votre feed et votre markup agree on qui SKUs belong ensemble. A mismatch ne fait pas necessarily break soit système outright, mais il supprime le reinforcing signal et peut produce inconsistent grouping entre Shopping surfaces et organique résultats enrichis.

(A footnote on casing: Merchant Center’s aider parfois writes productGroupId lowercase-d où Search Central’s docs utiliser productGroupID. That’s a cosmetic inconsistency in Google’s propre docs, pas a mistake on votre fin — follow Search Central’s productGroupID in votre JSON-LD.)

Le consistency discipline ici est le même un que governs canonicals et variant URLs généralement: votre signaux devrait agree avec chaque autre, or vous êtes handing Google a raison à guess.

Bing ne fait pas prise en charge ProductGroup

Ici’s le differentiator la plupart guides obtenir incorrect or omit: Bing ne fait pas currently consume schema.org ProductGroup markup. Microsoft’s Fabrice Canel, responding directement à a question à propos de si Bing prend en charge schema.org/ProductGroup, said Bing ne fait pas yet prise en charge il, mais que c’est “on our radar” et le team est “closely monitoring its adoption.” (Reported par Moteur de recherche Roundtable, covering a September 2024 exchange on X — a secondary rapport de a premier-party statement, pas a Microsoft doc, donc treat il as tel.)

Bing’s Webmaster Outils structured-données aider est a générique overview de pris en charge formats avec aucun ProductGroup-, variesBy-, or productGroupID-spécifique contenu. Bing’s Shopping variant grouping exécute via a feed-side itemGroupId champ dans Microsoft Advertising — le analog de Google’s item_group_id, pas sur la page schema. Donc: implement ProductGroup pour Google, et handle Bing Shopping variants via le Microsoft Advertising feed, pas markup.

A remarque on dynamic markup

Google’s propre caution: “Être aware que dynamically-generated markup peut faire Shopping explore moins frequent et moins fiable, qui peut être an problème pour rapide-changing contenu comme produit availability et price.” Si votre variant offers/availability sont JS-injected, weigh que contre serveur-rendu le markup pour le champs que modifier souvent.

Validate avant vous ship

  • Résultats enrichis Tester — vérifications eligibility et surfaces requis-property erreurs pour le merchant-listing/variant experience.
  • Balisage de données structurées Validator (schema.org) — valide le ProductGroup/Produit types themselves, independent de Google fonctionnalités.
  • Search Console — le merchant-listings/produit-extrait enhancement rapports montrer eligibility et erreurs à scale post-deploy; Inspection d’URL montre comment a spécifique page était lire.

Remember ce que “valide” fait et ne fait pas tell vous: a plain-string variesBy passes validation et, dans mon testing, encore ne fait pas trigger grouping. Validation catches syntax et requis-property gaps, pas ce kind de semantic échec (qui Google ne fait pas document soit façon) — pour ceux, vérifier par hand que votre variesBy valeurs sont complet URLs et votre productGroupID matches à travers le groupe.

Pour où ce fits le bigger picture, voir le broader données structurées et schema markup hubs ce article lives sous.

Ajouter une note d’expert

Épingler une citation d’expert

Nouvelle personne ? Créez son profil non revendiqué à /admin/experts/ → Épingler une citation d’expert d’abord.