# Bundles

Source: https://docs.tightly.io/help/product/bundles
Reviewed: 2026-09-07

## The question this page answers

Which variants are declared bundles, what does each consume, and how many can the stock on hand build? A bundle is products sold together as one: an existing variant declared as the bundle, and the variants it consumes at a quantity each. How many it builds is set by its tightest component. Bundles live on Components, which every plan's rail carries under Products: its catalogue lists each kit and assembly with where its stock is held, and a kit opens the bundles view. The old Bundles address opens that view.

## What you see

::: shot page
:::

The page is headed **Components**, with a door back to the catalogue. The basis line reads Units · stock on hand and the warehouse the figures are read at; where the rows name more than one warehouse, a select picks one warehouse or All warehouses. There is no verdict sentence over the table.

The table is one row per bundle, the fewest builds first: Bundle (image, product and variant), SKU (with a copy button; No SKU), Category (Not classified), Components (a count, the list with each quantity on hover; No components), Builds (how many bundles the stock on hand builds; hover it for the sentence naming the constraint and its arithmetic), Constraint (the component that floors the count, a door to its room; Not on file) and Runs out, which where the engine has projected a day shows it beside a bar of the days left, and otherwise reads Not projected.

Builds is served, never recomputed on the page. Across all warehouses it is the smallest of each component's stock on hand, summed over every warehouse, divided by the quantity the bundle takes, rounded down. At one warehouse it is the same floor on stock less what is reserved there. A measured zero prints as 0. A component nobody has counted withholds the whole count, and the constraint with it, because naming a constraint while an uncounted component might be scarcer would put a wrong sentence on the row.

Pressing a row opens its bill: Available (the Builds figure), the component count, and one line per component with Per product, On hand and Can supply, the binding component first, then Limited by and the component that binds, or Stock not measured. A bundle imported from a source such as NetSuite is marked Imported and Read-only.

## What to do

1. Press **New bundle**, then choose the bundle product on step one.
2. Add products inside on step two, with a quantity of at least one for each.
3. Watch the sentence above the button as you pick: how many bundles the stock on hand builds, with the constraint named, or that the count cannot be stated:

   > One component has no stock reading, so the buildable count cannot be stated.

4. Press **Create bundle** once every selected product has a quantity; it stays disabled until then, and says:

   > Enter a quantity of at least one for every selected product.

5. Press a row to open its bill, then **Edit components** to open the Edit bundle drawer.
6. Pick or unpick components, set their quantities, then press **Save components**.
7. Press **Dissolve bundle** to revert it to its original variant, same SKU; confirm with **Dissolve**, or back out with **Keep it**.
8. Press **View product** on a bundle's bill to open its own room.

Create bundle writes it and returns to the list, which says the variant is now marked as a bundle; a refusal renders above the button as Not created with the served reason. Save components reads Bundle updated, or Not updated with the reason; a dissolve names the variant reverted, or the bill says Not dissolved with the reason. The acts wait while a dissolve is in flight, and nothing here changes which variant is the bundle.

A bundle is never bought: replenishment leaves bundle variants out. Its demand lands on its components, each at the bill's quantity per bundle sold, so the components' velocity and their reorders carry it. The variant room of a bundle shows its bill under Structure.

## When it is empty or failed

Before your data has arrived, the page is one sentence with a door to Home instead of the table.

A first run shows the New bundle door and one sentence:

> No bundle is declared yet.

A search that matches nothing keeps the toolbar:

> No bundles match that search.

A failed read is stated where the table would be, with Try again:

> The bundles read didn't answer.

The picker's failed read is stated in the picker; a refused save renders in the drawer's foot.
