← Blog

The trust problem isn't the crowd

We ran the audit on our own catalog. Search one sandwich and you get 163 answers spanning 157 to 306 calories per 100 g — and most of that spread is real. The rows that are actually wrong come from the sources everyone treats as authoritative.

The standard complaint about calorie apps is that their food databases are full of numbers strangers made up. It’s a reasonable thing to assume. It is not, as far as we can tell from our own catalog, the main problem.

We went looking this week, with queries rather than opinions. Here’s what’s actually there.

One sandwich, 163 answers

Search our catalog for a chicken Caesar wrap and 163 rows come back. Per 100 g they run from 157 calories to 306 — near enough a factor of two.

The two ends:

Per 100 g The row
Heaviest 306 cal York Street Market, 720 cal per 235 g
Lightest 157 cal Cibo Express, 576 cal per 366 g

The obvious reading is that one of them is wrong. The likelier reading is that both are right. A 235 g wrap and a 366 g wrap are different objects. Different bread, different dressing, different amount of chicken. Two manufacturers making a thing with the same name is not a data-quality problem — it’s what food is.

The median across all 163 rows is 231 calories per 100 g, and the distribution around it looks like what you’d expect if a couple of hundred companies each made a wrap.

So the number you log for “chicken Caesar wrap” can be wrong by a factor of two while every row in the list is accurate. That’s the first half of the trust problem, and no amount of database cleaning fixes it. What fixes it is knowing which wrap — which is why every row in our catalog carries the brand, the serving weight it was measured at, and a link to where the figure came from.

Where the numbers actually come from

Here’s the part that surprised us when we counted it. Our public catalog is 1,941,073 rows:

Source Share
USDA FoodData Central, Branded set 92.4%
Open Food Facts 6.7%
USDA FoodData Central, lab-analysed foods 0.7%
Our own research agent 0.2%
Restaurant chains’ published figures 0.1%

Only the second line is crowd-sourced in the usual sense. The 92.4% is manufacturer-submitted label data that USDA republishes — companies reporting their own products, not strangers guessing.

And that’s where the broken rows are.

A can of Pringles that weighs less than its contents

This row is in our database as you read this, from Open Food Facts:

Pringles Potato Crisps — serving: 28 g. Calories: 375. Protein 3 g, carbohydrate 42 g, fat 22 g.

Add the macros up: 67 grams. In a 28 gram serving.

Protein, carbohydrate and fat are parts of the food’s mass. They are the stuff the serving is made of, along with water and ash. Sixty-seven grams of them cannot fit inside twenty-eight grams of crisps. The row describes an object that cannot exist.

What makes this one interesting is how quietly it fails. Run the standard consistency check — do the calories match the macros? — and it passes with room to spare:

4 × 3 g protein  +  4 × 42 g carbs  +  9 × 22 g fat  =  378 calories
stated: 375

Three calories apart. The row is perfectly consistent on energy and impossible on mass. Every energy-based validator in the world waves it through, because the underlying mistake — nutrition stated per 100 g, serving weight stated for the actual portion — scales both sides of that equation together.

We wrote separately about rows carrying more sodium per gram than pure salt. This is the same species of error and the same origin: faithfully copied from upstream, wearing a source link and an official-looking badge.

How many

We added the rule this week. Protein plus carbohydrate plus fat cannot outweigh the serving, allowing for label rounding — under the FDA’s labelling rules each macro rounds to the nearest gram, or the nearest half gram at small amounts, so three of them can legitimately read about 1.5 g heavy.

Against 1,893,344 public rows with both a serving weight and all three macros, it flags 3,748. That’s 0.198%.

Two details from setting the threshold, because the threshold is where a rule like this goes wrong:

The line is not “macros ≤ serving”. The 99th percentile of macro mass over serving weight is exactly 1.000, and the rows sitting at 1.000 are correct: hard candy really is 10 g of sugar in a 10 g sweet, icing decorations really are pure carbohydrate. A naive rule would reject a few thousand accurate rows to catch the same number of broken ones.

The rounding allowance is capped at the serving weight. Rounding can only inflate a number that exists. A 0.25 g spray of cooking oil declaring 1.5 g of protein isn’t a rounding artifact — it’s a broken serving size wearing a macro symptom, and a flat 1.5 g tolerance hides exactly those worst cases.

Of the 3,748, only 739 were caught by any check we already had. About three thousand rows were passing every test we knew how to run.

All 3,748 are USDA Branded or Open Food Facts. None came from the crowd in the sense people mean when they blame the crowd.

What this changes, and what it doesn’t

The rule runs at write time now, on every path into the food table — the API, the barcode lookup, the research worker, the bulk importers. The class is closed going in.

The 3,748 rows already in the catalog are a separate job, and we’re not going to pretend otherwise. They have a plausible-looking fix — if the nutrition is per 100 g and the serving weight is real, scaling by serving ÷ 100 puts it right — but “plausible-looking” is how bad data gets in. The sodium cleanup taught us that: the automated repair we were confident about turned out to fix zero of the 35 hardest rows, and we only found that out by running it as a dry run first. This one gets the same treatment before it touches anything.

Update, 28 September 2026. We ran the per-row check, and the obvious fix would have repaired nothing. All 3,436 USDA Branded rows match USDA’s current record exactly (we checked every one against USDA’s April 2026 Branded release). The impossible numbers are in the manufacturer’s own submission: a hot sauce declaring 30 g of protein in a 6.9 g serving, a 240 ml kombucha with 270 g of carbohydrate. There is nothing upstream to repair them from. We re-fetched the Open Food Facts rows from Open Food Facts, and 25 had been corrected there and took the correction.

So we’ve hidden 3,653 rows from search and barcode scans. Each change is logged and can be reversed. Scanning one of those products now asks Open Food Facts afresh, and the answer has to pass the same check before we keep it. We kept 76:

  • 47 that miss the line by a tenth of a gram or less;
  • 18 syrups and honeys measured in millilitres, since a millilitre of syrup really does weigh more than a gram;
  • 2 that are in someone’s diary;
  • 9 Open Food Facts rows that need a person to look at them.

Meanwhile, the thing you can actually do about any of it is the same thing we built the product around. Every food in Macroline shows its tier and its source, and the source is a link, not a badge. If a number looks wrong, you can go and look at where it came from — and sometimes, as here, you’ll find that we were the ones who needed to look.

The queries behind every figure in this post run against our production catalog. The guardrail is stated in full above — macro mass against serving weight, with a capped rounding allowance — so you can apply it to any row you’re looking at, here or anywhere else. Pringles is a trademark of Kellanova; the row quoted is Open Food Facts’ record, not the company’s.