A founder-voice guide to the three ways to embed a 3D model on a Shopify or DTC product page: model-viewer, iframe app, or custom Three.js. Which fits which build.

If you sell a premium product on Shopify and you want to put a 3D model on the PDP, there are exactly three architectures to choose from. Each fits a different timeline and a different level of integration with the rest of the page. Picking the wrong one means either shipping fast and rebuilding later, or building slow and shipping nothing. This guide covers the three options and the buyer-flow question that decides between them.
The three architectures are Google's <model-viewer> web component dropped into the page HTML, a third-party 3D viewer app loaded via iframe (Shopify-native viewers like Arty, LEVAR, Cappasity, and Magic 360 use this pattern), and a custom Three.js component built into your stack and rendered inline. The web component is fastest to ship; the iframe is fastest to swap; the custom component is the only one that lets the rest of the page react to what the buyer does inside the viewer. Pick the one that fits the build constraint your store actually has.
The decision question is not which technology is best. It is whether the viewer is a feature on the page or a layer that talks to the rest of the page.
Google's is a self-contained web component built on Three.js under the hood. The setup is two files and one custom element:
<script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/4/model-viewer.min.js"></script>
<model-viewer
src="https://cdn.example.com/product.glb"
ios-src="https://cdn.example.com/product.usdz"
poster="https://cdn.example.com/product.webp"
alt="Product"
ar
ar-modes="webxr scene-viewer quick-look"
camera-controls
auto-rotate>
</model-viewer>
That ships rotate, zoom, AR placement, a poster fallback, and a default loading state. iOS Quick Look handles the AR step on iOS via the USDZ; Android Scene Viewer handles it on Android via the GLB.
Right for. Stores that want the rotate-and-AR experience and nothing else. Stores with a small product range and a fixed PDP template. Stores where the team does not own a frontend developer who can maintain a Three.js component.
Not right for. Stores where the rest of the page has to know what the buyer did in the viewer. The viewer is a black box from the rest of the page's perspective. Events are limited; reading the camera state from outside the component is awkward.
Time to ship. A weekend for a single product. A week to roll across a Shopify catalog with a theme template change.
The Shopify-native 3D viewer apps (Arty, LEVAR, Cappasity, Magic 360) all run the same way under the hood: a small script the theme adds, which then injects an iframe pointing at the app's hosted viewer. The model lives in the app's CDN; the page passes a product id and the iframe handles the rest.
Right for. Stores that want a managed solution: someone else handles the viewer code, the AR setup, the analytics. Stores that want to test 3D on one product before committing to a build. Stores with a non-technical merchandiser who needs to upload models without touching the theme.
Not right for. Stores where the viewer has to integrate with the rest of the page. The iframe is a hard boundary. The page cannot read the viewer's state; the viewer cannot read the page's state. Postmessage events bridge some of this but not enough for a deep buyer flow.
Time to ship. Same day for a single product. A week to roll across the catalog.
The honest comparison of 3D viewer apps for premium Shopify stores covers which iframe-based app fits which category.
Build the viewer yourself in Three.js, render it inline in the page DOM, and wire it into the rest of the page state. The buyer rotates the watch; the proof block under it updates. The buyer taps a hotspot; the spec section scrolls to the matching row. The buyer scrolls the page; the camera transitions to a new angle.
Right for. Stores at $400+ AOV where the buyer flow is part of the conversion lift, not the rotation alone. Stores that own a frontend developer who can maintain a Three.js component. Stores building a multi-product story flow that goes beyond the rotate-and-AR demo.
Not right for. Stores that need to ship 3D this week. Stores without a frontend developer. Stores where the viewer is the whole feature, not part of a larger story.
Time to ship. 4 to 8 weeks for a production v1. The Three.js production viewer guide covers the four parts most builds skip.
The single question that decides between the three options:
Does the rest of the page have to react to what the buyer does in the viewer?
If no, ship . The buyer rotates and zooms; the rest of the page does not change. Fast to ship, low maintenance.
If sometimes (an analytics event, a "see in your space" button), an iframe app is fine. Postmessage events bridge the gap.
If yes (the buyer's interaction with the viewer changes which proof shows, which spec is highlighted, which camera angle plays next), build custom in Three.js. The other two options will not deliver this and rebuilding later is slower than starting custom.
A common mistake: starting with , hitting the integration wall in month 6, then rebuilding in Three.js. The rebuild is more expensive than starting with Three.js if the team knew the integration was coming.
A few patterns that look hybrid but usually are not worth the complexity:
All three architectures fit the same mobile budget if compressed correctly. The runtime cost of the viewer code itself differs:
The bigger budget is always the model and textures. The WebGL product page performance guide covers the asset budget that decides whether the viewer ships under a 2-second LCP.
If your store has not shipped 3D at all, start with on the highest-AOV product. Verify the GLB exports cleanly. Verify the AR step works on iOS and Android. Measure conversion against the same product without the viewer for two weeks.
If the conversion lift shows up but the buyer flow feels disconnected from the rest of the page, that is the signal to invest in a custom Three.js component. Plan for 4 to 8 weeks; budget for a frontend developer who knows WebGL.
If you have not started and your store sells $400+ AOV with a story-driven page, skip and go straight to custom Three.js. The integration is the conversion lift, not the rotation.
The buyer is on a phone. The viewer is one of three architectures. The right pick is the one that fits the buyer flow, not the one that fits the timeline.