Fluent Commerce Logo
Docs

Bundled Product Handling

Essential knowledge

Intended Audience:

Business User

Author:

Nandha Balaguru

Changed on:

15 July 2026

Overview

A bundled product is a single sellable product formed by combining multiple child variant products. The bundle can be fulfilled either from pre-packed stock or by assembling individual child components, which can also be sold independently. This document covers how to model bundles in Fluent OMS, calculate their availability, and determine how they are fulfilled. The approach described in this document reflects a common implementation adopted by clients. Actual implementations may vary based on client-specific business requirements and future product enhancements.

Key points

  • A bundle is modelled as a Variant Product with `isBundledProduct: true` and a `childComponents` attribute listing component SKUs.
  • Bundle components can be sold individually or as part of a bundle
  • Bundle ATS is calculated as the bundle's own pre-packed stock plus the minimum available units across all child components.
  • Allocation priority: Pre-packed bundle stock is consumed first; component explosion only occurs when pre-packed stock is exhausted.
  • A MASTER Virtual Catalogue orchestrates all bundle ATS calculations — it receives inventory change events, applies the min-of-components formula, and routes results to BASE and Aggregate catalogues.
  • Selling a component individually automatically reduces the bundle's calculated availability through virtual position recalculation.
  • The `parentBundles` attribute on component products provides reverse-reference for recalculation triggers.

Business Scenarios

ScenarioBundle ComponentsNotes
Type 1Shampoo + ConditionerTwo independently sellable products bundled together
Type 2Perfume + Free Gift CharmCharm is a bonus item included in the bundle. The free gift may or may not have inventory
Type 3Laptop + Laptop Bag + Free Screen ProtectorMix of sellable products and a free promotional item

Product Data Model in Fluent

Structure

The bundle itself is modelled as a Variant Product with `isBundledProduct: true` and a `childComponents` attribute listing the component SKUs.

VARIANT PRODUCT: "LAPTOP-BUNDLE-001" (The bundle — what the customer orders)
  • Attributes:
    • isBundledProduct: true
    • childComponents:
      • `{ skuRef: "LAPTOP-SKU", qty: 1 }`
      • `{ skuRef: "LAPTOP-BAG-SKU", qty: 1 }`
      • `{ skuRef: "SCREEN-PROTECTOR-SKU", qty: 2 }`
VARIANT PRODUCT: "LAPTOP-SKU" (Independently sellable)
  • Attributes:
    • parentBundles: ["LAPTOP-BUNDLE-001"]
VARIANT PRODUCT: "LAPTOP-BAG-SKU" (Independently sellable)
  • Attributes:
    • parentBundles: ["LAPTOP-BUNDLE-001"]
VARIANT PRODUCT: "SCREEN-PROTECTOR-SKU" (Bundle-only component)
  • Attributes:
    • parentBundles: ["LAPTOP-BUNDLE-001"]

Key Attributes

AttributeStored OnTypeDescription
`isBundledProduct`Variant ProductBOOLEAN`true` if this product is a bundle; absent/false for regular products
`childComponents`Variant ProductJSON ArrayList of `{skuRef, qty}` defining the bundle composition
`parentBundles`Variant ProductJSON ArrayReverse reference — which bundles include this product

Component Types

All products are variant products. The distinction is purely business-level:
TypeCan Be Sold Alone?Example
Sellable ProductYesFragrance, Handbag
Charm / GiftNo (bundle-only)Gift charm
SampleNo (bundle-only)Perfume sample
Wrapping / PouchDependsGift pouch, wrapping


Inventory & Virtual Position Strategy

Core Principle

A bundle can have inventory in different combinations:
  • Bundle's own inventory — pre-packed/pre-assembled units sitting in the store/warehouse as a single SKU
  • Calculated from components — assembled on-demand from individual child component inventory using a min-of-components formula
The total Available-to-Sell (ATS) for a bundle combines both:Bundle ATS at a location = Bundle's own on-hand + MIN(component available units for each child)

Example Calculation

Bundle "LAPTOP-BUNDLE-001" has components: Laptop (qty: 1), Laptop Bag (qty: 1), Screen Protector (qty: 1)
SourceInventoryAvailable
Bundle's own stock (pre-packed)LAPTOP-BUNDLE-001 onHand = 55
Component: LaptoponHand = 50, qty required = 150
Component: Laptop BagonHand = 30, qty required = 130
Component: Screen ProtectoronHand = 12, qty required = 26
`Calculated from components = MIN(50, 30, 6) = 6`
Bundle ATS = 5 (own stock) + 6 (from components) = 11 units

Fulfilment Priority

When fulfilling a bundle order, the system prioritises:
  • First: Use bundle's own pre-packed inventory (no explosion needed — ship as-is)
  • Then: If pre-packed stock is exhausted, explode into components and fulfil from component inventory
This priority is controlled during sourcing — the workflow checks the bundle's own inventory position at the selected location. If stock exists, the fulfilment proceeds with the bundle SKU directly. Otherwise, the explosion logic kicks in and components are picked individually.
ScenarioSourceStore/Warehouse Action
Bundle has own stockBundle's own inventoryPick the bundle SKU directly — no explosion
Bundle's own stock exhaustedComponent inventoryExplode to components → pick each item → pack together

Pick & Pack for Bundles

When a bundle is exploded into individual child components, the store application's pick component can be extended to:
  • Display packing instructions driven by attributes on the bundle product (e.g., gift wrapping, special packaging)
  • Group child components visually so the store user knows they belong to the same bundle
  • Handle short picks — if a child component is unavailable at the current location, the associated bundle components can be re-assigned to a different location as a group
When the bundle is fulfilled from pre-packed stock, no special handling is required — the store user picks the bundle as a single item.

Product Availability Calls

There are no changes required on the product availability call, as the inventory quantity calculation is already handled by the virtual catalogue layer.

Virtual Catalogue Architecture

Flow Sequence:
  • Inventory Catalogue — Propagates inventory changes to the Virtual Catalogue.
  • MASTER VC (Calculation Logic) — Receives the event, reads the bundle definition and component stock from the variant product. If the bundle exists, it applies the min-of-components formula to calculate the bundle ATS for base and Aggregate VC.
  • BASE VC — Receives calculated virtual positions from MASTER VC and updates the bundle and individual components.
  • Aggregate VC — Receives the final aggregated positions from MASTER VC.
Example:
CatalogueData
Inventory CatalogueLAPTOP-BUNDLE-001 (own stock): onHand = 5, Laptop: onHand = 50, Laptop Bag: onHand = 30, Screen Protector: onHand = 12(qty required = 2)
MASTER VC (calculates)Bundle ATS = 5 + MIN(50, 30, 6) = 11
BASE VCLAPTOP-BUNDLE-001 @ Location-A → qty: 11
Aggregate VC (single location)LAPTOP-BUNDLE-001 @ Location-A → qty: 11

MASTER Virtual Catalogue — The Orchestration Layer

The MASTER Virtual Catalogue is the central orchestration workflow that coordinates all bundle base and aggregate ATS calculations. It does NOT store virtual positions itself — instead, it receives events, executes the calculation logic, and routes results to the appropriate virtual catalogues.

Child Components Can Also Be Sold Independently

Bundle child components share the same inventory pool whether sold individually or as part of a bundle. When a child component is sold on its own, it directly impacts the bundle's calculated availability.Example:The Laptop Bundle (LAPTOP-BUNDLE-001) has a calculated ATS of 6(based on the Screen Protector: 12 on-hand / 2 required = 6, the lowest component).
  • A customer purchases 2 Screen Protectors individually → Screen Protector on-hand drops from 12 to 10
  • Inventory change triggers a recalculation of the bundle's virtual position via MASTER VC
  • Bundle's calculated ATS reduces from 6 to 5 (10 on-hand / 2 required = 5)
  • Bundle's own pre-packed stock (5 units) remains unaffected
  • Total bundle ATS changes from 11 to 10
When bundle's own pre-packed stock changes:
  • A store/warehouse receives 3 additional pre-packed Laptop Bundles → bundle's own on-hand increases from 5 to 8
  • VP recalculation is triggered via MASTER VC
  • Bundle ATS adjusts: 8 (own stock) + 5 (from components) = 13
  • Component inventory remains unaffected