Variant-Aware Content and Media Swapping on Shopify
Definition
The product page re-renders its copy, imagery, ingredients and SEO the moment a shopper picks a different variant, using the Section Rendering API or pre-serialized per-variant payloads. Each shade, size or format behaves like its own product without splitting the catalog. This is what makes a 40-shade PDP legible instead of generic.
The Evidence
- 17 live, Deploi-attributed builds across 2 of the 3 Shopify storefronts in this corpus — Nudestix 9, LUS Brands 8, Three Ships none.
- Attribution: 12 Deploi-authored, 5 built on top of a vendor theme and disclosed as such.
- Status: live, verified 2026-09-06.
- Evidence quality: 12 carry code plus client working records. 5 are documented from the code alone.
- Confidence: 11 strong, 6 moderate.
- Not counted: eight further records here are vendor theme code, dead code, or otherwise not admissible as evidence. Not listed, not claimed.
- Nine of the 17 have published build pages.
How It's Actually Built
Two mechanisms, plus a third that avoids both.
Re-render the section. Subscribe to the theme's variant-change event, fetch the product URL with ?variant=<id>§ion_id=<id>, parse the response with DOMParser, swap one node. The LUS Brands tabs section swaps four regions, one of which is a hidden marker carrying a recomputed data-has-ingredients flag — tab presence is recalculated by the same Liquid that rendered the page and rides back in the same response, so the rule exists in one place. The hero banner swaps only its inner content node, leaving the outer wrapper the parallax is bound to untouched.
Pre-serialize the payload. Where the theme base has no variant lifecycle, every variant's copy goes into the DOM at render time instead: a hidden input per variant carrying data-meta-ingredient, data-meta-how-to and data-meta-details, and each accordion body emitted a second time as a JSON script tag. A shade click repaints from what is already on the page — no network call, which is what makes it work inside a quick-view modal and a collection grid.
Classify instead of fetching. Media is the case where neither works. Liquid exposes no per-variant media list, so two snippets normalize alt text into a match key and return one of four verdicts — blank, perfect, partial, hidden. The gallery filters slides on those verdicts and parks hidden nodes off-DOM rather than deleting them, so a variant change is a re-filter of nodes that already exist.
Choosing between the first two is the recurring decision here, and it's the one we'd put to you first: a round trip per variant change, or your whole catalog's copy in the initial HTML.
The Buy-vs-Build Position
Built natively on the Section Rendering API in every instance; the corpus contains no app attempt at per-variant content.
Read that against the section above. Where a theme base predates Shopify's variant lifecycle, the swap comes from a pre-serialized payload rather than a fetch — but it is still theme code, and no variant-content app was bought on either of the two storefronts this capability covers. The cost argument, including the catalogs where an app is the right answer, is in the variant limits and complex options decision.
The Builds
LUS Brands
- Alt-text driven variant media gallery with tiered matching and full-screen lightbox — slides re-filtered per variant, hidden nodes parked off-DOM.
- Alt-text convention that maps product media to variants without metafields — the four-tier classifier underneath that gallery.
- Metafield-driven product information tabs with mobile accordion and variant refresh — four regions swapped per variant, including recomputed tab presence.
- Rebuilt 2026 PDP section with merchandiser-composable blocks and per-product ATC color — title, subtitle and eyebrow resolve variant-first.
- Variant-aware PDP hero banner driven by a 'heroic' metaobject — one section instance, editorial art per variant.
- Variant-aware price snippet with a percentage and value savings badge — the saving is computed for the selected variant and rides the product section's own re-renders, so what a shopper is told they save moves with the shade or size rather than sitting on the product.
Nudestix
- Metafield-driven PDP content system: auto-built accordions, need-to-know strip and campaign widgets — details, ingredients and how-to overridden per shade.
- Product card with award badges, per-variant content payload and per-card structured data — every variant's copy serialized into the card.
- Shade swatch rendering and per-variant content payload — one hidden input per variant, read by the picker, the quick view and the cart cross-sell.
What This Rests On
- Liquid section schema and settings — in 16 of the 17; the settings the swap re-renders against.
- Metafields — in 15; the per-variant copy itself.
- Section Rendering API — in 6; the server-side swap.
- Metaobjects — in 6, where the per-variant record has named typed fields.
- Custom elements — in 5; the theme elements the swap runs inside.
- Structured data — in 2, where the swap also has to keep per-variant markup correct.
What Varies by Storefront
The split — 9, 8 and none — is the finding, and the theme base explains it.
LUS Brands runs Dawn 15.4.1, which publishes a variant-change event and re-renders the product information section itself. That gives the work something to hook: sections subscribe, fetch themselves by id, and swap. The hard part is the opposite of building a lifecycle — telling Dawn's to stand down where our own gallery owns the media, which it does with a data-use-alt-variant-media attribute.
Nudestix runs Dawn 6.0.2, which predates that lifecycle. So the same outcome is reached by serializing every variant's copy into hidden inputs and JSON script tags and repainting client-side. That also suits the catalog: color cosmetics sold as shade, in grids where a fetch per swatch click would be visible.
Three Ships runs Palo Alto 5.8.0 by Presidio Creative, a paid premium theme, and it is the storefront with nothing in this capability. The variant behavior on its product page belongs to the vendor — the inventory countdown and the selling-plan picker are its code, not ours — and vendor code is not ours to count. This capability therefore covers two storefronts, not three: the third contributes nothing to the number above and nothing to the argument below.
Two storefronts out of three is an uncomfortable thing to publish and the most useful line on this page: where a premium theme already does the swap, there is nothing here worth paying us for.
Where This Gets Hard
The rule ends up written twice. Resolution logic lives in Liquid and again in JavaScript, and nothing enforces agreement between them. The alt-text convention is the sharpest case: the same normalization — non-breaking spaces, separators, case — is implemented in both languages, and a divergence shows up as a gallery that filters differently after the first click than on load.
Every swap is a race. A fetch per variant change means aborts, failures and double-binding after a theme-editor re-render. A dropped request has to leave the previous variant's content on screen rather than blanking the panel, and an active tab that has just become empty has to move the shopper rather than show a blank panel.
The payload approach is paid for in bytes. Serializing every variant's copy into every card in a grid puts the whole catalog's copy in the initial HTML. On a 40-shade line that is not a rounding error.
And it is often the wrong build. We would advise against it where variants differ only in size and share their copy and imagery, where the vendor theme already swaps content — the third storefront in this corpus is that case — or where a handful of genuinely different products would be better as separate URLs than variants of one. Building a swap lifecycle for content nobody varies is maintenance you'll pay for with no upside.
Related Capabilities
- Metafield-driven PDP content blocks — where the per-variant copy is stored and edited.
- Structured data for AI answers — keeping per-variant markup correct through a swap.
- Fixed bundles and kit merchandising — variant selection per component in a kit.
- Filters, faceted navigation and progressive grid loading — the same problem at collection scale.
Answers to Help You Make Smart Decisions
Do you need an app to make a Shopify product page update on variant change?
No. The Section Rendering API returns re-rendered section HTML for a given variant, so the theme can swap copy, media and metadata server-side on selection. Where a theme base has no variant lifecycle, the same result comes from per-variant payloads serialized into the page. None of these 17 builds used an app; the cost is that the theme owns the swap lifecycle.
Should variant content re-render from the server, or be pre-loaded into the page?
Re-render when the resolution logic is complicated and you do not want it written twice — the server returns content and recomputed state in one response. Pre-load when the swap has to be instant, happens inside a modal, or repeats across a grid. Pre-loading puts every variant's copy in the initial HTML, which is weight paid on every page view.
Is variant-specific content visible to search engines and AI answer engines?
The variant that renders on the initial request is in the HTML, so it reaches crawlers and answer engines without a script running. Other variants' content is not, unless it was pre-serialized into the page — an argument for the payload approach on a catalog where each shade carries distinct ingredients or claims.
Ready to Make Every Variant Read Like Its Own Product?
We build variant-aware product pages on Shopify's own primitives, in your theme, with no app in the path. Contact us today to talk about what your product page should change when a shopper does.