Bill of Materials Template

A free multi-level bill of materials template in CSV, with quantity per unit, scrap allowance, unit cost and cost rollup columns.

Bill of Materials Template

A multi-level BOM in a flat file: parent and component SKUs, quantity per unit, scrap allowance, unit cost, and a rolled-up material cost per finished item.

By Tibeau De Grauwe, FounderUpdated September 2026

  • 25 products free
  • No credit card
  • 10-min setup
Download the bill of materials template
CSV file, one row per component, two levels worked through.

What is in the template

The file holds one row per component, not one row per product. A workbench needing five parts becomes five rows sharing a Parent_SKU, which is what lets you filter to a single product, sum its material cost, or pull every product that uses one component when a supplier raises a price.

The worked example goes two levels deep. A finished workbench consumes a frame subassembly, a worktop, feet, bolts and a carton; the frame subassembly then consumes steel tube, plate, powder coat and welding wire. That second level is where most real BOMs live and where most single-sheet templates give up.

Columns explained

Parent_SKUThe item being built. Repeat it on every component row that belongs to it.
Level1 for components of the finished good, 2 for components of a subassembly, and so on. This is what makes the BOM multi-level in a flat file.
Component_SKUThe part or material consumed, matching the SKU in your inventory list.
Quantity_PerHow many units of the component one unit of the parent needs. Decimals are fine for material measured by length or weight.
UOMUnit of measure for Quantity_Per. Mixing ea, kg and m in one BOM is normal and is exactly why this column has to exist.
Scrap_PercentExpected loss on this component: offcuts, spoilage, setup waste. Leaving it at 0 understates your material cost on every build.
Unit_CostCurrent cost of one component unit. This is the figure that goes stale fastest.
Extended_CostQuantity_Per x Unit_Cost, uplifted by Scrap_Percent. Summing this per parent gives the material cost of the finished item.
SupplierWho the component is bought from, so a price change or a lead-time problem can be traced to one vendor.
NotesCut lists, substitution rules, revision comments. Anything the person building it needs and the columns do not capture.

How to fill it in for your own products

Start from the finished item and list only what it directly consumes. If one of those things is itself built rather than bought, give it a SKU, leave it as a single Level 1 row, and describe its contents in a separate block of Level 2 rows. Trying to flatten everything into one level produces a BOM that cannot be costed and cannot be built from.

Decide early whether consumables belong in the BOM. Welding wire, glue and finish are genuinely consumed per unit and can be entered as a fractional quantity by weight or volume, which is more honest than treating them as overhead and wondering later why material cost never matches purchasing.

Where a BOM spreadsheet stops working

The first crack is costing. Unit_Cost is a snapshot of what a component cost on the day someone typed it, and nothing in the file updates when a supplier raises a price, so quotes keep being produced from a margin that quietly stopped existing months ago.

The second is stock. Completing a production run should reduce every component on the BOM by the quantity consumed. In a spreadsheet that is a manual edit across a dozen rows in a different file, so it gets skipped under pressure and component stock drifts until a physical count finds the gap.

The third is revision history. A CSV has no record of what changed or when, so an old quote cannot be reconstructed and a design change cannot be traced to the run that first used it. In StockFlow, BOM authoring and cost rollup are on every plan; automatic stock deduction when a production order completes is part of the Production module, included on Professional and above or available as a $4/month add-on.

Related resources

Trusted by small businesses

What our customers say

Super Kind! Quick replies from their support and very easy fixes, changed the dashboard a bit and customized it. Also gave me 450 items extra on the free plan just for me. Highly recommend and again great service!

Erasable Trading AU

Best customer service! Stockflow's customer support is fast and extremely helpful. They assisted me with customization of the software to improve my experience as a user.

Justin M.

Co-Owner, Consumer Goods

Frequently asked questions

How do I make a multi-level BOM work in a spreadsheet?
Use the Level column and give the subassembly its own rows as a parent. In the sample file, SA-3010 appears as a Level 1 component of FG-2001 and again as a Level 2 parent with its own components. Filtering by Parent_SKU shows one level at a time.
Should scrap be built into Quantity_Per or kept separate?
Keep it separate. Quantity_Per should stay the engineering quantity so the design is readable, and Scrap_Percent should carry the allowance. Baking waste into the quantity makes it impossible to tell later whether a number reflects the design or an old yield problem.
How do I cost a BOM in the spreadsheet?
Extended_Cost per row is Quantity_Per x Unit_Cost x (1 + Scrap_Percent / 100). Sum Extended_Cost for all rows with the same Parent_SKU to get that item's material cost. Subassembly cost has to be rolled up first and entered as the subassembly's Unit_Cost.
Does this template deduct stock when I build something?
No. It records what a build should consume. Reducing component quantities after a production run is a manual edit in a spreadsheet, which is the step that most often gets skipped and is where component stock starts drifting from reality.
How do I handle BOM revisions?
A flat file has no version history, so keep a dated copy each time a BOM changes and note the revision in the Notes column. Without that, a costing done last quarter cannot be explained, because the BOM it was based on no longer exists.