An inventory template with recipes needs five tabs: Stock, Recipes, Products, Batches and Deliveries. You log a batch in one row, and every ingredient in that product's recipe comes off the shelf by itself; you log a delivery, and it goes back on. The whole trick is one conversion column (how many grams are in a pound, or in a can) and a handful of short formulas. Below is the sheet filled in with a real week from a small bakery, the formulas, and the file, which opens in Google Sheets, Excel or LibreOffice with no sign-up.
The short version
- Stock is counted in the unit you buy and count (lb, kg, can, each). Recipes are written in the unit you cook in (grams). One column converts between them.
- A batch is one row: date, product, how many batches, lot code. That row is what makes the ingredients go down.
- A delivery is one row. That's what makes them go up.
- Anything no recipe mentions (a spill, greasing pans, samples) goes in "Other out", or the count won't match.
- Download the template.
- When the sheet starts breaking, TaroStack does the same job with a button. More at the end.
The five tabs
| Tab | One row per | You type | It works out |
|---|---|---|---|
| Stock | Ingredient or packaging item | Unit, conversion, cost, opening count, reorder level, other out | Received, used in batches, on hand, LOW, value |
| Recipes | Ingredient in a product | Product, item, amount per batch | Cost in one batch, batches made, used so far |
| Products | Thing you sell | How many a batch makes, opening count, sold | Cost per batch, cost each, made, on hand |
| Batches | Time you make something | Date, product, how many batches, lot code, who | Nothing: this is the input |
| Deliveries | Delivery | Date, item, quantity, cost, supplier's lot | Nothing: this is the input |
The example is Windward Roots, the made-up taro business I use in these examples, for the week of September 21, 2026: six batches of taro sweet bread and three of kūlolo.
Stock: what's on the shelf
Here are six of the eleven rows at the end of the week:
| Item | Stock unit | Grams per unit | Opening | Received | Used in batches | Other out | On hand | Reorder at | Status |
|---|---|---|---|---|---|---|---|---|---|
| Bread flour | lb | 453.6 | 150 | 100 | 158.73 | 0 | 91.27 | 100 | LOW |
| Sugar | lb | 453.6 | 60 | 0 | 25.40 | 0 | 34.60 | 40 | LOW |
| Butter | lb | 453.6 | 36 | 36 | 19.05 | 1.5 | 51.45 | 24 | |
| Taro paste | kg | 1,000 | 40 | 30 | 43.20 | 0 | 26.80 | 25 | |
| Coconut milk | can | 400 | 48 | 24 | 12 | 0 | 60 | 24 | |
| Bread bags | each | 1 | 400 | 0 | 144 | 0 | 256 | 200 |
Butter's 1.5 lb of "other out" is the pans greased all week, which no recipe mentions. Leave out lines like that and the sheet will say you have butter you don't. (That's cause 2 in why inventory doesn't match.) Coconut milk shows the point of the conversion column: you buy it by the case, count it by the can, and the kūlolo recipe asks for 1,600 g, which the sheet turns into 4 cans. All eleven rows are worth $635.52 at cost.
Recipes and batches: the part that makes stock go down
The Recipes tab has one row per ingredient per product. The sweet bread's seven rows, for a batch of 24 loaves:
| Item | Per batch | Unit | Cost in one batch |
|---|---|---|---|
| Taro paste | 7,200 | g | $27.65 |
| Bread flour | 12,000 | g | $13.23 |
| Sugar | 1,920 | g | $3.85 |
| Butter | 1,440 | g | $12.70 |
| Instant yeast | 192 | g | $2.33 |
| Bread bags | 24 | each | $1.20 |
| Labels | 24 | each | $1.44 |
| Batch | $62.39 |
That's $2.60 a loaf before losses, the same figures as the steps in recipe costing, where one loaf a batch that doesn't sell brings it to $2.71.
On Friday, Ana makes two batches and types one row on the Batches tab: Sep 25, Taro sweet bread, 2, lot 260925. The Recipes tab now counts six batches of bread for the week, and the Stock tab takes another 52.9 lb of flour and 14.4 kg of paste off the shelf, along with 48 bags and 48 labels. Flour drops to 91.27 lb, under its reorder level of 100, and its row turns LOW. Nobody touched the Stock tab.
The formulas
Six short formulas do all of it, and the two on the Recipes tab are the ones that matter. For row 2:
Batches made =SUMIF(Batches!$B:$B, A2, Batches!$C:$C)
Used so far =C2*F2/INDEX(Stock!$D:$D, MATCH(B2, Stock!$A:$A, 0))
The first counts how many batches of that product were logged. The second multiplies the recipe amount by the batches, then divides by the item's "recipe units per stock unit" (453.6 for a pound in grams), so 12,000 g of flour times 6 batches becomes 158.73 lb.
On the Stock tab, for row 2:
Received =SUMIF(Deliveries!$B:$B, A2, Deliveries!$C:$C)
Used in batches =SUMIF(Recipes!$B:$B, A2, Recipes!$G:$G)
On hand =F2+G2-H2-I2
Status =IF(J2<=K2, "LOW", "")
"Used in batches" adds up every recipe row that uses the item, so labels, which go into both products, come off for both. It's plain SUMIF, INDEX and MATCH, so it behaves the same in Google Sheets, Excel and LibreOffice.
To open it in Google Sheets, Google's own steps are: open Drive, double-click the file, then File, Save as Google Sheets (Google).
Using it each week
- Log every batch the day it's made, with a lot code. It takes ten seconds and it's the row everything depends on.
- Log each delivery when it arrives, from the packing slip.
- Once a week, paste what you sold into the Products tab from your till or shop.
- Anything spilled, tasted or thrown out goes in "Other out" on the Stock tab.
- Once a month, count and compare with "On hand". Put the count in as next month's opening, and look into anything that's off by more than a little.
If you want a sheet for costing alone, the recipe costing template is simpler, and if a bakery's stock without recipes is what you need, there's the bakery inventory spreadsheet.
Where this stops working
Four things break it, usually in this order. Somebody renames "Bread flour" to "Flour, bread" on one tab and every formula that looked for it shows #N/A. The recipe changes, and last month's batches get recalculated with this month's amounts, because the sheet only knows one version. A second person logs the same batch. And the sheet has no idea which lot of flour went into which batch, so when the mill recalls a lot, it can't help; for that you need a lot tracking spreadsheet beside it, and two sheets to keep in step.
That's usually the point to look at software, and there's an honest comparison in inventory software vs a spreadsheet.
How TaroStack does it
In TaroStack the Batches tab is a button, and the four things that break this sheet don't happen. When Ana records Friday's two batches of sweet bread, each ingredient comes off by recipe from the lots that expire first, and the batch notes which lots it used, so when the mill recalls a flour lot the answer is already there. Recipes are versioned, so changing one in October doesn't rewrite September's batches. An item is one record rather than a name typed on three tabs, so renaming it breaks nothing. And units convert by themselves: buy by the case, stock by the each, cook by the gram.
The flour going LOW works better too. Instead of a reorder level typed once, the reorder list shows how many days of flour you have at the rate you're really baking, reorder points are suggested from how it moves, and you get an alert when it gets there. Deliveries record the supplier's lot and the price you paid, so stock is costed from real invoices. Counting, receiving and batches work on a phone with no signal.
Recipes and batches are on Standard at $99 a month, and the first 30 days are free. This sheet's items, recipes and opening stock import from CSV, with a preview of every row before anything is saved. If you'd like a hand setting up, ask, and we'll do it with you.
