Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 Create BOM.
  3. Fill in the header:
    • BOM # — Unique identifier (e.g., BOM-2026-0042).
    • Version — Engineering version label (e.g., v1, rev-A).
    • TypeManufacturing for normal production. See 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 live on the Component Lines tab of the BOM detail page. Click Create and fill in:

FieldMeaning
Line #Sequence within the BOM (e.g., 10, 20, 30). Gaps are allowed for inserts.
ComponentThe product consumed (or, for by-products, produced).
By-productToggle on for outputs produced alongside the parent (e.g., bran from milling, recoverable scrap).
Qty / ParentHow 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.
UnitUoM of the quantity. May differ from the component’s stock UoM; conversion is read from the manufacturing UoM assignment.
ScrapExpected scrap factor as a fraction (e.g., 0.02 = 2%). Applied multiplicatively at explosion: requirement = qty_per_parent × (1 + scrap_factor).
YieldFor by-products only — the fraction of nominal output actually recovered. 1.0 = 100%.
Issue MethodWhen 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 PolicyLot picking policy when the component is lot-tracked: FEFO (first expired first out), FIFO (first in first out), Manual (operator picks).
OptionalToggle on if this line is included only when explicitly enabled at WO release.
Effective From / ToPer-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.

  1. On the Alternates tab, click Create.
  2. Pick the For Line to attach the alternate to.
  3. Pick the Alternate Product.
  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.

BOM Types

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

TypeMeaningWhen to use
ManufacturingStandard production BOM consumed by work orders and MRPThe default. Use for any BOM driving production.
EngineeringDesign-time BOM not yet released for productionUse during prototyping. Visible to engineering, ignored by MRP and work-order release.
DisassemblyReverse BOM — a single parent input is broken down into multiple outputsReturns processing, demolition, recovery.
SubcontractBOM used by a subcontract work orderStructurally identical to Manufacturing, but pairs with a subcontract routing.

BOM Lifecycle

BOMs progress through four statuses, mirroring routings:

StatusMeaningWhat you can do
DraftBeing authoredEdit any field; add or change component lines and alternates; activate when ready
Pending ApprovalSubmitted to the workflow engineApprovers review; can return to Draft on rejection
ActiveReleased for productionWork orders can reference this BOM; engineering changes require a superseding version
ObsoleteSuperseded by a newer versionHistorical 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:

  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. 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:

ComponentPer cabinet× 5 cabinetsLine on the WO?
Door Panel2 × 110Yes — leaf
Hinge body2 × 1 × 220Yes — leaf
Screw M4x102 × 1 × 880Yes — leaf
Door Assembly KitNo — phantom flattened
Hinge KitNo — 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.