Optimization Guide
Shopify AR and 3D Model Structured Data for AI Shopping Agents
AI shopping agents answer "furniture you can see in your room," "virtual try-on sunglasses," and "3D preview sneakers" by reading structured data — not by detecting a model-viewer embed on your page. Shopify's default JSON-LD includes zero AR or 3D model signals, making your immersive product experiences invisible to every AI shopping index.
has3DModel to your Product JSON-LD linking to a 3DModel object with contentUrl (GLB for web/Android, USDZ for iOS). Add additionalProperty: arAvailable: true to the Offer for AR capability signaling. Shopify stores 3D model files at product.metafields.shopify.model3d — use this URL directly in your contentUrl. Deploy via product.liquid with a null-guard on the metafield value.
The AR Visibility Gap
Augmented reality has become a meaningful purchase-driver for high-consideration product categories. Furniture, footwear, eyewear, consumer electronics, and home décor see measurable conversion lifts (Shopify reports average 94% conversion improvement for AR-enabled products) when shoppers can visualize products in their own space. Yet the structured data signals that would make AR-capable products discoverable to AI shopping agents are entirely absent from the default Shopify product JSON-LD.
When an AI shopping agent receives a query like "living room sofas I can see in my apartment before buying," it does not detect the <model-viewer> element on your page. It reads has3DModel on the Product type. Without this signal, your AR-enabled products are returned only in generic product searches — not in the growing segment of experience-first queries that specifically seek immersive preview capability.
AR and 3D model query types requiring structured data
| Query type | Example | Required signal | AI shopping behavior |
|---|---|---|---|
| AR room visualization | "sofas I can see in my room with AR" | has3DModel + arAvailable: true |
Filters results to products with AR placement capability |
| Virtual try-on | "virtual try-on sunglasses online" | has3DModel + arPlatform: web additionalProperty |
Surfaces products with face/body AR try-on models |
| 3D model preview | "3D preview sneakers before I buy" | has3DModel with encodingFormat: model/gltf-binary |
Identifies products with interactive 3D rotation capability |
| Apple Vision Pro compatible | "Vision Pro compatible furniture AR" | has3DModel with USDZ encodingFormat |
Filters products with Apple spatial computing AR support (USDZ format) |
| Scale visualization | "desk lamp see actual size before buying" | has3DModel + width/height/depth on Product |
Combines 3D model with dimension data for real-scale AR placement |
Shopify default vs. AR-complete JSON-LD
{
"@type": "Product",
"name": "Accent Chair",
"image": "chair.jpg",
"offers": {
"@type": "Offer",
"price": "349.00"
}
// model-viewer embed exists
// but not in structured data
}
{
"@type": "Product",
"name": "Accent Chair",
"has3DModel": {
"@type": "3DModel",
"contentUrl":
"https://cdn.shopify.com/
...chair.glb",
"encodingFormat":
"model/gltf-binary"
}
}
3D Model JSON-LD Patterns
Minimum viable — single GLB model for web AR
The most common case: you have a GLB file uploaded to Shopify's 3D model feature. This signals AR capability to web-based AI shopping agents and Google's Shopping Graph:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Scandinavian Lounge Chair",
"image": "https://cdn.shopify.com/s/files/1/0001/chair.jpg",
"has3DModel": {
"@type": "3DModel",
"name": "Scandinavian Lounge Chair — 3D Model",
"contentUrl": "https://cdn.shopify.com/s/files/1/0001/chair.glb",
"encodingFormat": "model/gltf-binary",
"description": "Interactive 3D model — place in your room with AR on Android or view in browser"
},
"offers": {
"@type": "Offer",
"price": "649.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "arAvailable",
"name": "AR available",
"value": "true"
}
]
}
}
Dual format — GLB for Android/web + USDZ for iOS AR
To cover both iOS AR Quick Look (Apple Vision Pro, iPhone, iPad) and Android WebXR, declare two 3DModel objects in a has3DModel array. Use the correct MIME type for each format:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Ceramic Table Lamp — Medium",
"has3DModel": [
{
"@type": "3DModel",
"name": "Ceramic Table Lamp — GLB (Android/Web)",
"contentUrl": "https://cdn.shopify.com/s/files/1/0001/lamp.glb",
"encodingFormat": "model/gltf-binary"
},
{
"@type": "3DModel",
"name": "Ceramic Table Lamp — USDZ (iOS AR Quick Look)",
"contentUrl": "https://cdn.shopify.com/s/files/1/0001/lamp.usdz",
"encodingFormat": "model/vnd.usdz+zip"
}
],
"offers": {
"@type": "Offer",
"price": "128.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "arAvailable",
"value": "true"
},
{
"@type": "PropertyValue",
"propertyID": "arPlatform",
"name": "AR platforms supported",
"value": "iOS Quick Look, Android WebXR, Web model-viewer"
}
]
}
}
Variant-specific 3D models with ProductGroup
For products where each color variant has its own 3D model file (common for furniture, footwear, and accessories), add has3DModel to each hasVariant child Product rather than the parent ProductGroup:
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "Minimalist Desk Lamp",
"productGroupID": "desk-lamp-001",
"hasVariant": [
{
"@type": "Product",
"name": "Minimalist Desk Lamp — Matte Black",
"sku": "LAMP-MBK",
"color": "Matte Black",
"has3DModel": {
"@type": "3DModel",
"contentUrl": "https://cdn.shopify.com/s/files/1/0001/lamp-black.glb",
"encodingFormat": "model/gltf-binary"
},
"offers": {
"@type": "Offer",
"price": "89.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"name": "Minimalist Desk Lamp — Brushed Gold",
"sku": "LAMP-GLD",
"color": "Brushed Gold",
"has3DModel": {
"@type": "3DModel",
"contentUrl": "https://cdn.shopify.com/s/files/1/0001/lamp-gold.glb",
"encodingFormat": "model/gltf-binary"
},
"offers": {
"@type": "Offer",
"price": "99.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
]
}
Shopify Liquid implementation
Shopify stores the 3D model GLB URL in product.metafields.shopify.model3d when you upload a model via the admin. For USDZ, the URL pattern appends ?format=usdz to the GLB URL. Use a null-guard before injecting the has3DModel block:
{% comment %}3D model / AR structured data — driven by Shopify's native model3d metafield{% endcomment %}
{% assign model_glb = product.metafields.shopify.model3d.value %}
{% if model_glb != blank %}
"has3DModel": [
{
"@type": "3DModel",
"name": {{ product.title | append: ' — 3D Model (GLB)' | json }},
"contentUrl": {{ model_glb | json }},
"encodingFormat": "model/gltf-binary"
},
{
"@type": "3DModel",
"name": {{ product.title | append: ' — 3D Model (USDZ / iOS AR)' | json }},
"contentUrl": {{ model_glb | append: '?format=usdz' | json }},
"encodingFormat": "model/vnd.usdz+zip"
}
],
{% endif %}
AR format reference
| Format | MIME type | Platform | Use case |
|---|---|---|---|
| GLB (binary glTF 2.0) | model/gltf-binary |
Android WebXR, web model-viewer, Google AR | Primary format for cross-platform web AR and Google Shopping Graph |
| USDZ (Universal Scene Description) | model/vnd.usdz+zip |
iOS AR Quick Look, iPadOS, Apple Vision Pro | Required for native Apple device AR — activates Quick Look directly from Safari product page |
| GLTF (text glTF) | model/gltf+json |
Web, some AR viewers | Not recommended — multiple files make CDN caching complex; prefer self-contained GLB |
| OBJ + MTL | model/obj |
Legacy desktop 3D viewers | Not supported natively by mobile AR — convert to GLB/USDZ for Shopify AR |
Common Mistakes
1. Relying on the model-viewer embed without JSON-LD
The <model-viewer> web component renders an interactive 3D viewer on your product page, but it is a JavaScript component — not structured data. AI shopping agent crawlers (GPTBot, PerplexityBot, ClaudeBot) do not execute JavaScript during indexing. They cannot detect <model-viewer> as an AR availability signal. You must add has3DModel to your JSON-LD separately.
2. Missing the null-guard on Shopify's model3d metafield
If your product.liquid outputs a has3DModel block for all products but only some have 3D models uploaded, products without a model will emit an empty or null contentUrl. An empty contentUrl in a 3DModel object is a schema validation error. Always check {% if product.metafields.shopify.model3d.value != blank %} before injecting the block.
3. Using the wrong MIME type for the format
Using model/gltf-binary (the GLB MIME type) for a USDZ file URL, or vice versa, causes format detection failures in AI agent parsers. Apple's Quick Look and Android WebXR both inspect encodingFormat to determine if they can handle the file before fetching it. Always pair the correct MIME type with the correct file extension: GLB → model/gltf-binary, USDZ → model/vnd.usdz+zip.
4. Placing has3DModel on the ProductGroup instead of each variant
When different color or material variants have different 3D models, placing a single has3DModel on the parent ProductGroup is ambiguous — AI agents cannot know which model corresponds to which variant. Place has3DModel on each individual variant Product in the hasVariant array to maintain variant-level AR model accuracy.
5. Omitting dimension data alongside the 3D model
The most impactful use of AR for furniture and home décor is scale visualization — "will this fit in my room?" Declaring has3DModel without also providing width, height, and depth as QuantitativeValue properties on the Product means AI agents cannot answer scale queries even though your 3D model exists. Pair 3D model signals with accurate dimension structured data for maximum AR query coverage.
Implementation Checklist
- Upload GLB files for all AR-capable products using Shopify Admin → Products → Media → Add 3D model
- Add
has3DModelto theProductJSON-LD inproduct.liquidwithcontentUrlfromproduct.metafields.shopify.model3d.value - Include both GLB (
model/gltf-binary) and USDZ (model/vnd.usdz+zip) 3DModel objects in ahas3DModelarray for iOS + Android coverage - Add
additionalProperty: arAvailable: trueto the productOffer - Guard the entire
has3DModelblock with a null check on the Shopify model3d metafield value - For variants with distinct 3D models, attach
has3DModelto eachhasVariantchild Product - Add
width,height,depthQuantitativeValue properties for scale-aware AR queries - Add
arPlatformadditionalProperty listing which AR modes are supported - Run CatalogScan to verify 3D model signals appear in your AI readiness report
Frequently Asked Questions
How do I mark up 3D models and AR availability in Shopify product JSON-LD?
Use the has3DModel property on the Product type, linking to a 3DModel object (a subtype of MediaObject). Include contentUrl pointing to the hosted model file — GLB for web/Android AR, USDZ for iOS AR Quick Look. Shopify stores your uploaded 3D model URL in product.metafields.shopify.model3d.value. Inject conditionally in product.liquid with a null-guard on the metafield value.
What 3D model file formats should I use for Shopify AR?
Two formats: GLB (model/gltf-binary) for Android WebXR and web model-viewer, and USDZ (model/vnd.usdz+zip) for iOS AR Quick Look and Apple Vision Pro. Shopify's native AR feature uses both. Upload a GLB via the Admin; Shopify auto-converts to USDZ. In your JSON-LD, declare both in a has3DModel array — one object per format with the correct encodingFormat MIME type.
Does Shopify include AR or 3D model signals in its default product JSON-LD?
No. Even if you upload 3D models and have AR enabled in your theme, Shopify's default JSON-LD outputs a basic Product with price, availability, and images only — no has3DModel, no AR signals. AI shopping agents cannot detect AR capability from the <model-viewer> JavaScript component. You must add has3DModel manually to product.liquid.
Which AI shopping agents use 3D model and AR structured data?
Google's Shopping Graph (powering Google AI Mode and Google Lens product search) is the most active consumer of has3DModel structured data — Google has documented Product 3DModel support in their rich results specifications. Apple's Spotlight product search and Siri product queries index USDZ has3DModel signals. ChatGPT Shopping and Perplexity Commerce weight AR availability as a product differentiator in recommendation results for high-consideration product categories.
How do I add an AR model viewer embed alongside the structured data?
Use Google's <model-viewer> web component in your product template for the visible human-facing AR experience. Add src for the GLB, ios-src for USDZ, and the ar and ar-modes="webxr scene-viewer quick-look" attributes. The <model-viewer> component handles platform detection automatically. The JSON-LD has3DModel and the <model-viewer> embed serve different purposes: JSON-LD is for AI agent indexing, the embed is for human AR interaction.