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
| Scenario | Bundle Components | Notes |
| Type 1 | Shampoo + Conditioner | Two independently sellable products bundled together |
| Type 2 | Perfume + Free Gift Charm | Charm is a bonus item included in the bundle. The free gift may or may not have inventory |
| Type 3 | Laptop + Laptop Bag + Free Screen Protector | Mix 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 }`
- Attributes:
- parentBundles: ["LAPTOP-BUNDLE-001"]
- Attributes:
- parentBundles: ["LAPTOP-BUNDLE-001"]
- Attributes:
- parentBundles: ["LAPTOP-BUNDLE-001"]
Key Attributes
| Attribute | Stored On | Type | Description |
`isBundledProduct` | Variant Product | BOOLEAN | `true` if this product is a bundle; absent/false for regular products |
`childComponents` | Variant Product | JSON Array | List of `{skuRef, qty}` defining the bundle composition |
`parentBundles` | Variant Product | JSON Array | Reverse reference — which bundles include this product |
Component Types
All products are variant products. The distinction is purely business-level:| Type | Can Be Sold Alone? | Example |
| Sellable Product | Yes | Fragrance, Handbag |
| Charm / Gift | No (bundle-only) | Gift charm |
| Sample | No (bundle-only) | Perfume sample |
| Wrapping / Pouch | Depends | Gift 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
Example Calculation
Bundle "LAPTOP-BUNDLE-001" has components: Laptop (qty: 1), Laptop Bag (qty: 1), Screen Protector (qty: 1)| Source | Inventory | Available |
| Bundle's own stock (pre-packed) | LAPTOP-BUNDLE-001 onHand = 5 | 5 |
| Component: Laptop | onHand = 50, qty required = 1 | 50 |
| Component: Laptop Bag | onHand = 30, qty required = 1 | 30 |
| Component: Screen Protector | onHand = 12, qty required = 2 | 6 |
`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
| Scenario | Source | Store/Warehouse Action |
| Bundle has own stock | Bundle's own inventory | Pick the bundle SKU directly — no explosion |
| Bundle's own stock exhausted | Component inventory | Explode 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.
| Catalogue | Data |
| Inventory Catalogue | LAPTOP-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 VC | LAPTOP-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
- 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
