---
title: "Bills of Materials"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.beelocity.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bills of Materials

A **Bill of Materials (BOM)** is the recipe for a manufactured product — the structured list of components, sub-assemblies, raw materials, by-products, and scrap factors required to produce one unit of a parent item. Every other manufacturing transaction depends on the BOM: routings attach operations to BOM components, work orders explode a BOM into reservations and issues, and MRP walks BOM levels to translate finished-goods demand into raw-material demand.

Beelocity supports four BOM shapes that show up repeatedly in Algerian SMB manufacturing: single-level engineering BOMs, multi-level production BOMs with phantom intermediates, configurable BOMs that vary per variant, and disassembly / co-product BOMs that produce more than one finished item per run.

## Creating a BOM

To author a new BOM:

1. Navigate to **Manufacturing > BOMs** in the sidebar.
2. Click **New**.
3. Fill in the header:
- **BOM #** — Unique identifier (e.g., `BOM-2026-0042`).
- **Version** — Engineering version label (e.g., `v1`, `rev-A`).
- **Type** — `Manufacturing` for normal production. See [BOM Types](#bom-types) for the alternatives.
- **Status** — Start in `Draft` while you build the components list.
- **Product** — The parent product produced by this BOM.
- **Default** — Mark `Yes` if this BOM should be picked when a work order doesn't specify a BOM. At most one default per (product, variant) at any time.
- **Phantom** — Mark `Yes` if the parent is a phantom assembly that is never stocked or transacted; the components flow directly to the consuming parent at explosion time.
- **Produces Quantity** — How many units of the parent one full BOM run produces. Most BOMs produce 1; multi-output recipes (a 50 kg bag of flour batch that yields a 50 kg bag plus 5 kg of bran) use higher numbers and the by-product field.
- **Produces Unit** — UoM of the produces quantity (typically the parent's stock UoM).
- **Routing** — Optional link to the routing that pairs with this BOM.
- **Effective From / To** — The date window during which this BOM may be referenced by new work orders.
- **Supersedes** — If this BOM replaces an older version, link to it for the audit trail.
4. Click **Save**. The BOM is created in `Draft` status.

## Adding Component Lines

Component lines sit beside the bill's details on its page — there is no tab to open. Click **Add** to type one straight into the grid, or click a line's number to open it on a page of its own, where the whole of it is readable at once and the **Line #** on a new one is pre-filled with the next free gap (highest existing number + 10). Either way, fill in:

| Field                   | Meaning                                                                                                                                                                        |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Line #**              | Sequence within the BOM (e.g., 10, 20, 30). Gaps are allowed for inserts.                                                                                                      |
| **Component**           | The product consumed (or, for by-products, produced).                                                                                                                          |
| **Variant**             | Optional variant (SKU) of the component. Only variants of the selected component are offered — leave blank when the component has no variants or any variant will do.          |
| **By-product**          | Toggle on for outputs produced alongside the parent (e.g., bran from milling, recoverable scrap).                                                                              |
| **Qty / Parent**        | How much of this component is needed per parent unit (or per full BOM run if `Produces Quantity` > 1). Always positive — direction is encoded by the by-product flag.          |
| **Unit**                | UoM of the quantity. May differ from the component's stock UoM; conversion is read from the manufacturing UoM assignment.                                                      |
| **Scrap**               | Expected scrap factor as a fraction (e.g., `0.02` = 2%). Applied multiplicatively at explosion: `requirement = qty_per_parent × (1 + scrap_factor)`.                           |
| **Yield**               | For by-products only — the fraction of nominal output actually recovered. `1.0` = 100%.                                                                                        |
| **Issue Method**        | When the component is consumed: `Manual` (operator issues at consumption time), `Backflush` (auto-issued on operation completion), `Pre-issue` (issued in full at WO release). |
| **Lot Policy**          | Lot picking policy when the component is lot-tracked: `FEFO` (first expired first out), `FIFO` (first in first out), `Manual` (operator picks).                                |
| **Optional**            | Toggle on if this line is included only when explicitly enabled at WO release.                                                                                                 |
| **Effective From / To** | Per-line date window. Lines can be end-dated and replaced without rewriting the BOM.                                                                                           |

Component lines save to the BOM immediately — there is no separate "save the BOM" step after authoring lines.

Once the BOM is **Active**, each line's recipe (component, variant, quantities, unit, scrap / yield, flow, and line number) is frozen and lines can no longer be deleted. Both the grid and the line's own page keep only the effective dates, the **Active** flag, and notes editable, and the page says why in as many words. To change an active recipe, pre-stage a replacement line with a future **Effective From**, or create a superseding BOM version.

### Line effectivity — handling overlaps

The explosion engine includes **every active line whose `Effective From / To` window contains the WO's reference date**. If two lines for the same component overlap by date, both are exploded and their quantities **stack** — you get the sum on the work order.

Stacking is occasionally what you want (e.g. a temporary "extra screw for batch 2026-07" line layered on top of the base recipe). More often it's a mistake — usually the intent of an engineering change is to _replace_, not _add to_, the previous line. The rule of thumb:

- **Replacing a line** — end-date the old line (set **Effective To** to the day before the change takes effect) **and** set the new line's **Effective From** to the change date. The two windows must not overlap.
- **Layering an extra requirement** — leave both lines active in overlapping windows. Both will explode and the operator picks both quantities.

There is no exclusivity check at save time, so the planner is responsible for the overlap discipline. A common safeguard is to run an `Explosion preview` on the BOM detail page right after edits — if you see duplicate component rows you didn't expect, an overlap is the likely cause.

The grid's **filter button** narrows the lines by **Product**, **Unit**, **Issue Method**, **Lot Policy**, **By-product**, **Active** or a **Qty / Parent** or **Scrap** range ([Working with lists](../getting-started/working-with-lists.html#narrowing-the-list)).

## Adding Alternates

Alternates are second-choice components that may substitute for the primary line — typically driven by availability, sourcing, or cost. Like component lines, each alternate is its own page: **New** opens it, and clicking an alternate's product name in the grid reopens it later.

1. On the **Alternates** tab, click **New**.
2. Pick the **For Line** to attach the alternate to.
3. Pick the **Alternate Product**, and optionally an **Alternate Variant** (only variants of the chosen product are offered).
4. Set **Priority** (lower number = preferred when multiple alternates exist).
5. Set **Qty Ratio** if the alternate substitutes at a different rate (e.g., `1.05` if 5% more of the alternate is needed for the same outcome).
6. Toggle **Approval** if this substitution should route through the workflow engine before posting.

Alternates are evaluated at work-order release: if the primary component is short and an alternate is available, the WO release UI offers the substitution.

The Alternates tab filters by **Line**, **Alternate Product**, **Approval**, **Active** or a **Priority** or **Ratio** range, the same way.

<a id="bom-types"></a>

## BOM Types

The **Type** field classifies the intent of the BOM. Different types feed different downstream engines.

| Type              | Meaning                                                                  | When to use                                                                            |
| ----------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| **Manufacturing** | Standard production BOM consumed by work orders and MRP                  | The default. Use for any BOM driving production.                                       |
| **Engineering**   | Design-time BOM not yet released for production                          | Use during prototyping. Visible to engineering, ignored by MRP and work-order release. |
| **Disassembly**   | Reverse BOM — a single parent input is broken down into multiple outputs | Returns processing, demolition, recovery.                                              |
| **Subcontract**   | BOM used by a subcontract work order                                     | Structurally identical to Manufacturing, but pairs with a subcontract routing.         |

On the **Bills of Materials** list, the **filter button** beside the search box narrows by **Type**, **Status**, **Product**, **Default**, **Phantom**, **Active**, a **Produces** quantity range or an **Effective From** / **Effective To** date range ([Working with lists](../getting-started/working-with-lists.html#narrowing-the-list)).

## BOM Lifecycle

BOMs progress through four statuses, mirroring routings:

| Status               | Meaning                          | What you can do                                                                       |
| -------------------- | -------------------------------- | ------------------------------------------------------------------------------------- |
| **Draft**            | Being authored                   | Edit any field; add or change component lines and alternates; activate when ready     |
| **Pending approval** | Submitted to the workflow engine | Approvers review; can return to Draft on rejection                                    |
| **Active**           | Released for production          | Work orders can reference this BOM. Line recipes are frozen (component, quantity, unit, loss factors, flow) and lines can't be deleted — only effective dates, the Active flag, and notes stay editable; bigger changes require a superseding version |
| **Obsolete**         | Superseded by a newer version    | Historical work orders still reference it; new work orders cannot                     |

A road runs along the bottom of the BOM's page: **Draft → Active**, the two steps every recipe
walks. The button beside it takes the next one, so activating a draft is a single click.

The other two statuses are not on that road, and are picked from the map behind the status word
instead:

- **Pending approval** is a detour off Draft, for a recipe that waits for a reviewer before it goes
  into service. A draft that goes round by it rejoins the road at Active; one that does not is not
  missing a step.
- **Obsolete** is the way out, from wherever the BOM stands. The road never offers it as the next
  thing to do, because retiring a recipe that works rarely is.

Hover a step to read when the BOM reached it and who moved it. Every move is kept, whichever way
the BOM went.

Engineering changes are made by superseding, not mutating. Activate a new BOM version with the next version label, point its **Supersedes** field at the previous version, and end-date the previous one.

## Explosion Preview

To see what a BOM will consume for a specific quantity:

1. Open the BOM detail page.
2. Click **Explosion Preview** in the action bar.
3. Enter the target quantity (e.g., `100`).
4. Beelocity multiplies each line's `qty_per_parent × (1 + scrap_factor) × (target_qty / produces_qty)` and shows the gross quantity for every active component, plus by-product credits.

Use this to validate the recipe, sanity-check after a scrap-factor edit, or compare alternates side by side.

### Seeing a product's BOMs

Open the product from **Products**. If the product has at least one BOM attached, a **BOMs** tab appears alongside Overview / Variants / Units / Routings. The tab lists every BOM attached to that product, with a **Role** column that tells you at a glance whether each one is the _Default_ (picked when a work order is created without specifying a BOM), a _Phantom_ (an engineering grouping whose components flow directly to the consuming parent), or a _Primary_ standalone (a draft or obsolete version). Click a BOM number to open it. The list is read-only — create, edit, and activate BOMs in the **Bills of Materials** module — and its filter button narrows it by **Type**, **Status**, an **Effective From** range or **Active**. The tab is hidden for products with no BOMs, so a missing tab simply means none have been authored yet.

### Example

A BOM for "Office Chair Pro" produces 1 unit and lists:

- Line 10 — Aluminum Tube 30mm: 4 PCS / chair, scrap 2%
- Line 20 — Foam Padding 20mm: 0.85 m² / chair, scrap 0%

Exploding for **target_qty = 50** chairs:

```
Aluminum Tube: 4 × (1 + 0.02) × 50 = 204 PCS
Foam Padding:  0.85 × (1 + 0)     × 50 = 42.5 m²
```

These are the gross quantities the work order will reserve at release.

## Special Lines

### By-products

A line marked **By-product** is **produced** alongside the parent rather than consumed. Use for:

- **Co-products**: A flour-milling BOM produces flour (the parent) and bran (a by-product) in fixed proportions.
- **Recoverable scrap**: Aluminum offcuts that go back to scrap stock for resale.

By-products use the **Yield** field instead of the scrap factor: `produced_qty = qty_per_parent × yield_percent × multiplier`. They are received as `WORK_ORDER_RECEIPT` movements at the destination warehouse when the work order completes.

### Phantom Assemblies

A BOM with **Phantom** = `Yes` represents an engineering grouping that is never physically stocked or transacted. Common example: a "Standard Fastener Kit" that lists 8 screws, 4 washers, 2 nuts. When a parent BOM consumes the phantom kit, the explosion engine substitutes the kit's own components — no separate work order is created for the phantom.

If a sub-assembly should never be stocked, mark its BOM phantom. Otherwise the planner will see a separate planned work order for the kit, which is rarely useful.

#### Multi-level phantom example

Phantoms can nest. Consider a _Steel Cabinet_ whose BOM lists a _Door Assembly Kit_ (phantom) as a component. The kit's BOM in turn lists a _Hinge Kit_ (also phantom):

```
Steel Cabinet (produces 1)
└── Door Assembly Kit (PHANTOM, qty 2)
├── Door Panel               qty 1
└── Hinge Kit (PHANTOM, qty 1)
    ├── Hinge body           qty 2
    └── Screw M4x10          qty 8
```

Releasing a work order for **5 cabinets** explodes as follows. The two phantoms are flattened out — only their leaf components appear on the WO's material lines:

| Component         | Per cabinet | × 5 cabinets | Line on the WO?        |
| ----------------- | ----------: | -----------: | ---------------------- |
| Door Panel        |       2 × 1 |           10 | Yes — leaf             |
| Hinge body        |   2 × 1 × 2 |           20 | Yes — leaf             |
| Screw M4x10       |   2 × 1 × 8 |           80 | Yes — leaf             |
| Door Assembly Kit |           — |            — | No — phantom flattened |
| Hinge Kit         |           — |            — | No — phantom flattened |

Two consequences worth noting:

1. **Quantities multiply at each level** — the cabinet needs 2 kits, each kit needs 1 hinge kit, each hinge kit needs 8 screws → 2 × 1 × 8 = 16 screws per cabinet, 80 across the run.
2. **No phantom on the floor.** The shop floor never sees "Door Assembly Kit" as a step or a stock item; it only sees the real materials it has to pick. MRP behaves the same way — it never plans a work order for the phantom kits, only for their raw materials and for the parent cabinet.

If you'd rather the kit be tracked as a real sub-assembly (its own WO, its own stock balance), un-mark the **Phantom** flag and the planner will start treating it as a regular intermediate product.

## Common Pitfalls

- **Activating a BOM without lines.** A BOM with zero active lines cannot be activated — you'll get an error. Add at least one component line in `Draft` status before transitioning.
- **Scrap factor on by-products.** By-product lines use **Yield**, not Scrap. The form lets you set both fields, but only Yield is honored for by-products.
- **Forgetting the UoM conversion.** If a BOM line uses a different UoM than the component's stock UoM (e.g., consume meters of a fabric stocked in square meters), the system needs a manufacturing UoM assignment with the conversion factor. Without it, BOM explosion errors with a missing-conversion message.
- **Marking a phantom assembly as a regular product.** If a sub-assembly should never be stocked, mark its BOM **Phantom**. Otherwise the explosion engine creates a separate planned WO for the phantom — almost never what you want.
- **Editing an Active BOM.** Active BOMs are immutable. To change the recipe, create a superseding version: end-date the current BOM, create a new version with the next label, point its **Supersedes** field at the old BOM, and activate it.

Source: https://docs.beelocity.com/en/manufacturing/bills-of-materials/index.mdx
