Inventory

What Milk Waste Costs Your Coffee Shop Every Week

Mark, founder of Parly·September 2, 2026·6 min read

The jug you poured out and never priced

Close on a Tuesday. Somebody lifts the half gallon of whole out of the reach-in, sniffs it, checks the date, and tips it down the drain. Nobody flinches, because it is one jug and the shift is over. That jug had a price. It came off a delivery you paid for, and nothing in your register will ever mention it again.

Do that four times a week at, say, $3.40 a half gallon and you have poured about $700 a year into the sink from that one habit alone. Nothing was stolen, nobody was careless, and no report will ever show it, because a POS records what customers bought and has no opinion about what went down the drain.

That is what makes milk different from every other line on your order. Beans go stale slowly and visibly. Cups do not spoil. Milk is perishable, ordered several times a week, poured by hand into every drink, and steamed in quantities nobody measures after the pitcher hits the wand. It is the ingredient most likely to leave your shop without earning a cent, and the only one where the loss is invisible unless you go find it.

Where a cafe actually loses milk

Four places, and only one of them is the one you already think about.

Spoilage. Jugs that pass their date before they get poured. This is the visible one, and in my experience it is rarely the largest. It is also the one that is not really a milk problem: milk that expires is milk you ordered and did not need, which makes it an over-ordering problem wearing a spoilage costume.

Steaming overpour. The big one, and nobody logs it. A barista steams for a 12 ounce latte, pours 10 ounces, and tips the rest. Two ounces on one drink is nothing. Two ounces across 200 milk drinks a day is 400 ounces, more than three gallons, every single day. At $5.20 a gallon that is over $16 a day, roughly $114 a week, going down the drain in two-ounce increments nobody would ever call waste.

Practice and dial-in. New hire learning latte art, someone re-steaming after a bad pour, milk burned to 180 degrees and started over. Necessary, most of it. Still milk that left the shelf and never rang up.

Comps and remakes. The wrong drink, the dropped drink, the regular whose coffee is on the house. The drink cost you a full pour and returned zero. Your gross sales line will not show it, which is part of why the honest food cost number uses net sales rather than gross.

The pitcher, not the fridge

Owners look for milk waste in the reach-in, where the expired jugs are. It is mostly at the steam wand, in ounces, at a pace no one notices during a rush.

Put a dollar figure on it this week

Waste stays a shrug until it has a dollar sign on it. Two numbers turn it into money, and you already have both.

Number one: what you should have poured. Take last week's milk drinks from Square, multiply each by its pour size, and split by which milk it used. That is the same calculation as working out your real milk usage, and it gives you ounces your sales can account for.

Number two: what actually left. Starting count plus everything delivered, minus the ending count. That is what physically disappeared off the shelf.

Subtract, then price it. Here is the worked shape, with illustrative numbers you should replace with your own:

LineWhole milkOat
Sales say you poured108 gal46 gal
Shelf says you used122 gal51 gal
Gap14 gal5 gal
Your delivered cost$5.20/gal$12.40/gal
The week's number$72.80$62.00
$135one illustrative week of unaccounted milk14 gallons of whole and 5 of oat, priced at what you paid for them

About $135 a week in this example, roughly $7,000 a year, from an ingredient nobody thought was a problem. Run yours and the total will be different. The useful part is not the dollar amount, it is that the amount exists at all and you now have it in a currency you make decisions in.

One honest caveat: that gap is waste plus untracked usage plus count error, all bundled together. It is a starting number, not an indictment. What makes it worth having is that it moves week to week, and you can watch it move.

A milk waste log you can print

The gap tells you how much. It does not tell you where, and you cannot fix a number you cannot attribute. That takes two weeks of writing things down, and then you can stop.

Tape this on the reach-in door with a pen on a string. One line per event, no drink names, no explanations, no blame.

DateShiftMilkAmountWhy (spoil / steam / practice / comp)Initials
AM / PMoz or jugs
AM / PMoz or jugs
AM / PMoz or jugs

Four rules make the difference between a log that works and a page of blank rows:

  1. Two weeks, then it comes down. A permanent log gets ignored by week three. A two-week measurement gets filled in, because it has an end.
  2. Estimate in pitcher marks, not ounces. "Half a 20 oz pitcher" is a fine entry. Precision that requires a scale during a rush is precision that does not get recorded.
  3. Nobody gets in trouble for a line on this sheet. Say it out loud on day one. A log people fear is a log that reads zero and teaches you nothing.
  4. Total it by reason, not by person. You are looking for which of the four leaks is biggest, and that is a training question or an ordering question, never a staffing one.

Two weeks in, the log tells you which bucket owns your gap and the dollar math tells you what the bucket is worth. Now you are fixing the right thing.

The two fixes that pay

Match the pitcher to the drink. If steaming is your biggest bucket, the fix is not a lecture about waste. It is smaller pitchers and a pour line. A 12 ounce latte steamed in a 32 ounce pitcher will always leave milk behind, because there is nothing in the pitcher telling anyone where to stop. Give the 12 ounce drink a 20 ounce pitcher and a marked fill level and the overpour drops without anybody being careful about anything. This is the same trap as loose recipes: an amount nobody specified becomes three different amounts on three different shifts, which is exactly how counts and sales stop agreeing.

Order the days, not the week. If spoilage owns your gap, you are ordering more than the days ahead of you need. Milk arrives on a cutoff and expires on a date, so the right order covers the stretch to the next delivery and not one jug more. Per-weekday usage plus a real par level per milk beats a standing order every time, because a standing order is a guess you made once and kept paying for.

Do the subtraction first. Pull last week's milk drinks, multiply by your pours, count what came in and what is left, and price the difference at what you paid. That single number, in dollars, on one milk, is enough to tell you whether the log is worth taping up on Monday.