Your morning delivery just arrived. Three cases of whole milk, two flats of croissants, and those seasonal pumpkin muffins you ordered last week. By Thursday, you're dumping sour milk and tossing stale pastries. Next Monday? You run out of milk at 10am during the morning rush. This isn't a vendor problem or a forecasting issue. It's a par calculation problem: cafés are using inventory math built for non‑perishables on products that spoil in days, not weeks. The result is either wasted product or avoidable stockouts — both of which hurt margin. Below is a practical, copy‑paste‑ready system you can paste into Google Sheets or Excel, plus a row‑by‑row spreadsheet layout with exact formulas you can paste into row 2, statistical and practical safety‑stock options (including lead‑time variability), perishability multipliers and rationale, 14‑day worked examples for milk, pastries and a seasonal SKU (all marked “example / illustrative”), case‑pack rounding and shelf‑life caps, short operational checklist and FAQ, and authoritative links for date‑marking and food‑safety constraints.
Important regulatory note (do not skip): refrigerated ready‑to‑eat foods held more than 24 hours must be date‑marked and are generally limited to 7 calendar days at 41°F (5°C) or below per FDA Food Code §3‑501.17. See FDA and CDC guidance linked at the end and follow your local health‑authority rules before changing holding targets.
H2 anchors for quick navigation
-
Spreadsheet template
-
Worked examples
-
Statistical safety stock
-
Practical perishability multipliers
-
Case‑pack rounding & order rules
-
Seasonality & decay
-
POS → units consumed
-
Lookback & smoothing
-
Simulation & scenarios
-
HowTo / FAQ
-
Operational checklist & KPIs
-
References & links
Spreadsheet template (copy-paste-ready)
Below is a one-row template you can copy into row 2 of a new sheet. Column letters are fixed so the row‑2 formulas are exact — paste headers in row 1, then paste or type the row‑2 formulas into the indicated columns.
Keep every order and shift perfectly aligned.
Coffehq helps you manage orders, inventory, and staff schedules seamlessly.
- Unified order processing
- Real-time inventory updates
- Staff shift coordination
No credit card required
| Column | Header (place these in row 1, columns A:AG) |
|---|---|
| A | SKU |
| B | Category |
| C | UnitSize (text) |
| D | CasePack (units per case; numeric) |
| E | ShelfLife_days (numeric) |
| F | LeadTime_days (LT) |
| G | DaysUntilNextDelivery (days until next scheduled delivery) |
| H | AvgDailyPOS_mu (POS sales average) |
| I | AvgDailyWaste (units/day) |
| J | StaffUsePerDay (units/day) |
| K | RecipesAllocatedPerDay (units/day used in recipes/catering) |
| L | AdjustedDailyUsage (units/day, computed) |
| M | StdDevDaily_sigma (stddev of daily usage) |
| N | ReviewPeriod_days (how often you replenish; days between orders) |
| O | ServiceLevel (e.g., 0.90) |
| P | zValue (numeric z corresponding to O) |
| Q | Multiplier_practical (practical safety multiplier, e.g., 0.20) |
| R | LeadTimeDemand (LTD) |
| S | StdDevLT (std dev of lead‑time demand) |
| T | SafetyStock_stat (statistical) |
| U | SafetyStock_mult (practical) |
| V | ROP_stat (reorder point, stat) |
| W | Par_stat (par/order‑up‑to, stat) |
| X | ROP_mult (reorder point, mult) |
| Y | Par_mult (par/order‑up‑to, mult) |
| Z | OnHand (current physical units) |
| AA | OnOrder (units expected) |
| AB | InventoryPosition (=OnHand+OnOrder) |
| AC | OrderMultiple (usually = CasePack) |
| AD | SuggestedOrderQty (case rounded) |
| AE | ShelfLifeCap (par capped by shelf life) |
| AF | ExpectedWasteProjection (simple projection) |
| AG | LeadTimeStdDev_sigmaL (std dev of lead time in days; optional) |
Row 2 — exact formulas (paste these into row 2 cells after you put numbers/text in the input columns shown above):
-
L2 (AdjustedDailyUsage) =H2 + I2 + J2 + K2
-
R2 (LeadTimeDemand = LTD) =L2 * F2
-
S2 (StdDevLT, simple if only demand varies) =M2 * SQRT(F2)
-
FullStdDevLT_calculation (if you track σL)
=SQRT( (M2^2 F2) + (L2^2 AG2^2) )
-
T2 (SafetyStock_stat - simple)
=P2 * S2
-
T2 (SafetyStock_stat - full if LT varies)
=P2 SQRT( (M2^2 F2) + (L2^2 * AG2^2) )
-
U2 (SafetyStock_mult)
=R2 * Q2
-
V2 (ROP_stat)
=R2 + T2
-
W2 (Parstat = μ(LT + RP) + SSstat)
= L2 (F2 + N2) + T2
-
X2 (ROP_mult)
= R2 + U2
-
Y2 (Parmult = μ(LT + RP) + SSmult)
= L2 (F2 + N2) + U2
-
AB2 (InventoryPosition)
= Z2 + AA2
-
AD2 (SuggestedOrderQty with case rounding)
= IF( AB2 >= Y2, 0, CEILING( (Y2 - AB2) / AC2 , 1) * AC2 )
-
AE2 (ShelfLifeCap = cap par to what can be sold before expiry using FIFO simple cap): = MIN(Y2, E2 * L2)
-
AF2 (ExpectedWasteProjection — simplified)
= MAX(0, AB2 - (L2 * E2))
Notes: Put your chosen z value (column P) as numeric — or create a small lookup table mapping common service levels (column O) to z in column P. Multiplierpractical (Q) is chosen from the perishability table below. If you track lead‑time variability, fill AG (σL). If not, set AG=0 and use the simpler SS formula. Use Parmult (Y) as your operational target if you prefer pragmatic multipliers; use Par_stat (W) if you have reliable σ and z choices.
| Service level | z value |
|---|---|
| 75% | 0.67 |
| 84% | 1.00 |
| 90% | 1.28 |
| 95% | 1.65 |
Statistical safety‑stock: formulas and when to use them
When you have ≥ 30 days of daily sales history and a measurable σd (demand variability), use the statistical method. It explicitly ties safety stock to demand variability and lead‑time uncertainty.
Lead‑time demand: LTD = μ × LT
If only demand varies and lead time is stable: SS = z × σd × sqrt(LT)
If both demand and lead time vary: SS = z × sqrt( (σd^2 × LT) + (μ^2 × σL^2) ), where μ = mean daily demand, σd = std dev of daily demand, LT = mean lead time (days), σL = std dev of lead time (days), z = z‑score for desired service level.
When to prefer the statistical method: you have clean POS daily usage, ≥30 observations; lead times vary; you want measurable service levels (e.g., 90%). When to prefer the practical multiplier method: limited history (<30 days) or noisy POS data; many in‑house baked items; you want fast, conservative rules that are easy to teach staff.
Practical perishability multipliers (defaults & how to calibrate)
These are practical starting points — tune them using your waste logs and service observations. Multiplier_practical Q is a percent of LTD used as safety stock.
| Perishability tier | ShelfLife_days | ShelfLifeFactor | Multiplier_practical Q | Rationale |
|---|---|---|---|---|
| Ultra (≤ 3 days) | ≤ 3 | 0.30 | 0.10 (range 0.05–0.25) | Waste cost > stockout cost; order smaller, more often |
| Short (4–7 days) | 4–7 | 0.50 | 0.15–0.25 (default 0.20) | Moderate buffer for variability while limiting stale inventory |
| Medium (8–14 days) | 8–14 | 0.70 | 0.05–0.15 (default 0.10) | Longer shelf life allows higher buffer per LTD |
| Long / non‑perishable (>14 days) | >14 | 1.0 | 0.20 (or use EOQ/SS methods) | Ambient goods; standard inventory math applies |
-
Start with the default multiplier for the tier.
-
Run the template for 30 days, track waste% and stockouts.
-
If waste > target (e.g., >5% of units) → reduce multiplier by 10–25%.
-
If stockouts occur more than X times per month → increase multiplier or switch to statistical SS if you have enough data.
Always cap suggested Par so it never implies holding product past legal/safe shelf life (see ShelfLifeCap formula).
Case‑pack rounding and minimum‑order rules
Order quantities must generally be rounded to vendor case sizes or baker batch sizes.
SuggestedOrderQty (case rounded) = MAX(0, CEILING( (Par - InventoryPosition) / CasePack) * CasePack ). Excel/Sheets examples below.
If you must honor a SupplierMinQty, use: =IF(AB2>=Y2,0, MAX( CEILING((Y2-AB2)/D2,1)*D2 , SupplierMinQty, D2 ))
If you bake in‑house and have baker batch size (e.g., batch = 10 croissants), use the same CEILING logic with batch size as OrderMultiple.
POS → units consumed (what to put into AvgDailyUsage)
Always use units consumed, not just POS sales: AdjustedDailyUsage = AvgDailyPOS + AvgDailyWaste + StaffUsePerDay + RecipesAllocatedPerDay
POS sales: pull from your POS historical report (sales by SKU). Use a representative lookback (14/30/90 days depending on seasonality). Waste: include average daily throwaways you record in waste logs. Staff use / comps: drinks made for staff, promotional giveaways. Recipe allocations: items consumed as ingredients (e.g., milk in batch cold brew counts toward milk usage).
Example: AvgDailyPOS_mu (milk) = 5.6 gal/day, AvgDailyWaste = 0.2, StaffUsePerDay = 0.1, AdjustedDailyUsage = 5.6 + 0.2 + 0.1 = 5.9 gal/day. Use AdjustedDailyUsage (column L) for all LTD and Par calculations.
Outlier handling: winsorize or remove holiday spikes if they are not representative; keep a separate “promo” forecast column for planned events.
Lookback windows & smoothing (practical rules)
Which lookback window? Ultra‑perishables (pastries): rolling 14 days. Standard perishables (milk): rolling 30 days if stable; 14 days if recent shifts. Seasonal SKUs: use comparable period last year or a season‑specific window.
Formulas: 14‑day average = =AVERAGE(RangeOfLast14Days); 14‑day stddev = =STDEV.S(RangeOfLast14Days). Exponential weighted moving average (EWMA) example (alpha=0.3): EWMAt = 0.3 Demandt + 0.7 EWMA_{t-1}.
Rule‑of‑thumb: For fast‑changing SKUs, weigh recent 7–14 days more heavily (EWMA alpha 0.3–0.5). For stable SKUs, use 30–90 day rolling averages.
Worked examples — 14‑day illustrative series
All examples below are illustrative/sample data. Replace with your POS history.
1) Milk — 14‑day example series (gallons/day, illustrative): Day1..Day14: 5.0, 6.0, 5.5, 5.8, 6.2, 5.4, 5.9, 5.7, 6.1, 5.3, 5.6, 5.8, 5.5, 5.9. μ ≈ 5.693 gal/day; σd ≈ 0.332 gal/day. Example inputs: LT = 2 days, RP = 0, Service level = 84% (z=1.00), Q = 0.20, CasePack = 6 gal, ShelfLife_days = 5, DaysUntilNextDelivery = 1, OnHand = 8 gal, OnOrder = 0, optional σL = 0.5 days.
Step calculations (statistical method): LTD = μ × LT = 11.386 gal. StdDevLT (simple) = σd × sqrt(LT) ≈ 0.47 gal. SSstat = z × StdDevLT = 0.47 gal. ROPstat ≈ 11.86 gal. Parstat = L × (LT+RP) + SSstat ≈ 11.86 gal.
Full statistical SS if lead time varies: SSfull = z × sqrt( (σd^2 × LT) + (μ^2 × σL^2) ) ≈ 2.884 gal → ROPstat_full ≈ 14.27 gal (shows σL can dominate).
Multiplier/practical method: SafetyStockmult = LTD × Q = 2.277 gal → Parmult ≈ 13.663 gal. Case‑pack rounding: Parmult ≈ 13.7 → needed = 13.7 − InventoryPosition (8) = 5.7 → CEILING(5.7/6)*6 = 6 gal (1 case). ShelfLifeCap = MIN(Parmult, ShelfLife_days × μ) = MIN(13.7, 28.47) = 13.7 (no cap effect).
2) Croissant (pastry) — day‑of‑week series (illustrative): Mon=25, Tue=40, Wed=40, Thu=45, Fri=65, Sat=65, Sun=55 (repeat for two weeks for a 14‑day lookback). Inputs: ShelfLife_days = 2, LT = 1 day (baked nightly), RP = 0, Q = 0.10, BakerBatchSize = 10 croissants.
Example: Friday bake to cover Fri+Sat demand = 65 + 65 = 130. Buffer 10% = 13 → raw = 143 → CEILING(143/10)*10 = 150 croissants. Expected waste projection = Produced − Expected sales = 150 − 130 = 20 croissants (estimate). Use day‑aware pars per bake day and round to batch size.
3) Seasonal SKU — Pumpkin muffin (illustrative): Peak daily = 30 muffins/day. BasePar_peak example: μ×3 + μ×1×0.5 = 105. WeeksSincePeak=2, DecayRate=0.15/week → multiplier = 0.70 → Current Par ≈ 73.5 → round to 74 muffins. Apply batch rounding and shelf‑life cap as usual or use comparable‑period averages if available.
Small scenario test / simulation (how you might compare policies)
Create a simple simulation tab that uses the 14‑day demand series and runs a 30‑day forward simulation comparing policies: Policy A: Standard par (days of stock rule); Policy B: Perishability‑weighted par (practical multiplier); Policy C: Statistical par (z, σ based). For each simulated day, simulate demand (use historical series repeated or random draw), decrement inventory, check for stockouts, and track expiries (FIFO, items older than shelf life expire).
-
Total waste units
-
Stockout events / lost sales units
-
Average days‑of‑inventory
-
Total units ordered and number of orders
-
Estimated lost‑sales cost (if you set a per‑unit lost margin)
Sensitivity runs: Demand ±20%, Lead time +/− 1 day, Changes in Multiplier_practical. Simulation implementations are simple with spreadsheet formulas if you model inventory day‑by‑day. Export to Python/R for more robust analysis.
Case examples (quick recaps with rounding and actionable formulas)
Milk (compact example, illustrative): L = 5.693 gal/day, LT = 2, RP = 0, Q = 0.20, CasePack = 6 → Par_mult ≈ 13.663 → round to case multiple with SuggestedOrderQty formula =IF(AB2>=Y2,0,CEILING((Y2-AB2)/AC2,1)*AC2).
Croissant (compact): Friday coverage = Fri + Sat = 130; Buffer 10% = 13 → raw = 143 → baker batch 10 → final = 150.
Pumpkin muffin (compact seasonal): Peak base par 105 → WeeksSincePeak=2 → multiplier 0.70 → current par ≈ 74 → round to batch size or display case pack.
Label all these numbers as illustrative/sample only — replace with your POS data before acting.
Operational checklist (who does what & KPIs)
Daily quick check (morning):
-
Top 10 perishables
check OnHand vs InventoryPosition and ROP; reorder if SuggestedOrderQty > 0.
-
Check incoming deliveries and reconcile OnOrder.
-
Spot-check date‑marks (follow FDA §3‑501.17) and remove expired items.
Monthly cadence:
-
Owner/manager reviews waste logs and top 20 perishables first Monday of month.
-
Tune Multiplier_practical and service levels
aim for waste 3–5% for perishables (use as KPI target).
-
Recompute AvgDailyUsage using rolling 14/30/90 windows as appropriate.
Who owns it: assign category owners (dairy, pastries, seasonal, dry goods). KPIs to track: Waste % by SKU, Fill rate, Stockouts per period, Days‑of‑inventory (average), Orders per week.
HowTo / FAQ (short answers)
-
Q
Which safety‑stock method should I use? A: If you have ≥30 days of clean daily data and measurable σd, use the statistical method. If not, use the practical multiplier per perishability tier and track results for 30 days.
-
Q
How do I avoid ordering more than will sell before expiry? A: Cap your Par to ShelfLife_days × AdjustedDailyUsage and use display/quality thresholds.
-
Q
Do I have to track lead‑time variability? A: If your supplier frequently runs late, yes — σL can dominate safety stock. Measure actual delivery lead times for a month and compute σL.
-
Q
How do I include waste/staff use? A: Add AvgDailyWaste, StaffUsePerDay, and RecipesAllocatedPerDay to POS sales to form AdjustedDailyUsage L (column L).
-
Q
Is it better to order daily or weekly for pastries? A: For ultra‑perishables, daily or every‑other‑day production minimizes waste. Use the par per bake day computed from DOW demand and round to baker batch.
What I changed (short note on templates and examples)
The formulas above are intentionally explicit and cell‑referenced so operators can paste them into Google Sheets or Excel without macros. All numeric worked examples are illustrative/sample only — replace with your POS data before changing ordering behaviour. If you need a downloadable .xlsx/.gsheet file, copy the headers and formulas above into a new workbook.
References & authoritative food‑safety links
| Resource | Link / Notes |
|---|---|
| FDA Food Code — Time/temperature control for safety (date marking) | FDA Food Code §3‑501.17 (see https://www.fda.gov/media/127796/download) |
| CDC — Date marking and restaurant practices | https://www.cdc.gov/restaurant-food-safety/php/practices/date-marking.html |
| FoodSafety.gov — Cold food storage charts | https://www.foodsafety.gov/food-safety-charts/cold-food-storage-charts |
| Inventory method references | See QuickBooks & InFlow Inventory resources; common inventory textbooks document SS = z × σLT and the full SS formula including σL |
Links provided above are standard industry resources — treat the inventory math as general supply‑chain practice, and verify regulatory date‑marking with your local health authority.
Meta title suggestion: Perishable Par Levels & Reorder Points — Free Cafe Spreadsheet Template (milk, pastries, seasonal). Meta description suggestion: Step‑by‑step perishable par math for cafés: copy‑paste spreadsheet template, safety‑stock multipliers by perishability, case‑pack rounding, and 14‑day worked examples for milk, pastries and seasonal SKUs.
If you’d like, I can paste a prefilled row‑by‑row CSV you can paste straight into Google Sheets with the three worked examples included, or produce the same workbook as an .xlsx file you can download (tell me where you prefer it hosted or if you want a generated file attached).
Pro tip: start with the practical multiplier for each perishability tier and run a 30‑day test while logging waste and stockouts — switch to the statistical method once you have ≥30 days of clean daily data and measurable σd.
Ready to brew operational excellence?
Join hundreds of coffee shops using Coffehq to boost efficiency, reduce waste, and elevate customer satisfaction.