Structured Data Guide
Shopify Product Bundle Structured Data
JSON-LD patterns for representing Shopify product bundles so AI shopping agents can correctly recommend them for bundle-specific queries, communicate bundle savings, and link bundle components to the parent bundle listing.
Product block with a bundle-explicit title ("3-Piece Set", "Starter Kit"), include isRelatedTo links to component product pages, and use UnitPriceSpecification in priceSpecification to show bundle vs. list price. AI agents read the component links to understand what's in the bundle and communicate value to users.
How AI Agents Interpret Bundle Products
AI shopping agents have four signals they use to identify and recommend bundle products:
| Signal | Where they read it | What they extract |
|---|---|---|
| Bundle-explicit title | JSON-LD name, <h1> |
Quantity + category: "3-Piece", "Starter Kit", "Complete Set", "Duo" |
| Description with component list | JSON-LD description, product body |
Named components ("Includes: Cleanser 150ml, Toner 100ml, Serum 30ml") |
| Component links | JSON-LD isRelatedTo / hasPart |
Structured links to individual component product pages |
| Bundle pricing signal | JSON-LD priceSpecification |
Bundle price vs. component sum; savings amount or percentage |
The most common failure mode is a bundle product with a generic title like "Bundle" or "Gift Set" that contains no component names and no savings signal. These listings are near-invisible to AI agents because there is no way to match them to specific bundle queries ("cleanser and toner set", "skincare starter kit for dry skin").
Pattern 1: Standard Product with Bundle-Optimized Title and Description
The baseline approach — and the one that works across all Shopify themes without custom development:
Title formula for bundles
[Quantity]-[Product Category] [Bundle Qualifier]: [Component 1] + [Component 2] [+ Component 3]
Examples:
- "3-Piece Skincare Starter Set: Cleanser + Toner + Vitamin C Serum"
- "Camping Essentials Kit: Tent + Sleeping Bag + Headlamp"
- "Home Office Productivity Bundle: Standing Desk Mat + Cable Organizer + Monitor Stand"
Description format for components
AI agents parse bulleted component lists out of product descriptions. Structure your bundle description with an explicit "Includes:" section:
Includes: • Gentle Foaming Cleanser (150ml) — removes impurities without stripping moisture • Balancing Hydration Toner (100ml) — preps skin for serum absorption • 15% Vitamin C Brightening Serum (30ml) — targets dark spots and uneven tone Each item is also available individually. Bundle saves $22 vs. buying separately.
The "also available individually" line with a savings statement directly improves AI recommendation quality — agents can relay the savings as part of their recommendation text.
Pattern 2: JSON-LD with isRelatedTo Component Links
The isRelatedTo property on a schema.org Product allows you to link from the bundle to its component products. AI agents that understand this relationship can match bundle-component queries to the parent bundle.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "3-Piece Skincare Starter Set",
"description": "Cleanser, toner, and vitamin C serum bundled for complete morning routine. Saves $22 vs. buying each item separately.",
"sku": "BUNDLE-SKIN-001",
"image": "https://yourstore.com/products/skincare-starter-set.jpg",
"isRelatedTo": [
{
"@type": "Product",
"name": "Gentle Foaming Cleanser 150ml",
"url": "https://yourstore.com/products/gentle-foaming-cleanser",
"sku": "SKN-CLEAN-150"
},
{
"@type": "Product",
"name": "Balancing Hydration Toner 100ml",
"url": "https://yourstore.com/products/balancing-hydration-toner",
"sku": "SKN-TONER-100"
},
{
"@type": "Product",
"name": "15% Vitamin C Brightening Serum 30ml",
"url": "https://yourstore.com/products/vitamin-c-brightening-serum",
"sku": "SKN-VIT-C-30"
}
],
"offers": {
"@type": "Offer",
"price": "78.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://yourstore.com/products/skincare-starter-set",
"priceSpecification": [
{
"@type": "UnitPriceSpecification",
"price": "78.00",
"priceCurrency": "USD",
"priceType": "https://schema.org/SalePrice"
},
{
"@type": "UnitPriceSpecification",
"price": "100.00",
"priceCurrency": "USD",
"priceType": "https://schema.org/ListPrice"
}
]
}
}
The priceSpecification array with both SalePrice (bundle price) and ListPrice (component sum) is the structured way to communicate bundle savings. ChatGPT Shopping and Google AI Mode use this to surface "save $22" language in recommendations.
Pattern 3: Bundle as ItemList (for Curated Gift Sets)
If your bundle is a curated gift set where the selection itself is the product (rather than a discount bundle), use ItemList as a secondary block alongside the Product:
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "Holiday Skincare Gift Set — Contents",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"item": {
"@type": "Product",
"name": "Gentle Foaming Cleanser 150ml",
"url": "https://yourstore.com/products/gentle-foaming-cleanser"
}
},
{
"@type": "ListItem",
"position": 2,
"item": {
"@type": "Product",
"name": "Balancing Hydration Toner 100ml",
"url": "https://yourstore.com/products/balancing-hydration-toner"
}
}
]
}
Use ItemList when the bundle is marketed primarily as a curated selection (gift set, discovery kit) rather than a price discount. isRelatedTo works better for discount bundles where the savings narrative is primary.
Bundle Structured Data Pitfalls
| Pitfall | Impact | Fix |
|---|---|---|
| Generic bundle title ("Bundle", "Set", "Kit" with no category) | Agent can't match to category-specific bundle queries | Add category noun and component count: "3-Piece Skincare Set" |
| Bundle price = component sum (no savings) | Agent presents as no-benefit bundle; lower recommendation rate | Add ListPrice in priceSpecification to show the vs-separate price |
| No component links in JSON-LD | Agent can't understand what's inside; can't match component-specific queries to bundle | Add isRelatedTo with URL for each component's individual product page |
| Bundle out-of-stock but components available | Agent recommends bundle; visitor lands on out-of-stock page | Set availability: OutOfStock on the bundle Offer when any required component is out of stock |
| Bundle components have conflicting availability | Bundle appears available but checkout fails | Use Shopify inventory tracking at the variant level; sync bundle availability via metafield |
Bundle Structured Data Checklist
| # | Check | Priority |
|---|---|---|
| 1 | Bundle title includes quantity, category, and key component names | Critical |
| 2 | Description includes explicit "Includes:" component list with quantities | Critical |
| 3 | JSON-LD isRelatedTo links to each component's individual product URL |
High |
| 4 | priceSpecification includes both bundle (SalePrice) and component-sum (ListPrice) |
High |
| 5 | Bundle availability reflects all component stock states (out of stock if any required component is unavailable) | High |
| 6 | Bundle SKU is distinct from any component SKU | Medium |
| 7 | Component products individually link back to the bundle using isRelatedTo or "Available in bundle" section |
Medium |
Related Resources
- Shopify Product Bundles for AI Shopping Agents — broader guide on bundle visibility strategy, discovery patterns, and catalog architecture.
- Shopify Schema Markup Guide — full JSON-LD reference for Product, Offer, priceSpecification, and related types.
- Ecommerce Structured Data Errors Fix — common JSON-LD mistakes in bundle markup and how to correct them.
- AI Shopping Agent Product Ranking Factors — how bundle signals fit in the full 18-signal ranking model.
Frequently Asked Questions
How should I represent bundle pricing in schema.org JSON-LD?
Set the bundle product's Offer.price to the bundle price (not the sum of components), and include a priceSpecification block showing the bundle savings. Use schema.org UnitPriceSpecification with priceType set to https://schema.org/ListPrice for the component sum and SalePrice for the bundle discount price. AI agents use this to communicate bundle value in recommendations ("save $22 when bought as a set").
What is the difference between isRelatedTo and ItemList for bundles?
isRelatedTo is a property on Product that links the bundle to its component products — best for discount bundles where the savings narrative is primary. ItemList is a standalone block that enumerates items in a curated set — best for gift sets or discovery kits where the curation itself is the value proposition. Both approaches are valid; choose based on whether your bundle is primarily a price offer or a curated selection.
Can ChatGPT Shopping recommend Shopify bundle products?
Yes. ChatGPT Shopping can recommend bundle products if the bundle has a clean product title that includes the bundle framing ("3-Piece Skincare Set", "Starter Kit"), a single Offer with the bundle price and availability, and a description that enumerates the components. The key failure mode for bundles is a vague title like "Bundle" or "Set" that lacks the component context agents need to match to specific bundle queries.
Should each bundle component also have its own product page for SEO?
Yes, if the components are sold individually as well. Having separate product pages for each component, linked from the bundle page via isRelatedTo in JSON-LD, allows AI agents to recommend either the bundle or individual items depending on query context. A query for "face serum" might land on the individual serum page; a query for "complete skincare routine starter kit" lands on the bundle. Without the link structure, agents can't make the connection between the components and the bundle.
Audit Your Bundle Structured Data
CatalogScan scans your bundle products for generic titles, missing component links in JSON-LD, absent price savings signals, and availability mismatches — then ranks the issues by impact on AI shopping agent recommendation rates.
Scan your store free