Skip to main content

Bundles (Kits)

A bundle is several products sold as one package at one price, for example "Starter pack: shampoo + conditioner + 2 sachets". The customer sees and buys one product, while the stock that goes down is the stock of its components.

New feature

Bundles arrive in the round 16 release, from the Growth plan for creating and editing. Unit-stock, booking, rental, and digital shops are not supported yet.

What a bundle is​

  • A bundle is a normal product (name, photos, SKU, barcode, category, reviews) that holds 1 to 30 component lines: a product, a variant if it has any, and a quantity per bundle.
  • One level only: a component cannot be another bundle, a recipe ingredient, or the bundle itself. A product with variants needs its variant chosen, and components must be active when saved.
  • A bundle counts as one product toward the plan's product limit.
  • A bundle discount is part of its price and is never applied at order level. Coupons, tax, delivery, and points work as with any other product.

Creating a bundle​

Open Catalog > Bundles, then Add bundle.

  1. Basics: name, description, photos (upload first; the first photo is the main one), category, SKU (generated as BDL-... when empty), barcode.
  2. Components: search products, pick a variant when needed, set the quantity per bundle. Search leaves out bundles, ingredients, and the bundle itself.
  3. Price: choose a price mode (below).
  4. The live panel on the side recalculates as you type: sellable stock and the limiting component, components total, savings (Rp and %), cost, margin, and warnings.
  5. Stock mode (advanced; the default is counted from components).
  6. Save. An active bundle shows up on the online store and POS at once.

Panel warnings: Selling below cost (red), Cost incomplete (amber, a component has no cost price), and No savings (amber).

The two price modes​

ModeHow it works
Fixed price (default)You enter the price. Every product price feature applies on top: discounts, seasonal price rules, flash sales, wholesale tiers
Sum of items minus discountPrice = the sum of the components' list prices minus a discount (percent 0 to 90, or a rupiah amount). The result is stored as the bundle price and recalculated automatically when a component price changes

The component price used is the list price, not its current promotion. If component prices just changed, the Bundles list shows a price needs refresh warning; Refresh prices updates them all at once.

Savings = components total minus the bundle's current selling price (never negative). Because it uses the current selling price, savings shrink while the bundle itself is on promotion.

Stock behaviour​

A bundle has two stock modes.

Starter Pack bundle with shampoo, conditioner and 2 sachets: 30 kits can be sold because the conditioner limits itWHAT’S INSIDEShampoo 250 mlStock 50 · 1 per kit50 ÷ 1 =50kitsConditioner 250 mlStock 30 · 1 per kit30 ÷ 1 =30kitsHair mask sachetStock 100 · 2 per kit100 ÷ 2 =50kitsStarter PackCounted from itemsCan sell now30kits, from the itemsLimited by Conditioner 250 ml.min(50, 30, 50) = 30Items costRp 120.000Bundle priceRp 99.000Customers saveRp 21.000 (18%)12
The default mode, counted from the items: sellable stock follows the scarcest item. Here (1) the conditioner limits the bundle to (2) 30 kits.

The default mode, counted from the items: sellable stock follows the scarcest item. Here (1) the conditioner limits the bundle to (2) 30 kits.

Counted from components (default). The bundle has no stock number of its own. Sellable stock = the scarcest component, divided by its quantity per bundle (rounded down). Example: shampoo 50, conditioner 30, sachet 100 (2 per bundle) gives min(50, 30, 50) = 30 bundles, limited by the conditioner. When a bundle sells, the component stock goes down through the stock ledger with the reason BUNDLE_USAGE.

  • A short component fails the whole order (a kit is never sold with a missing part): "Not enough stock for bundle ...: Conditioner (need 2, have 1)".
  • Low-stock alerts and reorder suggestions list the components, not the bundle.
  • Stock adjustments, stock opname, branch transfers, and PO lines are not allowed for this kind of bundle (BUNDLE_VIRTUAL_STOCK). Adjust the components.
  • A deactivated component makes the bundle unavailable (stock 0) until fixed. A product or variant still used by a live bundle cannot be deleted.

Assembled in advance. The bundle has its own stock. Assemble takes the components out and adds bundle stock in one transaction (quantity 1 to 10,000, pick a branch when needed). Disassemble is the reverse. A sale only reduces the bundle's own stock. The bundle's cost becomes the moving average over assemblies. Kits already assembled keep their old contents if you edit the definition; disassemble and assemble again.

Switching from Assembled to Counted from components is refused while assembled units are in stock (HAS_OWN_STOCK) and while an unpaid order holds the bundle (OPEN_ORDERS).

How it appears on the storefront and POS​

Online store: the product page shows a What's inside list (photo, name, quantity), the struck-through components total next to the bundle price, a Save 15% chip, and "Only N left" from the stock. The cart shows the components under the line. The buy button is limited by the stock counted from components.

POS: a bundle carries a Bundle badge, tap to see its contents, and the cart shows "Starter pack x2" with the components and the saving. The maximum quantity follows the derived stock. The cashier sells as usual through checkout, but does not see cost or component stock, only "Sold out" when unavailable.

In the Dashboard order detail, a bundle line has an Includes list (the components taken, useful as a pick list). It stays correct even if the bundle definition changes later.

Refunds and cancels​

An ordered bundle keeps its own components per order, so changing or deleting the bundle never affects old orders.

  • Cancel or expiry puts the components back in stock exactly once, net of refunds already made.
  • Refund with Restock returns the components for the bundles refunded. Without restock the components do not return (the goods were handed over).
  • For Assembled bundles, cancels and refunds restock the bundle itself.
  • Splitting and merging F&B table bills divides the components too, so cancelling either bill returns its own share.

Reports​

There is no dedicated bundle report yet (units sold, component consumption per bundle). What changes in existing reports:

  • Sales and profit: a bundle is one product line. The line cost = the sum of component costs at that moment, so margin is right.
  • Inventory overview: stock of components-counted bundles is not counted twice (the components are). New figures virtual bundles and bundles out of stock.
  • Stock ledger: new reasons BUNDLE_USAGE, BUNDLE_RESTORE, BUNDLE_ASSEMBLED, and BUNDLE_DISASSEMBLED. None of the four counts as stock loss.

Plans and roles​

FreeGrowthProEnterprise
View bundles, preview, delete, disassembleYesYesYesYes
Create, edit, assemble, refresh pricesNoYesYesYes
Selling existing bundlesYesYesYesYes

A downgraded shop can still sell, cancel, and refund existing bundles with correct stock. The Bundles screens are for Owner and Admin only because they show cost and margin; Cashier and Kitchen do not see them (a cashier still sells bundles in the POS).

MCP tools​

The AI assistant can read (bundles.list, bundles.get, bundles.sale_lines), estimate (bundles.preview), and create and edit with confirmation (bundles.create, bundles.update). Assembling, disassembling, refreshing prices, and deleting are done in the Dashboard. See Tool Surface.

FAQ​

Why is my bundle "unavailable"? See the reason in the list: a component is out of stock, inactive, or its variant is not chosen.

Can I let customers pick 2 of 5 items? Not yet. Create several bundles, or use variants.

My shop is unit-stock. Bundles are not supported yet (UNSUPPORTED_STOCK_MODEL).