Inventory

How Much Milk Does a Coffee Shop Use? Find Yours

Mark, founder of Parly·July 24, 2026·6 min read

Why the average milk number is wrong

It is late afternoon and your dairy order is due before the cutoff. You are standing at the reach-in with your phone, working out how much whole milk, half and half, heavy cream, and oat to put down for tomorrow. So you do what everyone does first. You look up how much milk a coffee shop goes through in a week.

The internet has an answer ready. One cafe guide puts an average shop selling 200 to 300 cups a day at roughly 145 to 217 litres of milk a week, call it 38 to 57 gallons (Start Right Retail, accessed July 2026). Tidy. Also useless to you standing at that fridge, and here is why.

That range averages away everything that makes your milk order yours: which drinks you actually sell, whether your default is oat or whole, how often people swap, and which day it is. A benchmark is the mean of a thousand shops that are not yours. Your dairy order is one shop on one day. The average cannot tell whole from oat, and it cannot tell Tuesday from Saturday. You do not need to know what a coffee shop uses. You need to know what yours used, and that number is already sitting in your Square.

You don't use milk, you use four milks

"How much milk" is the wrong unit. You do not order milk. You order whole, half and half, heavy cream, and one or two alt milks (oat, usually), and each of those comes from a different place on a different clock. Whole, cream, and half and half ride the dairy truck on a next-day cutoff. Oat rides in with your paper-goods supplier or a case order. Roll them into one "milk" number and you have blurred four separate orders into a single guess.

They also move independently. A week that skews toward lattes and cortados burns whole milk and barely touches cream. A week heavy on cold foam pulls cream. A matcha-forward week where oat is the house default hardly dents the dairy at all. One "gallons per week" figure cannot hold four ingredients that rise and fall on different drinks. Split milk into the four things you actually reorder and the average stops being a number and becomes four numbers, only one of which was ever on that truck.

The number is already in your Square

Here is the part the benchmark genre skips. You do not have to estimate any of this. Every milk pour you made this month already went through your register as a drink sale, and the ingredient math runs backward from there.

Your Square records the sale, not the pour. "Iced latte, oat, $6." That line is what sold. At my shop that drink pours about ten ounces of oat milk, plus a cup and a lid. A register tracks finished goods and stops there. Square says so on its own product page (accessed July 2026): its inventory "only tracks finished goods." So the sale alone will not tell you the milk. But the sale plus the recipe will.

Run it forward. Take one drink, sold count times pour size. My own recipe math, as an illustration: an iced matcha latte is about twelve ounces of milk, so 47 of them sold is 564 ounces, about 4.4 gallons of oat milk from one drink on one morning. Do that for every milk drink on the menu, add up the ones that poured oat, add up the ones that poured whole, and you have your two real milk numbers for the day, built from sales you already have. No survey, no average. This is the same sold-versus-used gap a register cannot close on its own, worked out in full in what a POS can and cannot track for a cafe.

Your default milk and swap rate decide the split

Two cafes can sell the exact same 300 drinks and order completely different milk. What splits them is two settings almost nobody writes down: your house default, and your swap rate.

Your default is whichever milk goes in when the customer says nothing. If your default latte is oat, most of your latte volume lands on the oat line and your whole-milk order is smaller than the drink count suggests. Flip the default to whole and the same menu, the same sales, sends the milk the other way.

Your swap rate is how often the customer overrides that default. Every "make it oat" moves ounces off one line onto another without changing the receipt total by a cent. This is exactly where a modifier-blind tool goes wrong. It reads the drink and misses the swap. Square's own Recipes beta cannot see it at all: by Square's documentation (accessed July 2026), recipes "cannot be applied to modifiers or multi-variation items." But the swap is not noise. It is the number that decides how the milk splits. Read the modifier on each ticket and the split is exact. Ignore it and your whole-versus-oat order is off every single day.

Milk by the day, not the week

Even with the split right, a weekly number lies to you at the fridge, because you do not order once a week. You order against a cutoff, for the days until the next delivery. And the days are not the same.

Saturday sells more drinks than Tuesday, and a different mix of them. At my shop the weekend crowd orders more iced, more sweet, more oat, while the weekday regulars lean hot, drip, whole. So "38 gallons a week" tells you nothing about how much whole milk to have in the reach-in on Friday night for a Saturday that runs oat-heavy. Divided evenly it is wrong on both ends: too much whole for the weekend, too little for the week.

The fix is the same sales-times-recipe math, cut by day of week instead of summed. Twenty-eight days of Square sales gives you four samples of each weekday, and each weekday has its own milk shape. Now the order matches the days it has to cover: enough oat for a Saturday, enough whole for a Tuesday, sized to the gap until the next truck, not to a weekly average that no single day resembles. That per-weekday number is also how you set a real par level for each milk instead of a gut one.

How to pull your own milk number this week

You can do the first pass by hand before your next dairy order. Five steps.

  1. List your milk drinks. Every drink that pours dairy or alt milk, with its pour size in ounces: a latte, a cortado, a matcha, a cold brew with foam. This is your recipe list, and it starts with the recipe, not the price. Pricing each drink off that same recipe is its own worked exercise.
  2. Pull last week's sales by drink from Square. You already have it. Count sold, per drink.
  3. Multiply and split by milk. Sold times pour size, then sort each drink onto the milk it actually poured. Account for swaps: if roughly one in four lattes goes oat, move that quarter of the ounces onto the oat line.
  4. Convert to your order unit. Ounces into gallons for the dairy (128 ounces to the gallon), ounces into cartons for the oat.
  5. Cut it by day. Do steps 2 through 4 for each day of the week, not the week as a lump. That is the number you order against.

Do this once and two things happen. You get a real milk number for your shop, and you find out how far your gut was off. When you have counts to check it against, the gap between what the math says you poured and what the reach-in actually shows is your real milk waste, worth measuring on its own rather than guessing at. The count that anchors it does not have to eat your morning either. A recent full count at my shop was 58 items in about 8.5 minutes on a phone, and my manager has run the last 26 of them, not me.

Start with one drink. Pull last Saturday's oat drinks, multiply by the pour, and compare it to the oat you actually ordered for this Saturday. That one number will be closer than any average, because it is yours. Then do it for whole, and you have replaced the benchmark with your own shelves. Build the count under it and you never look the average up again.