How accurate is AllergyLens?
Tested on 1,424 real products · sample collected 26 July 2026
Short answer: if a label lists 100 allergens, AllergyLens spots about 95 of them, working from the ingredients and nothing else. That is good enough to catch things a tired person at 6pm would miss. It is nowhere near good enough to stop reading labels.
Below is how we arrived at that, which allergens it is weakest on, what it cannot do, and the bugs the testing found in our own code. One of them showed a peanut butter chocolate bar as safe. Most allergy checkers ask you to trust them. We would rather show you the marking.
One phrase to know before you read on. We call a single question a check: one product, one allergy, one answer. A jar of pesto tested against a nut allergy is one check; the same jar tested against a milk allergy is another. That is why the counts below run into the thousands from 1,424 products.
How we tested it
We took 1,424 real products from Open Food Facts, a free public food database, choosing the ones people scan most often in the US, UK, France, Spain, Germany, Italy and the Arabic-speaking markets. For each one we pretended to be a family with exactly one allergy, asked AllergyLens, and compared its answer with what the label says.
Repeat that for every product and every allergen and you get 1,741 checks where it should have gone red, and 15,772 where it should have stayed quiet.
Only one kind of mistake really matters: a "looks safe" on a product whose label lists your allergen. That happened 83 times out of 1,741. We have read all 83 of those by hand, which is how the bugs further down this page came to light.
Scanning a barcode beats photographing a label
The 95.2% above is AllergyLens working with the least it ever gets: a list of ingredients and nothing more. That is the situation when you photograph a label, paste an ingredients list, or check a menu.
A barcode usually brings back more than that, because the database has already broken the ingredients down into a tidy list. Given that, it spots 96.2%. So scan the barcode when you can, and treat a photo as the backup.
There is a prettier number we could have led with, and did not. Some products arrive with allergen warnings already attached by the database. Where those exist, AllergyLens agrees with them almost every time. But agreeing is not the same as being right: the warnings it is agreeing with are the very thing we would be marking it against, so that test proves nothing. Every figure on this page comes from the harder version, where it gets the ingredients and has to work it out.
Which allergens it is worst at
Weakest first, because that is the row you came for. Read a line like this: "milk was on the label in this many checks, we missed it this many times, so we spotted this share of it".
| Allergen | Checks where it was on the label | Times we missed it | Share spotted |
|---|---|---|---|
| Celery | 35 | 4 | 88.6% |
| Sulphites | 23 | 2 | 91.3% |
| Sesame | 38 | 3 | 92.1% |
| Peanuts | 72 | 5 | 93.1% |
| Eggs | 75 | 5 | 93.3% |
| Milk / dairy | 465 | 26 | 94.4% |
| Tree nuts | 197 | 10 | 94.9% |
| Soy | 283 | 14 | 95.1% |
| Mustard | 21 | 1 | 95.2% |
| Wheat / gluten | 511 | 13 | 97.5% |
| Fish | 16 | 0 | 100.0% |
| Shellfish | 3 | 0 | 100.0% |
| Lupin | 2 | 0 | 100.0% |
Look at the number of checks before you worry about a percentage. Shellfish and Lupin turn up in only a handful of products here, so a single product swings the figure wildly. Those rows are too thin to mean much in either direction.
What happens on a foreign label
AllergyLens knows the words for each allergen in English, French, Spanish, German, Italian and Arabic. Faced with a label in any other language, it can only fall back on what the database has already worked out. That is why the "knows the words" column below matters more than the percentage beside it. Weakest first again.
| Label language | Knows the words | Checks | Times we missed it | Share spotted |
|---|---|---|---|---|
| Dutch | No | 6 | 3 | 50.0% |
| Italian | Yes | 62 | 8 | 87.1% |
| Spanish | Yes | 100 | 10 | 90.0% |
| English | Yes | 855 | 37 | 95.7% |
| German | Yes | 97 | 4 | 95.9% |
| French | Yes | 594 | 11 | 98.1% |
| Arabic | Yes | 9 | 0 | 100.0% |
| Romanian | No | 6 | 0 | 100.0% |
Arabic, Romanian and Dutch are in that table on almost no evidence. Fewer than fifteen checks each. Read those rows as "hardly tested at all", not as a score. Arabic is the one that bothers us. We went looking for it on purpose, across Moroccan, Saudi, Emirati, Egyptian and Tunisian shelves, and the database simply does not hold many products whose ingredients are written in Arabic. We are showing the row anyway, because AllergyLens offers Arabic and you should know how little that claim has been checked.
Reasons to trust this number less than you'd like
To mark the answers, we need to know the right answer, and the only thing we have is the food database's own allergen information. Volunteers fill that in, partly by reading the same ingredients AllergyLens reads. It is a second opinion, not the truth, and it is wrong often enough to matter: 152 of the 1,424 products carry at least one broken allergen entry, and a few of the products we appear to "miss" have somebody else's ingredients list attached to them altogether. Doing this properly would mean photographing physical packets and typing them up by hand. We have not done that.
Four more things worth knowing:
- We treat oats as gluten. Oats that are not certified gluten-free are a real risk in coeliac disease, so we flag them. On a certified gluten-free oat bar that counts against us as a wrong answer, and it is our single biggest source of unnecessary warnings. We would rather keep it that way.
- "Lecithin" with no source named is treated as maybe-soy. It usually is soy. But a label that does not say so has not actually declared it, so you get an amber "may contain" with the reason spelled out, rather than a flat red.
- The products lean European and English-speaking. That is what the database holds most of. A label in a language the checker has no words for is the weakest case there is.
- 1,424 products is not a promise about the next one. Recipes get reformulated, databases fall behind, and the same brand is packed differently in different countries.
The bugs this testing found in our own code
Every one of these was live on the site. Not one was reported by a user, so nobody would ever have known. They are here because a page that only showed you the good number would not be worth reading.
A product with no ingredient list showed as safe
One product's entire ingredients field read "SEE INGREDIENTS BELOW FLAP", on a peanut butter chocolate bar. Nothing in that sentence matches an allergen, so it came back safe. Missing data is now reported as "not enough information", never as a clean result.
A stray underscore hid the word "milk"
The database marks allergens inside the ingredients with
underscores, like _cultured nonfat milk_. Our search
for the word "milk" did not recognise "milk_" as the same word, so a
plain nonfat yoghurt came back green for a milk allergy.
"Tree nuts" was not a tree nut
The matcher knew almond, hazelnut, cashew and a dozen others, but not the words labels most often use: "tree nuts" and "nuts". A chocolate bar listing "peanuts, milk, egg and soy, tree nuts" scanned green for a tree nut allergy. Named cheeses had the same gap: a crispbread whose only dairy was "Emmentaler" came back safe.
"Gluten-free" was read as "gluten"
Free-from claims matched as if they were ingredients, so "gluten-free", "dairy free" and "sans gluten" all turned red, on exactly the products an allergic family goes shopping for.
Abroad, it was barely reading the label at all
Measured on its own, AllergyLens was finding roughly one allergen in six on labels that were not in English. It now knows the words in French, Spanish, German, Italian and Arabic, and finds 94.8%. Going back through those word lists turned up 38 more mistakes. Among them: "fruits à coque" and "frutos secos", the normal way to declare tree nuts on a European label, matched nothing whatsoever.
A missing accent was the difference between red and green
Labels are careless with their own language, especially in capitals. A carton of cream printed "CREME entière de Normandie" did not match our word "crème", so pure cream came back safe for a milk allergy. An English ingredients list saying "celeri extract" missed celery the same way. AllergyLens now ignores accents when it compares words, which fixed the Portuguese "glúten" and a French tree nut warning at the same time.
Lactose-free kefir looked dairy-free
An Italian kefir said "senza lattosio", meaning lactose-free. The only dairy word on it was the one the label was crossing out, and we did not know that kefir itself is a milk drink, so it came back safe for a milk allergy. Lactose-free is not milk-free: the milk protein, the part an allergy reacts to, is still in there. Kefir is a dairy word now.
A plural and a squashed-together letter
French makes some plurals with an x rather than an s, and two tins of "filets de maquereaux" came back safe for a fish allergy because of it. Separately, the joined-up "œ" in "œufs" sometimes gets garbled into the letters "ce" when a label is copied between computers, and "ceufs" in an ingredients list meant we missed the egg.
Where these numbers come from
The test lives inside AllergyLens's own source code, and it runs against a frozen copy of those 1,424 products, so anyone running it gets the same answers we did. Every figure on this page is printed straight out of that test rather than typed in by a person, so we cannot quietly round it up. The full write-up lists each miss and each unnecessary warning one by one, including the ones where we think the food database is wrong and we are right.
None of this makes AllergyLens safe to rely on by itself. Think of it as a second pair of eyes that never gets tired at the end of a long shop. On a job like this, being right 95.2% of the time is not good enough. Read the packet, every time, and follow the plan your allergist gave you.
Try it on something in your cupboard
Free, no sign-up, and everything stays on your phone.
Start scanning