The duplicate ingredients quietly wrecking your recipe costs

Open your ingredient list and search for butter.
If four things come back and you buy two, you have found the thing this post is about. It will not stop at butter. It will be flour, milk, and the chicken you buy under three descriptions because three invoices spell it three ways.
None of those records is wrong, exactly. Each was created by a sensible person on a busy morning. But every duplicate splits one ingredient's price history in half, and part of your menu is then costed off a price that no longer exists.
That is the bit that hurts. Not the untidiness. The fact that your margin report is confidently wrong and looks completely normal.
Duplicates arrive one reasonable decision at a time
Nobody creates the same ingredient twice on purpose. It happens like this.
The invoice description changes. Your supplier's system says "Butter Unsltd 25kg" for two years, then someone tidies their catalogue and it becomes "Unsalted Butter 25kg Block". Same product, same code, new words. Match on the description and a new ingredient appears.
Somebody could not find the existing one. They searched "unsalted butter", the record was filed as "Butter, unsalted", nothing came back, so they made one. Thirty seconds of work, six months of quiet damage.
You added a supplier, or changed pack size. The backup wholesaler's version went in as its own record because that is what the invoice looked like. The 2.5kg bag became 5kg and a new record appeared next to the old one rather than replacing it.
Somebody keyed a special in a hurry. Four new ingredients go in fast, with fast names, and two of them are things you already had.
There is no alert for "you now have this ingredient twice". The list just gets longer, the same way till buttons breed while nobody is watching.
The three kinds, and what each does to a cost card
1. Same product, two names
The classic. Two live records, one real product. New invoices land on whichever one your matching picked this week, so one keeps moving and the other freezes on the day it was last touched.
Every recipe pointing at the frozen record is now costed at a price that expired months ago, and the cost card will look exactly as it always did.
2. Same product, two suppliers
You buy the same thing from two wholesalers, one as backup, and each has its own record. You now cannot answer the only question worth asking: which of them is cheaper this month?
Switching between them looks like nothing at all. Spend moves from one record to the other, both prices sit still, and whatever gap has opened between them stays invisible because nothing ever puts the two side by side.
3. Same product, two pack sizes
The one that costs most and gets spotted least, because both records genuinely have different numbers on them and both look right. A 2.5kg bag at £4.00 and a 5kg bag at £7.20 are £1.60 and £1.44 a kilo. Two records, two costs per gram, and whichever one your recipe happens to point at is the one your margin is built on.
Pack-size duplicates are also where a pack that shrinks while the price holds steady hides best. Two records for the same flour, one still on the old weight, and the comparison that would have caught it never happens.
The same dish, costed twice
Take a café with two butter records: an old one that last saw an invoice in November at £5.80 a kilo, and a newer one currently running at £7.40. The scones point at the old record, the Victoria sponge at the new one.
- A batch of 12 scones uses 250g of butter. On the old record that is £1.45, or 12.1p a scone.
- The same butter at the current price is £1.85, or 15.4p a scone.
3.3p a scone is not a business problem on its own. Sixty scones a day, six days a week, and it is about £12 a week, or roughly £620 a year from one line of one recipe. Butter is in maybe fifteen of your recipes.
The money is the smaller half. The bigger half is that your scone margin says one thing and reality says another, so every decision off that report - what to promote, what to reprice, what to drop from the autumn menu - rests on a number last true in November.
The pairs that look identical and are not
Here is where enthusiasm gets expensive.
Our KFF invoices at Hunters carry a Ciabatta Roll and a Round Ciabatta Roll. Both are a case of 40 rolls at 100g each, and through July they were landing within about 3p of each other per roll. Sorted alphabetically they sit side by side, looking exactly like the duplicate you have spent half an hour hunting.
They are not the same thing. One is the long one that goes under the panini press. The round one is a different sandwich on a different part of the menu. Merge them and you cost a panini on the wrong bread, then order the wrong shape next time you buy off usage.
They have drifted apart since, too. Today one sits around 98p a roll and the other around 76p, because their prices moved on different invoices. Merge them and that gap vanishes into one blended number that describes neither product.
Pairs that are almost never safe to merge:
- Different format of the same thing. Sliced and unsliced, long and round, portioned and bulk.
- Salted and unsalted. Standard and gluten free. Whole and semi-skimmed. One word apart in the name, completely different in a recipe.
- Anything where the spec genuinely differs, including the allergen declaration. More on that next.
The allergen half nobody mentions
If you make anything prepacked for direct sale - the sandwich wrapped before the customer picks it up, the wrapped brownie by the till - the label has to carry the name of the food and a full ingredients list with the 14 allergens emphasised within it. That has been the rule since 1 October 2021, and the FSA spells out what the label must show in its guidance on allergen labelling for PPDS food.
That list is assembled from your ingredient records. A split ingredient is a split allergen declaration.
Picture a café with two records for its seeded bread. One was set up carefully and carries mustard, which plenty of seeded loaves contain. The other was created in a rush off an invoice line, with the allergen fields left empty. Two sandwiches, two labels, and one is missing something - not because anyone was careless about allergens, but because they were careless about a filing decision six months earlier.
Merging in the wrong direction does the same damage in reverse: keep the record with the emptier allergen data and you have quietly downgraded every label that pulls from it. Whichever record survives, check its allergen fields before you touch a single recipe. It is the same principle as keeping the allergen source of truth on the ingredient rather than the printed matrix.
The 30-minute audit, in the order that finds money fastest
Do this with a coffee and a spreadsheet. It genuinely is half an hour.
1. Export the list with the columns that matter (5 minutes). Name, supplier, pack size, cost per unit, date last updated, and how many recipes use it.
2. Sort by date last updated, oldest first (5 minutes). Skip the genuinely seasonal. You want anything you still buy weekly whose price has not moved since spring.
3. Sort alphabetically and read the neighbours (10 minutes). Word order and abbreviations put most twins next to each other. Then search deliberately for the ones that will not sort together: butter, milk, cream, flour, chicken, whatever your top ten lines by spend are. Search the word, not the full name.
4. Scan everything used in zero recipes (5 minutes). A record no recipe uses and no invoice has touched in six months is either a one-off buy or the abandoned half of a pair.
5. Decide, pair by pair (5 minutes). Only three outcomes:
- Merge when it is the same product from the same supplier under two descriptions. Keep the record with the better data, not the newer one.
- Link when it is the same product from two suppliers or in two pack sizes. You want one ingredient carrying both supply options, so the price history stays whole and you can see which is cheaper.
- Leave alone and rename for everything else, including everything you are not sure about.
Then do the step everyone skips: recost every recipe that touched a record you changed. A tidy ingredient list above cost cards still showing yesterday's number has fixed nothing you can see.
Where software helps, and where it does not
No tool will decide whether your two ciabattas are one bread. That is a judgement about your own menu, and it takes half an hour with a spreadsheet.
What a tool can do is stop the second and third kinds recurring. In CostingBrik one ingredient can carry several supplier offerings, each with its own price history, and the preferred one is what prices your recipes, so the same roll from two wholesalers or the same flour in two pack sizes stops splitting in two. Invoice matching that learns each supplier's descriptions also makes a tidied catalogue line less likely to spawn a fresh record.
None of that helps with the duplicates already in your list. Do the audit first.
The takeaway
Search your own list for the three ingredients your kitchen leans on hardest. Butter, milk, flour. Count what comes back.
If that number is bigger than the number of things you actually buy, every recipe those records touch is costed on a coin toss, and your margins have been rounding in a direction nobody chose.
Half an hour. Oldest first, then alphabetical, then zero-recipe. Merge, link, or leave alone. Then recost, before you price the autumn menu off numbers you have not checked.
Ed O'Brien has run Hunters Cake Company for 17 years across cafés in Witney, Burford, and a bakery in Carterton, Oxfordshire. He's building Brikly - modular tools that give independent café owners the same data the big chains have, without the big chain price tag.