Documentation

Bundle Types

Flex Bundles supports three bundle types. You choose one when you create a bundle, based on whether the contents are pre-set, built by the customer, or given away for free.

Fixed Bundles

Pre-configured bundles with a set list of components. The bundle is attached to a parent product variant: when a customer adds that variant to the cart, its components are automatically included.

Fixed bundles are ideal for curated sets and seasonal offerings where you decide exactly what goes in the box. Components are sold at their normal prices.

Because the bundle lives on the parent variant, fixed bundles work without any custom theme development.

Expand bundle on order edits

Fixed bundles are expanded into their components by Shopify's Cart Transform during checkout. Some orders never go through checkout with the bundle in the cart: post-purchase offers (the one-click add shown after payment and before the thank you page) add the product to the existing order through an order edit, and orders from marketplaces and channels such as TikTok Shop, Amazon, and the Shop app are created outside Shopify checkout. On those orders the bundle arrives as a single parent line item with no components.

Each fixed bundle has an Expand bundle on order edits setting in the bundle editor, below the components list. When it is on, Flex Bundles watches for that bundle's parent variant arriving on an order without its components and expands it after the fact using Shopify's Order Editing API:

  1. The component variants are added to the order at their bundle quantities.
  2. The parent line is removed and its inventory restocked, since that variant was never physically sold.
  3. Per-line discounts are applied so the component prices sum to exactly what the customer paid for the parent line, allowing for any discount codes Shopify re-applies to the added lines and for per-line tax rounding.
  4. The edit is committed. The customer is not charged or refunded anything.

The setting is off by default and per bundle. Leave it off if you handle expansion through your own integration.

Orders are tagged so you can find them:

Tag Meaning
flex-bundles-expanded The bundle was expanded on this order
flex-bundles-expanded-skipped The bundle could not be expanded, for example a component was out of stock or Shopify rejected the order edit. Review the order manually
flex-bundles-expanded-unbalanced The expansion committed, but the order's balance no longer matches what the customer paid. Correct it in the Shopify admin

Expanded orders also receive the flex-bundles-has-bundle tag and the $app:bundle_breakdown metafield, so they are counted in bundle analytics like any other bundle order. Orders placed in a currency other than your store currency are left untouched.

Flex Bundles

Customer-built bundles. Instead of a fixed set of components, customers choose the products that go into the bundle themselves, which is how you build mix-and-match and "build your own" experiences.

Flex bundles are added to the cart through Shopify's Cart API using line item properties. Each flex bundle is set to one of two pricing modes in the bundle editor:

  • Parent price: the bundle is priced from the parent variant, with an optional discount.
  • Component sum: the bundle price is the sum of the selected components' prices.

The mode is stored on the bundle rather than read from the cart request, so a tampered request can't switch it. See Pricing Modes.

Flex bundles require custom theme development to build the selection UI. See the Cart API Integration guide for the request format, and Customization for theme integration.

Free Bundles (Shopify Plus)

Free bundles let you add a line item to the cart at no charge, for gift-with-purchase (GWP) style promotions. The free item is flagged with the _is_free: true line item property when it is added to the cart.

This type requires Shopify Plus.

Choosing a type

Type Contents Plan
Fixed A set list you define Any
Flex Chosen by the customer Any
Free (GWP) A free gift line item Shopify Plus

You pick the bundle type when you create a new bundle from the app dashboard.