Panduan ProductGroup Schema

cara gunakan ProductGroup schema untuk group product variants (size, color, material) dengan hasVariant, variesBy, dan productGroupID — plus item_group_id difference dan why Bing doesn't mendukung ini.

Pertama kali diterbitkan: 27 Jun 2026 · Terakhir diperbarui: 3 Agu 2026 · Advanced
Bahasa

ProductGroup schema wraps sebuah set dari Product variants — sebuah shirt's sizes dan colors — di bawah one parent so Google understands mereka're options dari yang sama item, not separate products. ini adalah additive: setiap variant adalah masih sebuah full Product dengan -nya own sku/gtin, price, dan availability, dan ProductGroup ties them together dengan hasVariant (nested, single-halaman situs), variesBy (which attributes differ), dan productGroupID ( parent sku). single sebagian besar umum mistake adalah writing variesBy sebagai plain strings — ini harus gunakan full schema.org URLs like https://schema.org/color; di my testing JSON-LD masih validates tetapi grouping doesn't trigger (Google doesn't document itu failure mode, so verify ini yourself). Two more traps: productGroupID (pada-halaman schema) adalah not Merchant Center's item_group_id (sebuah product-feed attribute) — separate sistem, nothing auto-syncs them, so gunakan matching nilai deliberately; dan Bing doesn't consume ProductGroup markup di semua (per Microsoft's Fabrice Canel, Sept 2024, sebuah reported statement, not sebuah Microsoft doc). My aturan dengan semua schema holds here: implement ini because ini earns Anda sebuah search fitur, not because more markup adalah automatically better — ini aids understanding dan merchant-listing eligibility, ini doesn't membuat sebuah variant peringkat.

TL;DR — ProductGroup (Google’s Feb 2024 addition) wraps variant Product objects di bawah one parent so Google understands “same item, different options.” (terjemahan) “sama item, berbeda options.” ini adalah additive — setiap variant mempertahankan full Product markup (sku/gtin, offers, image, availability). tautan them dengan hasVariant (nested, single-halaman situs) atau isVariantOf + inProductGroupWithID (flat, multi-halaman situs); declare varying axes dengan variesBy — which harus gunakan full schema.org URLs (https://schema.org/color), not plain strings ( #1 implementation mistake — validates either cara, tetapi grouping quietly won’t trigger dalam praktik, which isn’t sebuah documented Google perilaku); dan share sebuah productGroupID (plain text parent sku, not sebuah URL). productGroupID adalah not Merchant Center’s item_group_id — separate sistem, nothing auto-syncs them, so gunakan matching nilai pada purpose. hanya name adalah strictly diperlukan. dan Bing doesn’t consume ProductGroup di semua (Fabrice Canel, Sept 2024). Schema aids understanding dan merchant-listing eligibility — ini isn’t sebuah peringkat factor.

Where ini sits

ini adalah schema-implementation deep dive — full JSON-LD, property-oleh-property reference, Merchant Center reconciliation, dan troubleshooting. upstream strategy pertanyaan — seharusnya sebuah given variant get -nya own dapat diindeks URL di semua, dan how melakukan Shopify/WooCommerce/BigCommerce/Magento differ — adalah -nya own topic (product variant SEO). ini artikel assumes Anda’ve sudah dibuat itu panggilan dan now perlu markup right. ini juga sits di bawah broader schema markup dan data terstruktur hubs, dan ini adalah sebuah sibling dari Product schema (untuk sebuah single, non-varying item, plain Product adalah semua Anda perlu — ProductGroup adalah untuk sebuah family dari variants).

Why ProductGroup exists

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.” (terjemahan) “untuk help Google better memahami which products adalah variations dari yang sama parent product, gunakan ProductGroup class dengan associated properties variesBy, hasVariant, dan productGroupID untuk group such variants together.” motivating categories adalah exactly what Anda’d expect — “apparel, shoes, furniture, electronic devices, and luggage… sold in different variations (for example various sizes, colors, materials, or patterns).” (terjemahan) “apparel, shoes, furniture, electronic devices, dan luggage… sold di berbeda variations (misalnya various sizes, colors, materials, atau patterns).”

Evidence for this claim Google documents ProductGroup relationships including variesBy, hasVariant, productGroupID, and inverse variant references. Scope: Google Search product-variant requirements; use the pattern matching the site's URL architecture. Confidence: high · Verified: Google: Product variants

payoff adalah eligibility, not peringkat: “Adding this markup also makes your products eligible for display with variant information in merchant listing experiences.” (terjemahan) “menambahkan ini markup juga membuat Anda products eligible untuk display dengan variant informasi di merchant listing experiences.” sama caveat itu applies untuk semua data terstruktur — ini aids understanding dan rich-hasil eligibility, ini doesn’t move Anda up hasil.

ini adalah additive — ini adalah mental model itu mencegah sebagian besar mistakes

ProductGroup wraps Product; ini doesn’t replace ini. ProductGroup object itself isn’t offered untuk sale — ini memiliki no single price, because “the coat” (terjemahan) “ coat” costs berbeda amounts depending pada which variant Anda buy. setiap variant remains sebuah full Product dengan -nya own sku/gtin, image, offers, dan availability. jika Anda temukan yourself trying untuk put sebuah single offers/price pada ProductGroup, stop — itu’s tell itu Anda’ve confused wrapper untuk thing menjadi sold.

Evidence for this claim ProductGroup groups variant Product entities; it does not replace the Product data required for individual variants. Scope: Google Search product-variant guidance; each purchasable variant retains its relevant Product and Offer data. Confidence: high · Verified: Google: Product variants

three core properties

ProductGroup adds the parent relationship; it never replaces the Product markup on each sellable variant. Sumber: Patrick Stox

A ProductGroup named Wool winter coat declares productGroupID 44E01 and variesBy values using full schema.org URLs for color and size. It connects to green small, green large, and blue small Product variants. Every variant keeps a unique SKU, Offer, image, and availability. The connection can use hasVariant in a nested model or isVariantOf in a flat model.

© Patrick Stox LLC · CC BY 4.0 ·

hasVariant (dan isVariantOf)

hasVariant adalah “a nested Product property that is one of the variants of the ProductGroup property… A ProductGroup typically has multiple nested variant Product properties.” (terjemahan) “sebuah nested Product property itu adalah one dari variants dari ProductGroup property… sebuah ProductGroup typically memiliki multiple nested variant Product properties.” Anda put Anda variant Product objects inside group.

inverse juga exists: “a variant Product property can reference back to its parent ProductGroup using the isVariantOf property on the Product property.” (terjemahan) “sebuah variant Product property dapat reference back untuk -nya parent ProductGroup menggunakan isVariantOf property pada Product property.” Which one Anda gunakan depends pada Anda situs’s struktur URL (next bagian).

variesBy — full schema.org URLs, not plain strings

variesBy declares “aspects by which the variants in the ProductGroup vary (for example, size or color).” (terjemahan) “aspects oleh which variants di ProductGroup vary (untuk contoh, size atau color).” critical detail, verbatim dari Google’s properties table: “Reference these variant-identifying properties through their full Schema.org URL.” (terjemahan) “Reference ini variant-identifying properties melalui mereka full Schema.org URL.”

itu berarti:

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

not "variesBy": ["size", "color"]. ini adalah single sebagian besar umum implementation mistake di ini entire topic. What’s documented: Google’s property table memerlukan full URL form — nothing more spesifik daripada itu. What’s not documented: Google doesn’t publish what happens jika Anda skip ini. di my own testing dan consistent dengan lainnya practitioners’ reports, JSON-LD masih passes syntax validation dan nothing errors out, tetapi enhanced grouping perilaku doesn’t trigger — treat itu sebagai sebuah strongly observed pattern, not sebuah official Google statement, dan verify ini terhadap Anda own markup alih-alih taking ini sebagai gospel.

didukung dimensions adalah https://schema.org/color, https://schema.org/size, https://schema.org/suggestedAge, https://schema.org/suggestedGender, https://schema.org/material, dan https://schema.org/pattern.

productGroupID — plain text, dan not item_group_id

productGroupID adalah “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.” (terjemahan) “ identifier dari product group (juga known sebagai parent sku). ini identifier harus menjadi disediakan untuk ProductGroup property atau, alternatively, menggunakan inProductGroupWithID property untuk variants.” ini adalah sebuah plain text identifier — Google’s own contoh adalah "44E01"not sebuah URL. Don’t di atas-generalize variesBy “full schema.org URL” (terjemahan) “full schema.org URL” aturan untuk ini field; mereka’re berbeda aturan untuk berbeda jobs.

One hard constraint: “If you provide the identifier for both the ProductGroup property and its variant Product properties, they must match.” (terjemahan) “jika Anda menyediakan identifier untuk both ProductGroup property dan -nya variant Product properties, mereka harus match.” Google’s docs state requirement tetapi don’t document what happens when ini adalah violated. berdasarkan my own testing (not sebuah documented Google failure mode), sebuah typo atau sebuah template/environment leak itu perubahan nilai pada one variant halaman drops itu variant out dari group dengan no terlihat error — halaman hanya stops menjadi read sebagai bagian dari family. Treat itu sebagai observed perilaku worth verifying yourself, not sebuah official spec.

Two implementation patterns: nested vs. flat

Anda struktur URL decides which pattern Anda gunakan.

Single-halaman situs — nested (hasVariant). semua variants adalah selectable pada one URL (via dropdowns/swatches). “For single-page websites only: The URL (without variant selectors) where the ProductGroup property is located.” (terjemahan) “untuk single-halaman situs web hanya: URL (without variant selectors) where ProductGroup property adalah located.” There’s exactly one canonical URL untuk whole group, dan Anda nest setiap variant Product inside ProductGroup via hasVariant.

Multi-halaman situs — flat (isVariantOf + inProductGroupWithID). setiap variant memiliki -nya own dedicated URL. Here “this doesn’t apply since there is no single canonical URL representing the ProductGroup property.” (terjemahan) “ini doesn’t apply since tidak ada single canonical URL representing ProductGroup property.” setiap halaman harus carry full, self-berisi markup untuk entities defined pada itu halaman — Anda tidak share one block di seluruh halaman. setiap variant Product references -nya parent dengan isVariantOf, dan group tautan adalah carried oleh inProductGroupWithID: “Each product group must have a unique ID in its corresponding structured data markup, specified with the inProductGroupWithID property.” (terjemahan) “setiap product group harus memiliki sebuah unique ID di -nya corresponding data terstruktur markup, specified dengan inProductGroupWithID property.”

Either cara, “Each variant must have a unique ID in its corresponding structured data markup (for example, using the sku or gtin properties).” (terjemahan) “setiap variant harus memiliki sebuah unique ID di -nya corresponding data terstruktur markup (misalnya, menggunakan sku atau gtin properties).”

One more requirement people miss pada multi-halaman setups: variants harus menjadi reachable oleh sebuah distinct, preselectable URL. Google: “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.” (terjemahan) “ situs harus memiliki ability untuk preselect setiap variant directly dengan sebuah distinct URL (menggunakan URL kueri parameters), misalnya undefined” sebuah variant itu hanya appears setelah sebuah client-side click, dengan no URL untuk poin di, dapat’t menjadi validated atau terindeks sebagai -nya own thing.

  • diperlukan pada ProductGroup: hanya name (e.g., "Wool winter coat").
  • Recommended: variesBy, hasVariant, productGroupID, brand, description, aggregateRating, review, hasAdultConsideration, dan (single-halaman situs hanya) url.

Technically hanya name adalah diperlukan — tetapi variesBy dan productGroupID adalah functionally muat-bearing. Skip them dan JSON-LD validates while grouping perilaku Anda wanted tidak pernah menampilkan up. (aggregateRating dan review here adalah yang sama jenis Anda’d gunakan standalone — see AggregateRating dan Review schema deep dives.)

productGroupID vs. Merchant Center’s item_group_id — reconciliation nobody menjelaskan

ini adalah confusion poin itu sebagian besar competitor konten skips entirely, so ini adalah worth menjadi precise.

  • productGroupID adalah sebuah schema.org / pada-halaman data terstruktur field. ini feeds pencarian organik’s understanding dari halaman.
  • item_group_id adalah sebuah Google Merchant Center product-feed attribute. Merchant Center: “Use the item group ID [item_group_id] attribute to group product variants in your product data.” (terjemahan) “gunakan item group ID [item_group_id] attribute untuk group product variants di Anda product data.” ini feeds Shopping ads dan free listings.
Evidence for this claim 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. Scope: product data Confidence: high · Verified: Item group ID [item_group_id]

mereka adalah two separate sistem, dan Google melakukan not automatically sync them. Best practice — dan ini adalah echoed di seluruh better ketiga-party implementation guides — adalah untuk gunakan sama identifier nilai untuk both, so Anda feed dan Anda markup agree pada which SKUs belong together. sebuah mismatch doesn’t necessarily break either sistem outright, tetapi ini menghapus reinforcing signal dan dapat produce inconsistent grouping antara Shopping surfaces dan organic rich hasil.

(sebuah footnote pada casing: Merchant Center’s help sometimes writes productGroupId lowercase-d where Search Central’s docs gunakan productGroupID. itu’s sebuah cosmetic inconsistency di Google’s own docs, not sebuah mistake pada Anda end — ikuti Search Central’s productGroupID di Anda JSON-LD.)

consistency discipline here adalah yang sama one itu governs canonicals dan variant URLs umumnya: Anda signals seharusnya agree dengan setiap lainnya, atau Anda’re handing Google sebuah alasan untuk guess.

Bing melakukan not mendukung ProductGroup

Here’s differentiator sebagian besar guides get wrong atau omit: Bing melakukan not currently consume schema.org ProductGroup markup. Microsoft’s Fabrice Canel, responding directly untuk sebuah pertanyaan tentang whether Bing mendukung schema.org/ProductGroup, said Bing melakukan not yet mendukung ini, tetapi itu ini adalah “on our radar” (terjemahan) “pada kami radar” dan team adalah “closely monitoring its adoption.” (terjemahan) “closely monitoring -nya adoption.” (Reported oleh mesin pencari Roundtable, covering sebuah September 2024 exchange pada X — sebuah secondary report dari sebuah pertama-party statement, not sebuah Microsoft doc, so treat ini sebagai such.)

Bing’s Webmaster alat structured-data help adalah sebuah generic overview dari didukung formats dengan no ProductGroup-, variesBy-, atau productGroupID-spesifik konten. Bing’s Shopping variant grouping runs melalui sebuah feed-side itemGroupId field di Microsoft Advertising — analog dari Google’s item_group_id, not pada-halaman schema. So: implement ProductGroup untuk Google, dan handle Bing Shopping variants melalui Microsoft Advertising feed, not markup.

sebuah note pada dynamic markup

Google’s own caution: “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.” (terjemahan) “menjadi aware itu dynamically-generated markup dapat membuat Shopping melakukan crawl less frequent dan less reliable, which dapat menjadi sebuah issue untuk fast-changing konten like product availability dan price.” jika Anda variant offers/availability adalah JS-injected, weigh itu terhadap server-rendering markup untuk fields itu perubahan sering.

Validate sebelum Anda ship

  • Rich hasil Test — memeriksa eligibility dan surfaces diperlukan-property errors untuk merchant-listing/variant experience.
  • Schema Markup Validator (schema.org) — validates ProductGroup/Product jenis themselves, independent dari Google fitur.
  • Search Console — merchant-listings/product-snippet enhancement reports tampilkan eligibility dan errors di scale post-deploy; pemeriksaan URL menampilkan how sebuah spesifik halaman adalah read.

Remember what “valid” (terjemahan) “valid” melakukan dan doesn’t tell Anda: sebuah plain-string variesBy passes validation dan, di my testing, masih doesn’t trigger grouping. Validation catches syntax dan diperlukan-property gaps, not ini jenis dari semantic failure (which Google doesn’t document either cara) — untuk itu, periksa oleh hand itu Anda variesBy nilai adalah full URLs dan Anda productGroupID matches di seluruh group.

untuk where ini fits bigger picture, see broader data terstruktur dan schema markup hubs ini artikel lives di bawah.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.