Product Schema Markup Specification for AI Shopping Citations
Product structured data is the canonical signal for AI shopping citations across ChatGPT Shopping, Google AI Overviews, Gemini, and Perplexity. The 2026 spec uses schema.org Product, Offer, and AggregateRating, with GS1 GTIN as the preferred identifier; multi-variant catalogs use ProductGroup with hasVariant. AI engines treat the markup as text on the page, so schema must mirror visible content faithfully.
TL;DR
Use schema.org Product for every commerce-intent product page. Choose between the merchant-listing variant (when the user can buy on your page) and the product-snippet variant (when they cannot, e.g. editorial reviews). Include name, image, description, brand, sku, gtin or mpn, an Offer with price/availability, and AggregateRating plus Review when first-party reviews exist. For multi-variant catalogs, use ProductGroup with hasVariant. Keep schema in sync with visible page text and Google Merchant Center feed; the 2026 Merchant Center update enforces image and video attributes that should be reflected on-page.
Two Variants: Merchant Listing vs Product Snippet
Google distinguishes two Product markup classes depending on whether users can purchase on the page (Google Search Central — Merchant listing structured data).
- Merchant listing. The user can buy from this page. Required fields are stricter: Offer.price, Offer.priceCurrency, Offer.availability, plus shipping and return policy. Eligible for shopping knowledge panel, Google Images merchant rich results, popular product results, and ChatGPT Shopping crawls.
- Product snippet. The user cannot buy from this page (editorial review, comparison, third-party listicle). Lighter requirements; emphasis on Review, pros/cons, and aggregateRating rather than transactional fields.
AI shopping assistants extract from both. Editorial product-snippet pages are heavily cited for "best [category]" queries; merchant-listing pages win the buy-now intent.
Required and Recommended Fields
Based on schema.org Product and Offer:
| Field | Type | Merchant listing | Product snippet | Purpose | |
|---|---|---|---|---|---|
| @context | URL | Yes | Yes | https://schema.org | |
| @type | string | Yes | Yes | Product | |
| name | Text | Yes | Yes | Product title | |
| image | ImageObject | URL | Yes (≥1) | Yes | Hero image; 1200x800+ for AI multimodal extraction |
| description | Text | Yes | Yes | 1-2 paragraph product summary | |
| brand | Brand | Organization | Yes | Recommended | Brand entity with name |
| sku | Text | Recommended | Optional | Internal SKU | |
| gtin | Text | URL | Yes (one of gtin/mpn) | Recommended | GS1 GTIN-8/12/13/14 (schema.org/gtin) |
| mpn | Text | Yes (one of gtin/mpn) | Optional | Manufacturer part number | |
| offers | Offer | AggregateOffer | Yes | Optional | Price + availability block |
| aggregateRating | AggregateRating | Recommended | Recommended | Aggregate of first-party reviews (schema.org/AggregateRating) | |
| review | Review[] | Recommended | Yes | First-party reviews | |
| category | Text | URL | Recommended | Recommended | Google product taxonomy category |
| audience | PeopleAudience | Optional | Optional | Apparel sizing, age range | |
| additionalProperty | PropertyValue[] | Optional | Optional | Spec sheet attributes |
For Offer:
| Field | Type | Required (merchant) | Purpose |
|---|---|---|---|
| @type | string | Yes | Offer |
| price | Number | Yes | Numeric price (no currency symbol in value) |
| priceCurrency | Text | Yes | ISO 4217 |
| availability | ItemAvailability | Yes | InStock, OutOfStock, PreOrder, etc. |
| priceValidUntil | Date | Recommended | When price expires |
| url | URL | Recommended | Direct buy URL |
| seller | Organization | Recommended | Selling org |
| shippingDetails | OfferShippingDetails | Recommended | Country, rate, delivery time |
| hasMerchantReturnPolicy | MerchantReturnPolicy | Recommended | Return window and method |
GTIN, MPN, and SKU Identifiers
GTIN is the preferred unique identifier for global commerce (schema.org/gtin, GS1 GTIN reference). The gtin property generalizes the older gtin8/gtin12/gtin13/gtin14 and accepts both the bare numeric string and a GS1 Digital Link URL. Rules:
- Numeric: 8, 12, 13, or 14 digits.
- Must have a valid GS1 check digit.
- No left-padding; do not pad an UPC-12 to 13 with a leading zero outside formal conversion contexts.
- Use mpn when no GTIN is assigned (often DTC private label).
- sku is internal and does not replace gtin/mpn for AI shopping eligibility.
For pages selling third-party products, mirror the manufacturer GTIN, not your own SKU.
Minimum Compliant Example
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Acme Standing Desk 60\" Walnut",
"image": ["https://example.com/desk-hero.jpg"],
"description": "Electric height-adjustable standing desk with 60-inch walnut top.",
"brand": { "@type": "Brand", "name": "Acme" },
"sku": "ACME-DESK-60-WAL",
"gtin": "0860001234567",
"offers": {
"@type": "Offer",
"url": "https://example.com/p/acme-desk-60-walnut",
"price": "599.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "328",
"bestRating": "5",
"worstRating": "1"
}
}Multi-Variant Pattern with ProductGroup
For catalogs where one parent product has many SKUs (sizes, colors), use schema.org ProductGroup with hasVariant.
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "Acme Standing Desk",
"description": "Electric height-adjustable standing desk.",
"productGroupID": "ACME-DESK",
"variesBy": ["https://schema.org/color", "https://schema.org/width"],
"hasVariant": [
{
"@type": "Product",
"name": "Acme Standing Desk 60\" Walnut",
"sku": "ACME-DESK-60-WAL",
"gtin": "0860001234567",
"color": "Walnut",
"width": { "@type": "QuantitativeValue", "value": "60", "unitCode": "INH" },
"offers": { "@type": "Offer", "price": "599.00", "priceCurrency": "USD", "availability": "https://schema.org/InStock" }
},
{
"@type": "Product",
"name": "Acme Standing Desk 72\" Walnut",
"sku": "ACME-DESK-72-WAL",
"gtin": "0860001234574",
"color": "Walnut",
"width": { "@type": "QuantitativeValue", "value": "72", "unitCode": "INH" },
"offers": { "@type": "Offer", "price": "699.00", "priceCurrency": "USD", "availability": "https://schema.org/InStock" }
}
]
}Reviews and AggregateRating
- aggregateRating.ratingValue must match the visible average on the page.
- aggregateRating.reviewCount must match the visible review count.
- Use only first-party reviews you collected with disclosure; do not import third-party aggregations into aggregateRating.
- Include 2-5 individual Review items so AI engines can extract specific quotes.
- Review.author should be a Person with a real name, not a generic placeholder.
Adding aggregateRating for a value not visible on the page is a Google AI features compliance violation and a frequent cause of rich-result loss.
Google Merchant Center Alignment (2026)
The 2026 Merchant Center product data specification update added product-level shipping controls, a new [video_link] attribute (quality checks begin June 30, 2026), and image-resolution warnings ahead of January 31, 2027 enforcement (Google Merchant Center 2026 update help center). Recommendations:
- Submit the same product data via Merchant Center feed and on-page schema; mismatch flags Quality Issues that propagate to AI Overviews shopping eligibility.
- Add product video to both [video_link] feed attribute and a VideoObject reference on the product page.
- Render images at minimum 500x500 today; plan for higher minimum by Jan 2027.
- Reflect handling cutoff time and minimum order value at the product level if you submit them in the feed.
Five Real-World Examples
- DTC apparel. ProductGroup parent + hasVariant per size/color; audience carries sizing system; first-party reviews drive aggregateRating.
- Single-SKU specialty product. Flat Product with full Offer, aggregateRating, and MerchantReturnPolicy.
- Editorial "best of" comparison. Product markup per featured product (product-snippet variant) without merchant-listing fields; emphasize review and aggregateRating for each.
- Subscription box plan page. Product with subscription Offer (priceSpecification, eligibleQuantity); separate plan tiers as hasVariant on a ProductGroup.
- Marketplace listing. AggregateOffer summarizing many seller offers; individual Offers in offers[] with seller Organization references.
Validator Quirks
- Offer.price as string vs number. Both validate; use string when including decimals ("599.00") to avoid floating-point representation surprises.
- availability URL form. Use full URLs like https://schema.org/InStock, not bare strings. Some validators tolerate the bare form; AI extractors are inconsistent.
- Multiple gtin types in same record. Use the generic gtin field; do not also set gtin13/gtin14.
- Missing brand. Validators warn rather than fail; AI engines down-rank brand-less products.
- Schema for products that are out of stock or not yet released. Set availability accurately (OutOfStock, PreOrder, BackOrder); do not omit the offer.
- Mismatch with on-page price. Hard fail in Google's pipeline; use server-side rendering of price in both schema and visible HTML.
Common Mistakes
- Importing third-party reviews into aggregateRating without disclosure.
- Padding GTIN with leading zeros incorrectly (UPC-12 to GTIN-13 rules vary; verify check digit).
- Using sku as the unique identifier when GTIN is available.
- Listing variants as separate top-level Product records instead of ProductGroup hasVariant.
- Forgetting priceValidUntil; AI engines treat unbounded prices as stale.
- Schema present but visible price hidden behind JS hydration that delays beyond the AI crawler render budget. Server-render the price.
- Putting Product schema on category pages without ItemList; Google has explicitly required ItemList wrapping for category-level Product markup historically.
FAQ
Q: Do I need both Product schema and a Merchant Center feed?
For AI shopping citations across ChatGPT, Gemini, and Google AI Overviews, both. The feed handles paid Shopping eligibility and Merchant Center quality validation; the page-level schema handles organic AI extraction. Keep them consistent.
Q: Should editorial review pages use merchant-listing or product-snippet markup?
Product-snippet. Merchant-listing requires fields that imply user can purchase on this page; misusing it on editorial pages produces validation issues and disqualifies the page from rich results.
Q: How does ChatGPT Shopping specifically use Product schema?
ChatGPT Shopping crawls with OAI-SearchBot and consumes Product schema as one of its selection factors alongside on-page text, reviews, and price (WebFX ChatGPT Shopping guide, Practical Ecommerce on ChatGPT Shopping schema). Detailed multi-facet schema increases recommendation likelihood.
Q: Do I need GTIN if I sell private-label DTC?
Use mpn instead of gtin for private-label products that lack a GS1 GTIN. Either is acceptable as the unique identifier requirement.
Q: How do I handle subscription pricing?
Use a Product with an Offer whose priceSpecification is a UnitPriceSpecification with unitCode and referenceQuantity. Provide separate Offers for each cadence (monthly, annual) or use hasVariant on a ProductGroup.
Q: What about used or refurbished items?
Set Offer.itemCondition to one of NewCondition, RefurbishedCondition, UsedCondition, or DamagedCondition. AI shopping assistants surface condition in answers.
Q: Do I include both first-party and review-platform aggregate ratings?
Use first-party only in aggregateRating for the product. Reference review-platform aggregates separately under subjectOf or in body text; merging them blurs attribution and creates compliance issues.
Q: What should I do for out-of-stock products?
Keep the Product and Offer markup with availability: OutOfStock. Removing the page or markup confuses AI extractors. If discontinued permanently, use availability: Discontinued.
Related Articles
BreadcrumbList Schema Specification for AI Search Citation Context
BreadcrumbList schema specification: required fields, position ordering, and how AI engines use breadcrumb structured data to disambiguate citations.
HowTo Schema Specification for AI Search
HowTo schema specification for AI search: required and recommended fields, step markup patterns, image rules, post-deprecation usage, and validator quirks.
Organization Schema Specification for AI Brand Citations
Organization schema specification for AI brand citations: required fields, sameAs entity linking, logo, ContactPoint, and how LLMs verify brand identity.