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:
- Navigate to Manufacturing > BOMs in the sidebar.
- Click Create BOM.
- Fill in the header:
- BOM # — Unique identifier (e.g.,
BOM-2026-0042). - Version — Engineering version label (e.g.,
v1,rev-A). - Type —
Manufacturingfor normal production. See BOM Types for the alternatives. - Status — Start in
Draftwhile you build the components list. - Product — The parent product produced by this BOM.
- Default — Mark
Yesif 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
Yesif 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.
- BOM # — Unique identifier (e.g.,
- Click Save. The BOM is created in
Draftstatus.
Adding Component Lines
Component lines live on the Component Lines tab of the BOM detail page. Click Create and 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). |
| 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.
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.
Adding Alternates
Alternates are second-choice components that may substitute for the primary line — typically driven by availability, sourcing, or cost.
- On the Alternates tab, click Create.
- Pick the For Line to attach the alternate to.
- Pick the Alternate Product.
- Set Priority (lower number = preferred when multiple alternates exist).
- Set Qty Ratio if the alternate substitutes at a different rate (e.g.,
1.05if 5% more of the alternate is needed for the same outcome). - 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.
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. |
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; engineering changes require a superseding version |
| Obsolete | Superseded by a newer version | Historical work orders still reference it; new work orders cannot |
The status transition buttons on the BOM detail page reflect the current status:
- From Draft: Submit for Approval (→ Pending Approval) or Activate (→ Active).
- From Pending Approval: Approve & Activate (→ Active) or Reject (→ Draft).
- From Active: Mark Obsolete (→ Obsolete).
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:
- Open the BOM detail page.
- Click Explosion Preview in the action bar.
- Enter the target quantity (e.g.,
100). - 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. 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:
- 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.
- 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
Draftstatus 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.