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.
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 schema est code que indique Google “tout ces variations — le petit green shirt, le grand blue un — sont le même produit dans différent options, pas séparé produits.” Chaque variation encore obtient son propre produit markup; ProductGroup simplement wraps les ensemble. Il fait pas remplacer produit markup, et il fait pas faire a variant classer plus élevé — il aide Google comprendre votre catalog et peut faire votre listings eligible à montrer variant info.
Ce que ProductGroup schema is
Si vous sell a coat dans three colors et five sizes, c’est un coat sold dans 15 combinations. À a moteur de recherche, 15 near-identical produit pages peut regarder comme 15 unrelated produits unless vous tell il sinon.
ProductGroup schema est le données structurées que fait le telling. Il sits ci-dessus votre individual produit listings et dit “ces belong ensemble — ils sont le même élément dans différent options.” Google ajouté prise en charge pour il dans February 2024.
Preuve à l’appui de cette affirmation Schema.org ProductGroup represents a group of products that vary only in defined characteristics. Portée : Schema.org vocabulary; Google adds its own merchant-listing requirements. Niveau de confiance : élevé · Vérifié : Schema.org: ProductGroupThink de il as a parent folder:
- Le parent est le
ProductGroup— “Wool winter coat.” - Le children sont le individual
Productvariants — chaque color/size combo, avec son propre price, photo, stock status, et unique ID.
The important partie: it’s additive, pas a replacement
Ce trips up presque everyone le premier temps. ProductGroup fait pas remplacer votre
produit markup. Chaque variant est encore a complet Product — il garde son propre SKU,
price, image, et availability. ProductGroup est a wrapper que ties ceux Produits
ensemble. vous êtes ajout markup, pas swapping il out.
Ce que it fait pour vous
Marking up votre variants ce façon rend votre produits eligible à montrer variant information dans Google’s shopping/merchant listings — le “also comes in these colors” kind de afficher. As avec tout schema, “eligible” est le clé word: c’est pas a classement boost, et c’est jamais guaranteed. Il aide Google comprendre votre produits, qui est le point. Preuve à l’appui de cette affirmation Google supports ProductGroup with associated variant properties to describe product variants for merchant listings. Portée : Google Search product-variant documentation; eligibility is not a ranking promise. Niveau de confiance : élevé · Vérifié : Google: Product variants
Two choses to know avant vous go deeper
- Bing ne fait pas lire ProductGroup schema (as de le latest word depuis Microsoft). Donc ce est mainly a Google fonctionnalité. Plus on que dans le Avancé tab.
- Ce est le schema/code side de variants. Si a donné variant devrait même obtenir son propre page dans le premier placer est a séparé stratégie question — Je cover que décision (et le plateforme differences) dans le produit variant SEO guide.
Vouloir le complet version — le three core properties, le complet schema.org URL règle pour
variesBy, comment productGroupID differs depuis Merchant Center’s item_group_id, a
complet JSON-LD exemple, et le Erreurs fréquentes? Switch à le Avancé tab.
«> 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
Productmarkup (sku/gtin,offers,image,availability). Link them withhasVariant(nested, single-page sites) orisVariantOf+inProductGroupWithID(flat, multi-page sites); declare the varying axes withvariesBy— 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 aproductGroupID(plain text parent sku, not a URL).productGroupIDis not Merchant Center’sitem_group_id— separate systems, nothing auto-syncs them, so use matching values on purpose. Onlynameis 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.
» (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.)
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 vs. recommended
- Requis on
ProductGroup: simplementname(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.
productGroupIDest a schema.org / sur la page données structurées champ. Il feeds organique Recherche’s understanding de lune page.item_group_idest 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.
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.
AI summary
A condensed prendre on the Avancé version:
«- What it is: ProductGroup (Google, Feb 2024) wraps variant Product objects
under one parent so Google understands “same item, different options” rather than
unrelated products. Eligibility for variant display in merchant listings — not a
ranking factor.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Additive, not a replacement: every variant stays a full Product (sku/gtin,
offers, image, availability); ProductGroup is the wrapper and isn’t sold on
its own (no single price on the group).
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Three core properties: hasVariant nests variants (or isVariantOf points back
up); variesBy lists the varying axes and must use full schema.org URLs
(https://schema.org/color, not "color") — the #1 implementation mistake, and
in practice (not something Google documents) it validates fine while grouping quietly
doesn’t trigger; productGroupID is a plain text parent sku (not a URL, e.g.
"44E01"), and if set on both group and variants the values must match — Google
documents the match rule but not what happens on a mismatch.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Two patterns: nested (hasVariant, single-page sites, one canonical URL for
the group) vs. flat (isVariantOf + inProductGroupWithID, multi-page sites,
full self-contained markup per page). Variants need unique sku/gtin and a
distinct preselectable URL.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Required vs. recommended: only name is required; variesBy + productGroupID
are functionally essential even though technically recommended.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- productGroupID ≠ item_group_id: on-page schema (organic Search) vs. Merchant
Center feed attribute (Shopping/free listings) — separate systems, nothing
auto-syncs, use matching values on purpose.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Bing doesn’t support ProductGroup (Fabrice Canel, Sept 2024, via Search Engine
Roundtable). Bing Shopping variants run through Microsoft Advertising’s feed-side
itemGroupId, not markup.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Watch dynamic markup (less reliable Shopping crawls for price/availability).
Validate with Rich Results Test + schema.org Validator, but remember plain-string
variesBy validates and still fails.
» (Traduction) (Résumé en français de la section soixante-huit, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Official documentation » (Traduction) (Résumé en français de la section soixante-onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation for ProductGroup and variant markup. » (Traduction) (Résumé en français de la section soixante-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google
» (Traduction) (Résumé en français de la section soixante-treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Product variant structured data (ProductGroup, Product) — the single authoritative page: ProductGroup, hasVariant, isVariantOf, variesBy, productGroupID, the full schema.org URL rule, required/recommended properties, and the single-page vs. multi-page rules.
» (Traduction) (Résumé en français de la section soixante-treize, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Adding structured data support for Product Variants (Feb 2024 blog) — the announcement that introduced the properties.
» (Traduction) (Résumé en français de la section soixante-treize, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Intro to Product structured data — the general Product page (Product snippets / merchant listings). Note: it does not cover ProductGroup — that’s the separate page above.
» (Traduction) (Résumé en français de la section soixante-treize, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Google Merchant Center — Item group ID [item_group_id] — the product-feed attribute for grouping variants, and its schema.org cross-references.
» (Traduction) (Résumé en français de la section soixante-treize, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«Bing / Microsoft
» (Traduction) (Résumé en français de la section soixante-quatorze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Bing Webmaster Tools — Marking up your site with structured data — a generic overview of supported formats; no ProductGroup-, variesBy-, or productGroupID-specific content.
» (Traduction) (Résumé en français de la section soixante-quatorze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«schema.org » (Traduction) (Résumé en français de la section soixante-quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- schema.org/ProductGroup — the vocabulary page: authoritative property list and Product/Thing inheritance (no implementation examples or Google-specific guidance). » (Traduction) (Résumé en français de la section soixante-quinze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«Note: the Feb 2024 Search Central blog renders via JavaScript and resisted automated verbatim checking during research; the property definitions are confirmed against the live docs page and Search Engine Roundtable’s verbatim recap. » (Traduction) (Résumé en français de la section soixante-seize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section soixante-dix-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On-le-record statements depuis Google (et reported statements depuis Microsoft). Où a page exposes le texte, le lien est a deep lien que jumps à le quoted passage.
Google docs — objectif and eligibility
«- “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.” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Many types of products such as apparel, shoes, furniture, electronic devices, and luggage are sold in different variations (for example various sizes, colors, materials, or patterns).” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Adding this markup also makes your products eligible for display with variant information in merchant listing experiences.” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
Google docs — the properties
«- variesBy: “Aspects by which the variants in the ProductGroup vary… Reference these variant-identifying properties through their full Schema.org URL.”
Jump to quote
» (Traduction) (Résumé en français de la section quatre-vingt-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- hasVariant: “A nested Product property that is one of the variants of the ProductGroup property, if applicable. A ProductGroup typically has multiple nested variant Product properties.”
Jump to quote
» (Traduction) (Résumé en français de la section quatre-vingt-quatre, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- isVariantOf: “Alternatively, a variant Product property can reference back to its parent ProductGroup using the isVariantOf property on the Product property.”
Jump to quote
» (Traduction) (Résumé en français de la section quatre-vingt-quatre, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- productGroupID: “The identifier of the product group (also known as the parent sku). This identifier must be provided for the ProductGroup property or, alternatively, using inProductGroupWithID property for variants.”
Jump to quote
» (Traduction) (Résumé en français de la section quatre-vingt-quatre, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- On matching IDs: “If you provide the identifier for both the ProductGroup property and its variant Product properties, they must match.”
Jump to quote
» (Traduction) (Résumé en français de la section quatre-vingt-quatre, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
Google docs — unique IDs et URLs
«- “Each variant must have a unique ID in its corresponding structured data markup (for example, using the sku or gtin properties).” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “The site must have the ability to preselect each variant directly with a distinct URL (using URL query parameters), for example https://www.example.com/winter_coat/size=small&color=green.” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-six, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- On dynamic markup: “Be aware that dynamically-generated markup can make Shopping crawls less frequent and less reliable, which can be an issue for fast-changing content like product availability and price.” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-six, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google Merchant Center — item_group_id » (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
- “Use the item group ID [item_group_id] attribute to group product variants in your product data.” Jump à citation
John Mueller, Google (via Moteur de recherche Roundtable’s verbatim reproduction of his Feb 2024 LinkedIn post)
- “Produit variants dans ecommerce sont complicated - ce que faire vous faire avec t-shirts dans différent colors? Folks ici Google worked difficile à come up avec données structurées markup & prendre en charge pour il… Le modifications sont aussi actif dans le Rich Results Testing outil et dans le Search Console rapports pour ces types.” Lire le coverage
Fabrice Canel, Microsoft Bing (reported, pas a first-party doc)
- Responding à si Bing prend en charge
schema.org/ProductGroup, Canel said Bing fait pas yet prise en charge il, mais que c’est “on our radar” et le team est “closely monitoring its adoption.” Coverage Relayed via Moteur de recherche Roundtable’s coverage de a September 2024 exchange on X; a secondary rapport de a premier-party statement, pas a Microsoft documentation page.
A complet ProductGroup JSON-LD exemple
Google’s propre doc exemple est intentionally minimal — un variant, aucun offers. Ici’s a
fuller, unique-page (nested hasVariant) version avec deux variants, offers, gtin,
image, et brand — le shape vous’d en réalité ship. Remarque variesBy utilise complet
schema.org URLs, et productGroupID est a plain string.
{
"@context": "https://schema.org/",
"@type": "ProductGroup",
"name": "Wool winter coat",
"description": "A warm wool winter coat, available in several sizes and colors.",
"url": "https://www.example.com/winter-coat",
"brand": {
"@type": "Brand",
"name": "ExampleCo"
},
"productGroupID": "44E01",
"variesBy": [
"https://schema.org/size",
"https://schema.org/color"
],
"hasVariant": [
{
"@type": "Product",
"sku": "44E01-S-GRN",
"gtin": "0123456789012",
"name": "Wool winter coat, small, green",
"image": "https://www.example.com/photos/44E01-S-GRN.jpg",
"size": "small",
"color": "Green",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/winter-coat?size=small&color=green",
"price": "119.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"sku": "44E01-L-BLU",
"gtin": "0123456789029",
"name": "Wool winter coat, large, blue",
"image": "https://www.example.com/photos/44E01-L-BLU.jpg",
"size": "large",
"color": "Blue",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/winter-coat?size=large&color=blue",
"price": "119.99",
"priceCurrency": "USD",
"availability": "https://schema.org/OutOfStock"
}
}
]
}«Things to notice: » (Traduction) (Résumé en français de la section quatre-vingt-dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The ProductGroup has no offers/price of its own — price lives on each
variant’s Offer, because the group isn’t a single sellable thing.
» (Traduction) (Résumé en français de la section quatre-vingt-dix-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Each variant carries a unique sku (and here a gtin), its own image, its own
availability, and the size/color values that match what variesBy declared.
» (Traduction) (Résumé en français de la section quatre-vingt-dix-neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Availability is per-variant — the small green coat is InStock, the large blue one
OutOfStock. That’s the correct way to handle a partially-stocked group (see the
out-of-stock products guide for how to signal this without dropping the variant).
» (Traduction) (Résumé en français de la section quatre-vingt-dix-neuf, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«## The multi-page (flat) variant of the same setup » (Traduction) (Résumé en français de la section cent, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«If each variant lives on its own URL, you don’t nest — each page carries its own
self-contained Product that points back up with isVariantOf and the shared group ID
via inProductGroupWithID:
» (Traduction) (Résumé en français de la section cent un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
{
"@context": "https://schema.org/",
"@type": "Product",
"sku": "44E01-S-GRN",
"gtin": "0123456789012",
"name": "Wool winter coat, small, green",
"image": "https://www.example.com/photos/44E01-S-GRN.jpg",
"size": "small",
"color": "Green",
"inProductGroupWithID": "44E01",
"isVariantOf": {
"@type": "ProductGroup",
"productGroupID": "44E01",
"variesBy": [
"https://schema.org/size",
"https://schema.org/color"
]
},
"offers": {
"@type": "Offer",
"url": "https://www.example.com/winter-coat/small-green",
"price": "119.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}Chaque variant page repeats ce modèle avec son propre IDs et offer, et le même
productGroupID ("44E01") ties les ensemble. Garder que ID identical à travers tout
variant pages et aligned avec votre Merchant Center item_group_id.
Devrait vous utiliser ProductGroup, and qui pattern?
Walk le tree à land on le correct markup décision pour votre setup.
ProductGroup or plain Produit — et nested or flat?
«## Common ProductGroup mistakes » (Traduction) (Résumé en français de la section cent onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The traps, and what’s actually true: » (Traduction) (Résumé en français de la section cent douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| Mistake | Reality |
| --- | --- |
| Treating ProductGroup as a replacement for Product | It’s a wrapper/parent. Every variant is still a full Product with its own sku/gtin, price, image, and availability. The ProductGroup itself isn’t offered for sale — don’t put a single offers/price on it. |
| Writing variesBy as plain strings ("color", "size") | It must use full schema.org URLs (https://schema.org/color). Plain strings pass JSON-LD validation, and in practice grouping doesn’t trigger (Google doesn’t document that specific failure, so verify it on your own markup) — the single most common mistake in this topic. |
| Assuming productGroupID and Merchant Center’s item_group_id are the same auto-synced field | They’re separate systems — on-page schema (organic Search) vs. product feed (Shopping/free listings). Nothing syncs them; use matching values deliberately. |
| Making productGroupID a URL | It’s a plain text identifier (parent sku), e.g. "44E01". Don’t over-apply the variesBy full-URL rule here — different field, different rule. |
| Shrugging off a productGroupID typo on one variant page | In multi-page setups, a mismatched ID drops that variant out of the group with no error thrown, in my testing — Google documents the match requirement but not the mismatch behavior, so this is observed, not officially specified. |
| Marking up variants that have no distinct URL | Variants must be preselectable via a distinct URL (query params are fine). JS-only state changes with no URL can’t be validated or indexed as variants. |
» (Traduction) (Résumé en français de la section cent treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| Assuming Bing reads ProductGroup like Google does | As of Sept 2024 (Fabrice Canel, via Search Engine Roundtable), Bing does not consume ProductGroup markup. Bing Shopping variants run through Microsoft Advertising’s feed-side itemGroupId, not on-page schema. |
| Expecting ProductGroup to improve rankings | It aids understanding and merchant-listing eligibility — it is not a ranking factor. “Eligible” is not “guaranteed,” and it’s certainly not a boost. |
| Trusting “valid” to mean “working” | Validation catches syntax and required-property gaps, not silent semantic failures. Plain-string variesBy and mismatched IDs both validate and still don’t work — check them by hand. |
» (Traduction) (Résumé en français de la section cent treize, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
ProductGroup implementation checklist
Fonctionner via ce in order — chaque item maps to a spécifique gotcha covered ci-dessus.
- Decide votre modèle premier. Tout variants selectable on un URL → nested
(
hasVariant). Chaque variant on son propre URL → flat (isVariantOf+inProductGroupWithID). ne pas mix patterns on le même groupe. - Garder chaque variant a complet
Product. Chaque un encore a son propresku/gtin,image,offers, etavailability—ProductGroupjamais carries a uniquepricede son propre. - Écrire
variesByas complet schema.org URLs, e.g.https://schema.org/colorethttps://schema.org/size— pas"color"/"size". Ce est le #1 implementation mistake; il valide soit façon, et grouping quietly ne fait pas trigger sans l’URL formulaire dans mon testing (pas quelque chose Google documents), donc vérifier il par eye. - Définir
productGroupIDas a plain-texte identifier (parent sku, e.g."44E01") — jamais une URL. Différent règle depuisvariesBy; ne pas conflate les. - Match
productGroupID(orinProductGroupWithID) à travers chaque variant. Google documents le match requirement mais pas ce que se produit si c’est violated; dans mon testing, a typo on un variant page drops il depuis le groupe avec aucun erreur. - Donner chaque variant a unique ID via
skuorgtin. - Confirmer chaque variant a a distinct, preselectable URL (requête params sont
fine, e.g.
?size=small&color=green). A JS-seulement state modifier avec aucun URL ne peut pas être validated or indexé as son propre variant. - Align
productGroupIDavec Merchant Center’sitem_group_id. ils sont séparé systèmes et rien auto-syncs les — utiliser le même valeur on objectif. - Serveur-rendre rapide-changing champs (
price,availability) où possible — Google warns dynamically-generated markup peut faire Shopping explore moins frequent et fiable. - Valider, alors vérifier par hand. Exécuter le Résultats enrichis Tester et le
schema.org Validator — alors manuellement re-vérifier
variesByURLs etproductGroupIDmatching, since les deux réussir validation même quand broken. - Si vous aussi cible Bing, ne pas rely on ProductGroup — il n’est pas consumed
à tout (per Microsoft’s Fabrice Canel, Sept 2024). Handle Bing Shopping
variants via Microsoft Advertising’s feed-side
itemGroupIdà la place.
ProductGroup quick-reference
productGroupID vs. item_group_id vs. inProductGroupWithID
| Champ | Lives dans | Format | Feeds |
|---|---|---|---|
productGroupID | Sur la page JSON-LD, on le ProductGroup (or on a variant Product via isVariantOf) | Plain texte (e.g. "44E01") | Organique Recherche’s understanding de lune page |
inProductGroupWithID | Sur la page JSON-LD, on a variant Product (multi-page/flat modèle) | Plain texte, doit match le group’s productGroupID | Même as ci-dessus — le flat-modèle lien back à le groupe |
item_group_id | Google Merchant Center produit feed | Plain texte | Shopping ads et gratuit listings |
Nothing auto-syncs ces à travers systems — utiliser the même valeur in tout three so organic and Shopping agree on qui SKUs belong ensemble.
Nested vs. flat pattern
Nested (hasVariant) | Flat (isVariantOf + inProductGroupWithID) | |
|---|---|---|
| Quand à utiliser | Unique-page sites — tout variants selectable on un URL | Multi-page sites — chaque variant a son propre URL |
| URL canonique pour le groupe | Un (url on le ProductGroup) | None — aucun unique URL represents le groupe |
| Où le groupe properties actif | On le ProductGroup, qui nests chaque variant Product | Repeated on chaque variant page, via isVariantOf |
| Variant → groupe lien | Variant est nested à l’intérieur hasVariant | Variant références parent avec isVariantOf + inProductGroupWithID |
Property format rules
| Property | Correct format | Incorrect format |
|---|---|---|
variesBy | Complet schema.org URL: https://schema.org/color | Plain string: "color" (validates; En pratique doesn’t groupe — pas a documented Google échec mode) |
productGroupID | Plain text parent sku: "44E01" | UNE URL |
sku / gtin (per variant) | Unique per variant | Shared/reused à travers variants |
Catch le #1 implementation mistake: variesBy as plain strings
variesBy valeurs que skip le complet schema.org URL prefix sont le unique la plupart courant
mistake dans ce topic — le JSON-LD encore valide, donc rien erreurs out, et dans mon
testing grouping quietly ne fait pas trigger (Google’s docs exiger le complet-URL formulaire mais
ne pas document ce que se produit si vous skip il). Ces extraits catch il directement au lieu de
relying on eyeballing le markup.
Regex: flag a mauvais variesBy array dans raw JSON-LD
Run ce over extracted JSON-LD source (e.g. a Screaming Frog custom extraction export,
or quelconque raw HTML/text dump) to trouver variesBy arrays containing a valeur que isn’t a
complet schema.org URL:
"variesBy"\s*:\s*\[\s*((?:"(?!https://schema\.org/)[^"]*"\s*,?\s*)+)\]"variesBy"\s*:\s*\[— matches le commencer de le property et son opening bracket, allowing pour whitespace formatting differences.(?:"(?!https://schema\.org/)[^"]*"\s*,?\s*)+— le capture groupe: matches un or plus quoted strings où a negative lookahead(?!https://schema\.org/)règles out n’importe quoi que déjà commence avec le correct prefix. Si ce groupe matches n’importe quoi à tout, au moins un entry dans le array est a mauvais plain string comme"color"or"size"au lieu de a complet URL.- A match signifie: arrêter et corriger que array avant shipping — il va valider clean et encore échouer à trigger grouping.
Chrome DevTools Console extrait: audit le actif page’s JSON-LD
Paste dans le Console on quelconque page vous expect à carry ProductGroup markup. Il pulls
chaque JSON-LD bloquer, walks dans ProductGroup objects (notamment ones nested sous
isVariantOf), et rapports quelconque variesBy entry que n’est pas a complet schema.org URL:
(function () {
const blocks = [...document.querySelectorAll('script[type="application/ld+json"]')];
const findings = [];
blocks.forEach((block, i) => {
let data;
try {
data = JSON.parse(block.textContent);
} catch (e) {
findings.push(`Block ${i}: invalid JSON (${e.message})`);
return;
}
const items = Array.isArray(data) ? data : [data];
items.forEach((item) => {
const groups = [];
if (item['@type'] === 'ProductGroup') groups.push(item);
if (item.isVariantOf && item.isVariantOf['@type'] === 'ProductGroup') groups.push(item.isVariantOf);
groups.forEach((g) => {
const bad = (g.variesBy || []).filter((v) => !String(v).startsWith('https://schema.org/'));
if (bad.length) findings.push(`Block ${i}: bad variesBy values -> ${JSON.stringify(bad)}`);
if (g.productGroupID && /^https?:\/\//.test(g.productGroupID)) {
findings.push(`Block ${i}: productGroupID looks like a URL, should be plain text -> ${g.productGroupID}`);
}
});
});
});
console.log(findings.length ? findings.join('\n') : 'No ProductGroup issues found in this page\'s JSON-LD.');
})();XPath pour Screaming Frog: extract productGroupID à travers variant pages
Utiliser a custom extraction à pull le productGroupID valeur straight out de le JSON-LD
script balise, alors comparer le extracted valeurs à travers votre exploré variant URLs à spot a
mismatch:
//script[@type="application/ld+json"]Extract le complet texte de chaque matching node, alors vérifier le extracted productGroupID
(et inProductGroupWithID on flat/multi-page setups) est identical à travers chaque URL
c’est supposed à belong à le même groupe — a unique differing valeur signifie que page
a probable dropped out de le groupe avec aucun erreur thrown, fondé on testing (Google’s
docs exiger le match mais ne pas document mismatch behavior).
Testez vos connaissances: ProductGroup Schema
Five rapide questions on ProductGroup, son core properties, et le gotchas. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
My connexe writing
Je haven’t publié a piece précisément on ProductGroup schema — ce article est le dedicated treatment. Le closest adjacent choses j’ai written que inform il:
«- Google Uses ~40 Canonicalization Signals — Here’s What That Means — the “keep your signals consistent” discipline that underpins matching productGroupID across variants (and aligning it with item_group_id).
» (Traduction) (Résumé en français de la section cent cinquante-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The Myth of the Duplicate Content Penalty (Search Engine Land) — why grouping variants as one item in options, rather than fearing them as duplicates, is the right mental model. There’s no duplicate-content penalty to “fix” with ProductGroup — it’s about understanding, not avoiding a fine.
» (Traduction) (Résumé en français de la section cent cinquante-quatre, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
Pour le stratégie couche — si a variant devrait même obtenir son propre URL, et comment Shopify/WooCommerce/BigCommerce/Magento differ — voir le produit variant SEO guide on ce site. Pour le fundamentals, le balisage de données structurées et données structurées hubs, et le sibling Produit schema deep dive.
From autour the industry
«- Product variant structured data (Google Search Central) — the authoritative reference; read it alongside this for the full property tables.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Adding structured data support for Product Variants (Google Search Central blog) — the Feb 2024 announcement.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Item group ID [item_group_id] (Google Merchant Center Help) — the feed-side attribute and its schema.org cross-references.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- New Google Search Support For Product Variant Structured Data (Search Engine Roundtable) — the Feb 2024 launch recap, with John Mueller’s verbatim LinkedIn post.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Bing does not support ProductGroup markup (Search Engine Roundtable) — the Fabrice Canel statement (Sept 2024).
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Google adds support for product variants (Search Engine Land) — same-day announcement coverage.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Google To Display More Product Variants With New Markup (Search Engine Journal) — the SEJ take on the launch.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Schema piece: ProductGroup (Yoast Developer Portal) — real JSON-LD examples and Yoast’s default productGroupID-from-SKU behavior (plugin-specific).
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«- How to implement ProductGroup schema (Go Fish Digital) — plain-English “why this exists” framing.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie neuf : le texte source est conservé pour vérification lors de la relecture francophone.)
«- schema.org/ProductGroup — the vocabulary itself, straight from the source.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie dix : le texte source est conservé pour vérification lors de la relecture francophone.)
Journal des modifications
Mis à jour le 20 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.