Square Recipes and Modifiers: The Tracking Gap
Mark, founder of Parly·September 2, 2026·6 min read
The number that gave it away
The order sheet said oat milk, 41 bottles a day. I have stood behind that bar on our busiest Saturday and we have never come close to 41. So I went looking for the arithmetic, and it turned out my ingredient math had spent about a week running modifier-blind: every drink charged to its base recipe, every swap at the register ignored. Once the modifiers were counted again, oat settled at about 13.5 bottles a day. Same sales, same shelves, same week. The only thing that changed was whether the swap on the ticket got read.
Modifier-blind is not a bug in Square Recipes. It is the documented design. That is worth knowing before you turn it on and start ordering off its numbers.
What Square Recipes counts when a drink sells
Square Recipes is the native answer to the ingredient question. You build an ingredient list, attach a recipe to a menu item, and Square deducts that recipe's ingredients every time the item sells, working out a cost of goods along the way. It is available to Square for Restaurants Plus and Premium subscribers, and Square still labels it a beta: "Ingredient cost tracking is a beta feature and may change over time" (Square support article 8629, accessed September 2, 2026).
The deduction is the whole mechanism, and it fires on one thing only: the item that sold, matched to the one recipe attached to it. A latte sells, the latte recipe leaves the shelf on paper. Whatever else happened at the register on that ticket does not enter the calculation.
Square is direct about the boundary, in its own words on that same page:
"No recipes on modifiers. Modifiers don't track inventory or costs. Add-ons like extra cheese or sauce shots won't decrement ingredient stock or appear in recipe-level COGS."
Extra cheese and sauce shots. That is a kitchen sentence, and if you read it as a kitchen sentence it sounds like a footnote about garnishes. Read it as a cafe owner and translate the nouns, because in your shop the modifier is not a garnish.
The modifier is not a garnish, it is the drink
Walk your own Square catalog. The item is "Latte." One milk lives in the recipe, whichever one you set as the default. Everything that distinguishes one latte from the next is riding on the ticket as a modifier: oat, almond, whole, extra shot, decaf, large, extra hot.
So the money in a specialty cafe moves almost entirely through the part Square Recipes does not read. A milk swap is not an add-on to the drink. It is a replacement of the single largest ingredient in it, at the same volume, for the same price on the receipt. An extra shot is another 18 or so grams out of the hopper that the recipe never hears about.
Do the arithmetic on one morning. Forty seven iced matcha lattes at my house build is 94 g of matcha, 564 oz of oat milk, and 47 cups used. Now swap twelve of those to whole milk at the register. The receipts are identical to the cent. The oat number should drop by about 144 oz and the whole milk number should rise by the same, and a modifier-blind deduction moves neither. It charges all 47 to the default and files the day as clean.
⚠ The direction of the error is not random
A modifier-blind system does not scatter its mistakes. It over-counts whatever milk you set as the default and under-counts every alternative to zero. That is a systematic drift in one direction, every day, on your largest ingredient line.
What one uncounted milk swap did to my oat order
Here is the same failure with real numbers instead of an illustration, from my own shop.
Oat is my default on a large share of the drink board, so when the modifier layer went dark, every one of those drinks charged oat. Whole milk and almond went to zero usage, because nothing ever swaps to a milk the system cannot see. Oat came out at about 41 bottles a day.
Three times the real number, on the item I order most. Ordering off that for a month means cash sitting on a shelf in oat I will not get through before the dates, and a whole milk line reading zero that would have run me dry if I had trusted it. That is the same gap between the count on paper and the count in the fridge every owner eventually finds, except here the tool caused it while looking authoritative.
The tell is worth memorizing, because it costs nothing to check. If your ingredient tracking shows one milk moving fast and the others sitting near zero, it is not reading your modifiers. No cafe pours from one milk.
Why a better recipe does not close it
The instinct once you see this is to fix it in the recipe: make the recipe more accurate, blend the milks, build a latte recipe that is 60 percent oat and 40 percent whole to match how the drinks actually go out.
That is an average, and an average is the thing you were trying to escape. It is right on a normal week and wrong on every abnormal one, which is to say wrong on the weeks you actually needed it, and it never tells you which way. Your swap rate is not a constant. It moves with the season, with the crowd, with a price change on oat, with a barista recommending something.
The other instinct is to flatten the menu: make Oat Latte and Whole Latte separate items, each with its own recipe. Square's second documented limit closes that door in a different way, since "Items with multiple variations (for example, Small, Medium, Large) can't have recipes," so the flattening has to run all the way to a standalone item per size per milk per temperature. Two sizes times four milks times hot or iced is 32 buttons for one drink. Your baristas hunt that wall during the rush, and you have rebuilt your register to feed a tracker. The full set of limits and where they land in a cafe is worth reading before you commit to any of it.
The honest read is that this is not fixable inside a per-item deduction. Reading the modifier on each ticket is a different job than deducting a recipe on each item sale, and only one of them is what a register does natively. That is the sold-versus-used gap in its purest form: the sale is recorded perfectly and the pour is invisible.
Size the gap on your own menu before you decide
Ten minutes with your own numbers settles this better than my numbers can. Square's own reporting will give you every figure.
- Pull last week's item sales. Total drinks sold, from Square.
- Pull the modifier counts for the same week. Every milk swap, every extra shot, every size upcharge that carries an ingredient with it.
- Divide. Modified tickets over total drinks. That is the share of your drinks whose ingredient truth lives outside the recipe.
- Take your largest milk line and multiply. Swapped drinks times the pour size in ounces. That is how many ounces a day are landing on the wrong milk in either direction.
If step 3 comes back under about 10 percent, your menu genuinely does not move through modifiers, and Square Recipes on its base recipes is close enough to run your ordering on. Turn it on and stop here.
If it comes back at 40 or 60 percent, which is the normal answer for a specialty board, then the recipe deduction is describing a shop you do not run. You need a layer that reads the whole ticket, treats a milk swap as a replacement at the same volume and an extra shot as an addition, and takes a physical count as the ground truth to settle against. That is exactly what turns what you actually poured into what you actually order.
Start with step 4 on oat this week. Multiply your swapped drinks by the pour, compare it against the last case you brought in, and see which of the two numbers your fridge agrees with.