Product Variant Data for AI Search: Size, Color, and the Right SKU
The Recommendation Is a SKU, Not a Product
When a shopper asks an AI assistant for "a waterproof shell jacket in men's large, under $250," the useful answer is not a product page. It is a specific variant that exists, is in stock, is the right size, and costs what the assistant says it costs.
This is where a lot of otherwise well-optimized catalogs fall apart. Stores invest in product schema and clean descriptions at the parent-product level, then leave variant data implicit — buried in a dropdown that only renders after a shopper clicks. A model reading that page sees one product with one price and no reliable way to know that the large is sold out and the XL costs $30 more.
As AI shopping moves from suggestion to transaction, variant-level accuracy stops being a nice-to-have. An agent that adds the wrong SKU to a cart creates a return, a refund, or a failed checkout — and the store that caused it becomes a less reliable source.
What Breaks at the Variant Level
Four failure patterns account for most variant confusion:
- Options exist only in JavaScript. The size and color selectors populate client-side. AI crawlers that do not execute JavaScript see a single price and one availability state.
- Every variant is a separate, ungrouped product. The catalog exports twelve near-identical items with no signal that they are one garment in four colors and three sizes. Models treat them as competing products and often pick arbitrarily.
- Variant-specific price and stock are not exposed. The page shows a "from" price. The model quotes the lowest number regardless of which variant the shopper actually wants.
- Variant URLs contradict the canonical. Query-string variant URLs are crawled, indexed inconsistently, or canonicalized in a way that strips the very detail the shopper asked for.
The fix is the same in each case: make variant relationships and variant-level facts explicit in machine-readable form, not just in the interactive UI.
Use ProductGroup and hasVariant
Google added structured data support for product variants in February 2024, introducing the ProductGroup type alongside Product. The pattern is straightforward:
ProductGrouprepresents the parent — the jacket itself. It holds properties shared across variants: brand, description, aggregate review data, andproductGroupID(your parent SKU).variesBydeclares which properties differentiate the variants. Google supports specific schema.org URIs here, includinghttps://schema.org/color,https://schema.org/size,https://schema.org/material,https://schema.org/pattern,https://schema.org/suggestedAge, andhttps://schema.org/suggestedGender.hasVariantnests each childProduct, carrying its own SKU, GTIN, price, availability, and the variant-defining values.isVariantOfdoes the inverse on a childProduct, pointing back to its group. This is the property to use when each variant has its own distinct URL.
Two practical rules follow from this. First, do not duplicate shared data on every child — put brand and reviews on the group and let the variants inherit. Second, every child variant needs its own identifier and its own offer. A variant without a distinct price and availability is not really marked up as a variant.
If your platform generates a single flat Product block per page, this is the highest-value schema upgrade available to a catalog with options. On Shopify, variant attributes that do not map to a native field belong in metafields so they can be templated into JSON-LD consistently.
Group Variants Correctly in Your Feed
Structured data covers the crawl path. Feeds cover the ingestion path — Google Merchant Center, and increasingly the same catalog format used by AI shopping surfaces.
The core attribute is item_group_id. Every variant of the same product must share the same value. Google's documentation is explicit that variants are products differing only by details like color and size for apparel, or memory, display size, processor, and graphics options for electronics — and that each variant is submitted as its own item with the shared group ID.
Beyond grouping, get the differentiating attributes right:
- Submit
sizefor any product that varies by size, andcolorfor any product that varies by color, on every variant in the group. - As of May 2026, Google supports a
variant_optionattribute that explicitly identifies which properties are variant-determining. Google recommends providing color through bothvariant_optionand thecolorattribute when color is what distinguishes the variants. - Keep
gtinandmpnvariant-specific. A shared identifier across sizes tells downstream systems these are the same physical item, which they are not. - Use
item_group_titlewhere supported so the family has a clean name independent of any single variant's title.
Because several AI shopping surfaces accept the same structured catalog format retailers already send to Google, a well-grouped Merchant Center feed is usually the fastest path to variant-accurate representation elsewhere. That overlap is covered in more depth in The OpenAI Product Feed.
Fix Variant URLs and Canonicals
The URL layer is where variant intent gets lost. A workable pattern for most stores:
- Keep one canonical for the parent product page — normally the URL with no variant preselected.
- Make every variant preselectable via a distinct URL, typically a query parameter. Loading that URL must render the correct price, availability, image, and identifier server-side.
- Do not let the variant URL render parent-level defaults. If
?variant=changes nothing in the initial HTML, the URL is decorative and provides no signal. - Never canonicalize a variant URL to an unrelated product or to a collection page. That is a stronger negative signal than having no variant URLs at all.
Test this the way a crawler experiences it: fetch a variant URL with JavaScript disabled and confirm the price, stock status, and SKU in the raw HTML match what a shopper would see.
Write Variant Attributes for Humans Too
Models reason over text as well as markup. A size chart rendered as an image gives a language model nothing. The same chart as an HTML table with explicit measurements — chest, sleeve, inseam, in both centimeters and inches — is directly quotable.
The same applies to the vocabulary you use. "Forest," "moss," and "olive" are fine as merchandising names, but pair each with a plain color value a model can match to a shopper asking for green. Fit language deserves the same treatment: state whether an item runs true to size, and say what body measurements a size corresponds to rather than only what size label it carries.
For apparel and footwear especially, fit and sizing questions are among the most common things shoppers ask assistants. Answering them in structured FAQ content on the product page turns a common objection into citable material.
A Practical Audit
Pick your ten highest-revenue products with options and check each:
- Parent page emits
ProductGroupwithproductGroupIDand a correctvariesBy - Every variant appears as a child
Productwith its own SKU, GTIN, price, and availability - Feed items share one
item_group_idper family, with variant-specificsize,color, and identifiers - Variant URLs render correct server-side price and stock with JavaScript disabled
- Size charts and fit guidance exist as text, not images
- Out-of-stock variants report
OutOfStockrather than silently disappearing
Variant data is unglamorous work, and it is exactly the kind of detail that separates a catalog an agent can transact against from one it has to guess about. If you want a structured read on where your catalog stands, that is what an AI visibility audit is for, and product optimization is where the fixes get implemented.
Want to see how AI engines perceive your brand?
Get Your Free AI Visibility Audit