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.

TL;DR Add 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

Shopify default (no AR signal)
{
  "@type": "Product",
  "name": "Accent Chair",
  "image": "chair.jpg",
  "offers": {
    "@type": "Offer",
    "price": "349.00"
  }
  // model-viewer embed exists
  // but not in structured data
}
With 3D model 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

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.

Related Resources