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_SKU | The item being built. Repeat it on every component row that belongs to it. |
| Level | 1 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_SKU | The part or material consumed, matching the SKU in your inventory list. |
| Quantity_Per | How many units of the component one unit of the parent needs. Decimals are fine for material measured by length or weight. |
| UOM | Unit 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_Percent | Expected loss on this component: offcuts, spoilage, setup waste. Leaving it at 0 understates your material cost on every build. |
| Unit_Cost | Current cost of one component unit. This is the figure that goes stale fastest. |
| Extended_Cost | Quantity_Per x Unit_Cost, uplifted by Scrap_Percent. Summing this per parent gives the material cost of the finished item. |
| Supplier | Who the component is bought from, so a price change or a lead-time problem can be traced to one vendor. |
| Notes | Cut 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!”
“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.”