This feature is available on the Pro plan only. The public metafields are written and kept in sync automatically whenever you save a bundle in the app.
Overview
On the Pro plan, Panori Bundles writes the bundle configuration into a public metafield namespace (panda_bundles) on every mother variant. This lets you build a fully custom bundle picker directly in your theme’s Liquid — no Theme App Extension block required.
Available Metafields
Each mother variant gets a metafield with the full bundle configuration for that variant.child_variants is a list.variant_reference — Shopify resolves each entry to a full variant object in Liquid, giving you live access to .price, .title, .image, .available, and all other variant properties.
Data structure
discount.type can be "percentage", "fixed", or "custom". For "custom", the price lives directly on the Shopify variant — no calculation needed.Building the UI in Liquid
Usebundle_config for step structure and child_variants for live variant data. Combine them by matching variantId from the config against the resolved variant objects.
child_variants is a list.variant_reference — Shopify resolves it to actual variant objects at render time. Prices, availability, and images are always live. You do not need to manage staleness.Submitting the Bundle to Cart
When the customer confirms their selection, you must POST to/cart/add.js with the selected variants plus a _bundle_config_json property on the first line item and a shared _bundle_id across all items.
1
Collect selections
Gather the selected
variantId per step from your UI state.2
Build the payload
Construct the
_bundle_config_json from the bundle metafield and the customer’s selections.3
POST to /cart/add.js
Add each selected child variant as a separate line item. Attach
_bundle_config_json to the first item only, and _bundle_id to all items.Server-side Validation
When the cart is processed, the Panori Bundles cart transform function validates every bundle instance against the saved configuration:
If any check fails, the bundle is not merged and the items remain as separate, full-price lines in the cart.