A bill of materials answers a question that sounds simple: what goes into one of these? It is worth building carefully because almost everything downstream depends on it. Product cost, purchasing requirements, stock consumption, and production planning all read from the same structure. Get it wrong and the errors do not stay put — they propagate into pricing and inventory valuation.
Different industries use different words. Manufacturing says bill of materials, food and cosmetics say recipe or formulation, and craft businesses often say pattern or spec. The structure is identical.
What actually belongs on a line
A usable BOM line carries more than an item and a number:
- Component — a specific stocked item, not a description. "Cotton twill, 280gsm, navy, SKU FAB-0412", never "fabric".
- Quantity per unit — expressed in the unit you consume, not the unit you purchase.
- Unit of measure — with an explicit conversion to the purchase unit stored on the item.
- Scrap or yield factor — the expected loss on this specific line.
- Operation or step — where in the process it is consumed, if you track stages.
- Alternates — approved substitutes, so a shortage does not stop production while someone checks whether a swap is allowed.
Units of measure cause more BOM errors than anything else. You buy fabric by the metre and consume it in square centimetres; you buy fragrance by the kilogram and consume grams. Store one conversion on the item record and let every BOM inherit it. Conversions written into individual BOM lines are where the silent factor-of-ten mistakes live.
Single-level or multi-level
A single-level BOM lists every raw material flat. It is fine for genuinely simple products, and it is the right place to start.
A multi-level BOM introduces intermediates: things you make in order to make something else. A wax blend, a dough base, a dyed batch of yarn, a finished candle that goes into a gift set. Each has its own BOM, its own cost, and often its own stock balance.
Use a multi-level structure when any of these is true:
- An intermediate is used in more than one finished product
- You produce and hold the intermediate separately from finished goods
- The intermediate has its own yield loss, cure time, or shelf life
- You need cost visibility at the intermediate stage
The payoff is that a shared intermediate is defined once. When the wax supplier raises prices, one item cost changes and every product containing that blend recosts automatically. In a flat structure the same change means editing every BOM that happens to contain wax, and missing one is normal.
The cost is complexity. Do not create intermediates for their own sake — an extra level for something used in exactly one product and never stocked separately buys you nothing.
Scrap belongs where the loss happens
There are two different losses and they behave differently. Line-level scrap is material-specific: cutting waste on fabric, trim loss on leather, evaporation in a reduction. Assembly-level yield is whole units failing: a batch that does not set, an item that fails final inspection.
Effective quantity = quantity per unit / (1 - scrap rate)
Batch input required = required output / first-pass yield
Putting material-specific waste into a single top-level allowance seems simpler and produces wrong answers as soon as the mix changes. If a product has 12% cutting waste on fabric and near-zero on hardware, a blanket 6% overstates the hardware and understates the fabric. Redesign the product to use less fabric and the blanket figure will not move, even though the real waste has fallen.
A worked multi-level roll-up
A candle workshop sells a gift box of four. The candle is an intermediate used in several products, so it gets its own BOM.
Level 2 — one candle
| Component | Quantity | Rate | Cost |
|---|---|---|---|
| Soy wax | 180 g | EUR 4.20/kg | EUR 0.756 |
| Fragrance oil | 18 g | EUR 62.00/kg | EUR 1.116 |
| Wick assembly | 1 | EUR 0.090 | EUR 0.090 |
| Glass jar | 1 | EUR 1.350 | EUR 1.350 |
| Label | 1 | EUR 0.110 | EUR 0.110 |
| Materials | EUR 3.422 | ||
| Scrap adjustment | 97% first-pass yield | EUR 3.528 | |
| Labour | 4.0 min | EUR 16.40/h | EUR 1.093 |
| Overhead | 4.0 min | EUR 11.20/h | EUR 0.747 |
| Candle cost | EUR 5.368 |
Level 1 — gift box of four
| Component | Quantity | Rate | Cost |
|---|---|---|---|
| Candle (intermediate) | 4 | EUR 5.368 | EUR 21.472 |
| Rigid gift box | 1 | EUR 1.850 | EUR 1.850 |
| Moulded insert | 1 | EUR 0.420 | EUR 0.420 |
| Ribbon | 0.6 m | EUR 0.80/m | EUR 0.480 |
| Materials | EUR 24.222 | ||
| Assembly labour | 3.0 min | EUR 16.40/h | EUR 0.820 |
| Overhead | 3.0 min | EUR 11.20/h | EUR 0.560 |
| Packing yield | 99% | EUR 0.258 | |
| Gift box cost | EUR 25.860 |
The structure is what makes this maintainable. Fragrance oil rising from EUR 62 to EUR 74 per kilogram changes one item record; the candle recosts to EUR 5.591 and the gift box to EUR 26.76, along with every other product containing that candle. Nobody edits a BOM. Nobody has to remember which products are affected.
It also shows why single-level BOMs quietly rot. In a flat structure that price change requires editing the candle lines in every product that contains one — and the single missed product is now underpriced with nothing to indicate it.
Versioning and effectivity
BOMs change: suppliers substitute, designs improve, packaging is redesigned. If you overwrite the current version, you lose the ability to explain last quarter's costs, and any historical margin analysis becomes fiction.
Keep three things:
- A version number on every BOM, incremented on change.
- Effective dates, so production before the change costs at the old structure.
- A reason — one line is enough. "Switched to supplier B, jar 1.35 to 1.28" saves an archaeology session later.
This matters most where you are batch-traced for regulatory reasons. A food or cosmetics business that cannot reconstruct the exact formulation of a batch produced eight months ago has a compliance problem, not just an accounting inconvenience.
Where BOMs go wrong
- Free-text components. "Blue thread" is not linkable to a stock item, a price, or a purchase order.
- Purchase units in the quantity field. A line saying 1 where it means one 5-litre drum will overstate cost by orders of magnitude.
- Packaging omitted. Boxes, inserts, tissue, tape, and labels are real cost and are left out constantly.
- Prices copied rather than referenced. A BOM with hard-coded prices is accurate on the day it is written and wrong from then on.
- Labour ignored. A BOM covering only materials is a materials list; it cannot produce a product cost.
- No owner. When several people edit BOMs informally, versions diverge and nobody knows which is current.
Nearly all of these are structural rather than careless — they follow from BOMs living in a spreadsheet where a component is a string, a price is a typed number, and there is no relationship to keep the two in step. The value of holding BOMs against real item records is not the tidiness; it is that a price change propagates automatically and a component cannot silently stop existing.
Rules that keep a BOM honest
- Every line points to a real stock item with its own unit conversion and current cost.
- Quantities are in consumption units, always.
- Scrap sits on the line where the loss occurs; whole-unit yield sits at assembly level.
- Create an intermediate when it is shared, stocked, or separately costed — not otherwise.
- Version every change with an effective date and a one-line reason.
- Include packaging and labour, or accept that the output is not a product cost.
- Re-roll costs whenever purchase prices move, and review the full range at least twice a year.
Done properly, the BOM stops being a document someone maintains and becomes the thing your costing, purchasing, and production planning all read from. That is the point at which product costing stops being an annual project.