What a bundle actually is.
A bundle is a sales unit that contains multiple physical SKUs. A holiday gift box might be one Shopify SKU at €45 that contains a hand cream (€12), a soap (€8), and a candle (€20). The bundle has a price; the components have stock. The bundle does not have its own physical stock except as a packaging unit.
Most bundle problems start with merchants treating the bundle SKU as a stockable item. They set Shopify inventory on the bundle SKU manually. The bundle says it has 50 units in stock, but those 50 are an arithmetic guess: do they each contain a hand cream + soap + candle? If yes, do those component stocks decrement when bundles sell? Without a bundle definition, no.
Virtual bundles vs physical bundles.
Virtual bundles are assembled at fulfillment. A bundle order picks one of each component from the warehouse and packages them. There is no pre-assembled inventory. Stock on the bundle SKU is computed: minimum (component stock divided by per-bundle quantity) across components.
Physical bundles are pre-assembled. A worker batches 50 hand creams + 50 soaps + 50 candles into 50 finished gift boxes. Component stock decrements at assembly time, bundle stock increments. This is a kit-build workflow. Selling a physical bundle decrements bundle stock, not component stock.
- Virtual: assemble on demand, stock is computed from components
- Physical: pre-assembled, stock is independent, kit-build is a separate event
- Hybrid: some pre-assembled, some on-demand, requires both modes
- Pure-virtual is simplest for most Shopify merchants
COGS on virtual bundles.
COGS on a virtual bundle is the sum of component WACs at the source branch. On a holiday bundle sale at €45 where component WACs are hand cream €7.20, soap €4.80, candle €12, the bundle COGS is €24. Gross margin is €21, or 47%. Each component decrements one unit from its own branch stock.
Without a bundle definition, Shopify cannot post correct COGS. Many merchants set the bundle Shopify cost field to a flat number (often the sum of component invoice prices, not WAC) which means COGS is wrong from order one. Nonari maintains bundle definitions and computes COGS at order time from the live component WAC, not from a stored snapshot.
COGS on physical bundles.
Physical bundles carry their own WAC, computed at the kit-build event. When you build 50 gift boxes from 50 of each component, the bundle WAC is the weighted average of component WACs at build time, plus any direct labor or packaging cost allocated to the build. If labor is €0.50 per box and packaging is €1 per box, the bundle WAC is component sum + €1.50.
Selling a physical bundle decrements bundle stock at bundle WAC. Because the bundle was a separate inventory event, COGS is straightforward: debit COGS, credit Inventory at bundle WAC. The kit-build event itself is the place where labor and packaging get capitalized into inventory; do that wrong and either the components or the build cost end up in the wrong period.
Configurable products vs bundles.
A configurable product (T-shirt with size and color variants) is not a bundle. Each variant is its own SKU with its own stock. Variants are not assembled from components; they are inventoried individually. Confusing the two is a common error: merchants try to model a T-shirt with three colors as a bundle, which makes no sense.
A bundle is a fixed-composition sales unit. A configurable product is a chooser pattern across multiple SKUs. Shopify natively supports configurable products through variants. Bundles need explicit modeling. Nonari treats them distinctly: variants are SKU children, bundles are bundle definitions.
Mix bundles and discounting.
Mix-and-match bundles ("any 3 for €15") add complexity. The customer chooses 3 items from a category; the bundle price is fixed; the components decrement individually. COGS is the sum of WACs of the chosen components. Revenue is fixed at €15.
On a mix bundle of 3 items chosen as €4.80 + €7.20 + €6 WAC, COGS is €18. Wait. Revenue €15, COGS €18, gross margin negative €3. That happens. The merchant priced the bundle below cost. Without a system that tracks per-bundle margin, this gets discovered too late. Nonari surfaces negative-margin bundles in margin reports.
Refunds on bundles.
A bundle refund must reverse the right components. For a virtual bundle, restock the components: if the bundle was hand cream + soap + candle and the customer refunds, restock one of each at original WAC. For a physical bundle, restock the bundle SKU at bundle WAC.
Partial refunds are messier. A virtual bundle "refund just the candle" is unusual but happens (component damaged, others fine). The merchant restocks the candle, refunds proportionally (typically the component’s share of bundle revenue), and adjusts COGS for that component only. Nonari supports component-level partial refunds on virtual bundles, which is a feature not all platforms expose.
Where Nonari fits.
Nonari supports both virtual and physical bundles with explicit definitions. On a virtual bundle Shopify order, components decrement and COGS posts as sum of component WAC. On a physical bundle, bundle WAC drives COGS, and kit-build events capitalize labor and packaging. Stock on the Shopify side is updated based on the bundle mode (computed for virtual, independent for physical).
The result is that bundles do not break inventory. Components and bundles can coexist. Margin reports reflect the actual cost basis. The holiday gift box that looked like a 65% margin product because Shopify stored a wrong cost shows up as the actual 47% it is. Operationally, bundles become a marketing layer rather than a books problem.