Why Your Coffee Shop's Food Cost Is So High
Mark, founder of Parly·July 24, 2026·6 min read
The benchmark is not the answer
You closed the month, pulled the P&L, and food cost landed at 34 percent. Somebody once told you cafes should run 28 to 35, so 34 feels like a problem you cannot quite name. You start eyeing the oat milk invoice and wondering if the matcha supplier crept the price again.
Here is the trouble with that number. The limited-service median for food and non-alcohol beverage cost was 32.4 percent of sales in 2024 (National Restaurant Association, 2025 Operations Data Abstract, accessed July 2026). Crimson Cup, writing for coffee shops specifically, calls 25 to 35 percent the healthy band (accessed July 2026). Your 34 sits comfortably inside both. It tells you nothing about whether you are bleeding.
A benchmark is a number from other people's cafes. It cannot see your rent, your drink mix, or your pours. A shop at 32 percent can be quietly losing a case of milk a week to over-pours nobody logs. A shop at 36 percent can be perfectly tight because it sells a lot of high-cost matcha at a price that carries it. The percentage is an average of averages, and it is the wrong instrument for the question you are actually asking, which is where money is leaving that should not be.
One point of food cost is not rounding. Run the math on a hypothetical cafe doing $500,000 a year and a single point is $5,000 annually, roughly $417 a month, since a point is one percent of revenue. So the couple of points between a tight shop and a loose one is a month of somebody's wages. Worth finding.
Your recipes say one number, your invoices say another
The right instrument is a comparison you run against your own shop, no benchmark involved. It has two sides.
Theoretical cost is what your recipes say you should have used. You sold 320 lattes this week, each recipe calls for 12 oz of milk and a double shot, so the recipes predict exactly how much milk, how many beans, and how many cups left the shelf. Cost that at your unit prices and you get the dollars your menu says you spent. This is recipe costing run forward across a week of sales.
Actual cost is what you really bought and counted. It is on your invoices and in your count. It is the milk that actually left the fridge.
Those two numbers are supposed to agree. The gap between them is variance, and variance is the number that matters. A high benchmark with almost no variance means your prices or your mix are the story, and you can stop hunting for waste that is not there. A fine-looking benchmark hiding a wide variance means product is walking out the door and the average is covering for it. That is why the last thing recipe costing asks you to do is compare recipe-predicted spend to what the invoices really say.
In a cafe the gap is milk and modifiers
In a full kitchen, the variance story is theft, heavy-handed portioning, and food spoiling in the back before anyone gets to it. Those are real, and they mostly do not fit a cafe. Your inventory is milk, beans, matcha, cups, and syrups. Little of it spoils fast, and a barista is not eyeballing a portion the way a cook plating dinner is.
So where does a cafe's gap actually live. Two places.
The first is the pour. Your latte recipe says 12 oz of milk. Your barista steams a full pitcher and the last couple of ounces go down the drain on every third drink. That is not theft and it is not a bad hire. It is a recipe that never got dialed in against reality, and it is invisible on the P&L because the register recorded a clean $5.50 sale.
The second is the one your register genuinely cannot see: modifiers. This is the gap between what sold and what you used. When a customer swaps whole milk for oat, Square logs the same latte at the same price. Your shelf lost a different, more expensive ingredient. In my shop, oat runs about $0.15 an ounce against whole at $0.04. That is $0.11 an ounce of difference, so a 12 oz swap is about $1.32 (0.11 times 12) of cost the sale never mentioned. If you do not charge for the swap, that is $1.32 of pure variance per drink, and it stacks up on exactly the orders your benchmark told you were fine. Every transaction carries this detail; the daily total buries it.
Run the variance check on your top five drinks
You do not need to close the whole menu to find the leak. Do five drinks, the five you sell most.
For each one:
- Pull how many sold over a clean two-week window.
- Multiply by the recipe: milk, beans, matcha, cup, lid, syrup. That is theoretical usage.
- Cost it at this month's invoice prices, not last spring's. Prices moved.
- Find the same items on your invoices and in your count for that window. That is actual.
- Subtract. The dollar gap per item is your variance.
Do this honestly and one item usually jumps out, and it is almost always a milk. In my own shop the milk line is where the money moves. Run the recipe math on 47 iced matcha lattes, at 2 g of matcha a drink, and you get 94 g of matcha, 564 oz of oat milk, and 47 cups, and the oat milk is far and away the biggest dollar figure on that list. If your recipes map modifiers correctly, the variance is small and the culprit is pours or waste. If the variance is wild, suspect the map itself before you suspect your staff.
That last point is not hypothetical, we lived it. The worst mapping miss we ever had was in the data, not on the bar. A set of Square modifiers got deleted, and the Whole Milk usage my own shop's numbers computed silently dropped to 0.70 bottles a day when the real number was 9.716, a 14x miss. Watching the staff would never have caught it, and neither would a clean count on its own, because the counts were honest and the number the software believed was wrong at the source. Only setting the count next to the computed usage surfaced it. A benchmark never will.
Fix the widest gap first
Once you have five gaps, work the biggest one and leave the rest for now.
If the widest gap is a free milk swap, the fix is a pricing decision, not a discipline problem. Charge for the alternative, or price the base drink so it carries the swaps you will never charge for anyway. If it is over-pour, the fix is dialing the recipe and the pitcher, one drink at a time, until the count agrees with the math. If the gap is a broken modifier map, the fix lives in the data, and no recount touches it.
Then run the same five next month. Variance is not a one-time audit. It is a monthly reconciliation where the count is your ground truth, recipe-times-sales is your prediction, and the distance between them is your early warning. Watch it and the benchmark stops mattering, because you are no longer asking whether 34 percent is normal. You are asking whether this month's gap is wider than last month's, and you have the receipts to answer.
Be honest about what the check will and will not do. It narrows the search to the two or three items actually costing you, but it does not plug the leak for you, and it cannot see a leak that never touches a recipe or an invoice, like a comped drink nobody rang up or a bag of beans that walked off. A tool like the one I built runs this comparison automatically off your live Square sales, modifiers included, but even then it reads the tickets, it cannot watch the pitcher. The pour fix is still yours. Pick your top five, cost them forward this week, and start with the widest gap. That number is your answer.