MyFoodFit

Scoring methodology

How MyFoodFit calculates personalised food scores: what we use, what we claim, and what we don't.

See also: Responsible use & limitations

Explainability in practice

Every score lands with a plain-language reason and a breakdown of the signals that drove it. No hidden model, no black box.

Extra Virgin Olive Oil scored 71 out of 100 with a plain-language verdict and breakdown bars

What inputs we use

Every score is built from structured data about the product and the user's dietary profile.

  • Macronutrients (energy, protein, fat, saturated fat, carbohydrates, sugars, fibre, salt) from food labels, per 100g.
  • Fat quality ratio: the proportion of unsaturated to total fat. We score fat type, not just fat quantity.
  • NOVA ultra-processing classification (1 = unprocessed through 4 = ultra-processed), sourced from Open Food Facts or inferred from product name and category.
  • Ingredient lists for allergen detection, dietary constraint matching, and derived signals.
  • Micronutrients where available (iron, calcium, folate, vitamin C) from CoFID UK government food composition data.
  • The user's dietary profile: selected goals, medical conditions, allergies, and ethical preferences.

How scoring works

The same product with the same profile always produces the same score. There is no machine learning or probabilistic element in the scoring pipeline. The engine is deterministic by design.

Every product starts at a neutral baseline of 50 out of 100.

Nutrient modifiers adjust the score up or down based on the user's active profile. A high-protein goal rewards protein-rich foods; a heart health profile penalises saturated fat more heavily; a pregnancy profile boosts folate and iron.

NOVA processing modifiers reward minimally processed foods and penalise ultra-processed foods. The NOVA 4 ceiling prevents all ultra-processed products from scoring green (70+), capping them in amber regardless of their isolated nutrient profile.

Derived signals detect specific patterns: nutritional voids (high energy, low nutrients), sugar-dominant products, processed meat (WHO Group 1 carcinogen), liquid calories, and saturated fat bombs.

Guardrail floors prevent whole foods from scoring red. Broccoli, chicken breast, oily fish, and olive oil cannot be flagged as poor choices. No evidence-based dietary pattern recommends avoiding them.

Allergen detection runs separately from scoring and produces a safety verdict (pass / warn / block) independent of the numeric score.

The dietary profile engine applies tailored modifiers (penalties, rewards, and allergen blocks) across 40 profiles covering medical conditions (CKD, IBS, IBD, pregnancy), allergies (EU-14), ethical preferences (vegan, halal, kosher), and life-stage needs (menopause, GLP-1 medication support).

How energy values are calculated when missing from labels

Some products in our database arrive without an energy value attached, even though their macronutrient breakdown (fat, carbohydrate, protein, fibre) is complete. This is common across food data feeds. Where we can calculate energy from the macros using the regulator's own method, we do, rather than leaving the field blank or estimating.

EU regulation 1169/2011, Annex XIV, sets the conversion factors used to derive energy on a food label from its macronutrient composition. Every UK and EU manufacturer applies the same fixed multipliers:

  • Carbohydrate (excluding polyols): 4 kcal per gram
  • Protein: 4 kcal per gram
  • Fat: 9 kcal per gram
  • Fibre: 2 kcal per gram
  • Polyols: 2.4 kcal per gram
  • Alcohol (ethanol): 7 kcal per gram

Manufacturers do not measure the energy on a pack with a calorimeter. They calculate it from the declared macros using these factors, the same way we do. In practice the figure printed on a label typically agrees with a fresh calculation from the same macros to within 1 to 2 percent. The remaining variance comes from rounding rules, kcal-to-kJ conversion artefacts, and minor regional accounting differences in how fibre and polyols are treated. Larger divergences indicate either an inaccurate macro entry or one of the documented boundary cases described below, not a flaw in the method.

Where a row in our food database is missing an energy value but has complete and plausible macros, we backfill the energy field by applying the Annex XIV factors. Plausibility gates are applied first: the calculated value must fall between 5 and 900 kcal per 100g, and the sum of fat, carbohydrate, and protein must not exceed 100g per 100g. Rows that fail any gate are left unset rather than backfilled.

Every backfilled row is annotated. The product's data_source_trust record carries kcal_source set to “atwater_calculated”, a timestamp, and a kcal_calculation_basis of “eu_1169_annex_xiv”. Where a label-derived value ever existed, it is preserved separately. Every calculated value in the database is therefore forensically distinguishable from a value supplied by a label, and both are auditable to source.

Some categories are excluded from automated backfill because the standard 4/4/9/2 factors (carbohydrate/protein/fat/fibre) do not apply cleanly: alcoholic drinks (where ethanol contributes 7 kcal per gram and is not captured in the standard macro fields), sugar-free or no-added-sugar products built on polyols (2.4 rather than 4 kcal per gram), and mushrooms (which contain mannitol). These rows are flagged for separate handling rather than calculated under the default factors. At the opposite boundary, very high energy values are not automatically suspect. The Annex XIV ceiling for a 100g portion is 9 kcal × 100g = 900 kcal, achieved when a product is essentially pure fat. Pure oils, butter, and rendered animal fats legitimately sit in the 880 to 999 kcal per 100g band, and our data-quality work treats those values as valid by category rather than as outliers.

Recent refinements

The scoring system has been refined through the last six months of calibration against real UK products and independent reference systems. The changes below are all active in the shipping app.

  • Health-positive UPF: eight categories of technically ultra-processed foods with demonstrated nutritional value (fortified wholemeal cereals, plant milks, kefir and kombucha, plant sterol spreads, wholemeal bread, high-protein dairy, tofu and tempeh, plant-based proteins like Quorn) receive a reduced NOVA penalty, capped at 60 percent, provided they pass sugar and saturated fat safety gates.
  • NOVA inference fallback: when a product has no NOVA classification in the database, the app infers a conservative classification from product name and category keywords. This prevents the scoring engine from silently dropping products where the processing level is unknown.
  • Fermented food modifier: fermented foods with live cultures (kimchi, kefir, kombucha, miso, tempeh, sauerkraut, live yoghurts) receive a modest probiotic bonus. Guardrails prevent this from rescuing ultra-processed products or cured meats.
  • Portion-aware scoring: the per-100g score is blended with typical serving size data so a 40g bowl of oats is scored differently from 100g of olive oil. This reflects how the product is actually consumed, not just how it reads per 100g.

What we intentionally do not claim

  • We do not claim this is a clinically validated scoring system. It is expert-informed and evidence-aligned, not peer-reviewed.
  • We do not provide medical advice, diagnosis, or treatment recommendations.
  • We do not claim to predict health outcomes from individual food choices.
  • Medical profiles (CKD, IBS/FODMAP, IBD, pregnancy) include prominent disclaimers and are designed for awareness, not clinical guidance. Users are directed to consult their healthcare professional.
  • Guardrail thresholds (e.g. vegetables floor at 88, fruit at 82) are informed product design decisions, not clinically derived values.
  • We describe the scoring engine as a “personalised nutrition score” that “supports healthier choices”. Not as “clinically validated” or “medically accurate.”

Why free sugars are approximated rather than directly measured

WHO and UK SACN dietary guidelines recommend limiting free sugars (added sugars plus sugars in honey, syrups, and fruit juice), not total sugars.

However, UK food labels only display total sugars. Free sugars are not shown separately on UK packaging, unlike the US, which requires added sugar labelling.

Deriving free sugars from label data alone is not reliably possible. Public Health England developed a methodology for national dietary surveys, but it requires recipe-level knowledge that product labels do not provide.

Instead, MyFoodFit uses three complementary mitigations:

  • NOVA 1 whole foods receive halved sugar penalties, reflecting that intrinsic sugars in whole fruit and dairy are metabolically different from free sugars.
  • Guardrail floors protect whole fruit and plain dairy from red scores.
  • A liquid calorie signal specifically penalises fruit juice and sugar-sweetened beverages, where sugars behave as free sugars regardless of source.

This is a conscious design decision, not an oversight. We approximate free sugar behaviour through processing classification rather than attempting unreliable direct measurement.

Why guardrails exist

Food scoring systems that rate apples, chicken breast, or oats as “unhealthy” lose user trust immediately and contradict all evidence-based dietary guidance.

Guardrails set minimum scores for foods that every major dietary guideline recommends: vegetables, fruit, whole grains, lean protein, oily fish, nuts, and legumes.

Products are excluded from guardrails if they contain more than 40g sugar per 100g or are classified as NOVA 4 ultra-processed. This prevents gaming.

Guardrails are behavioural design decisions informed by nutritional science. They are not clinically derived thresholds and would benefit from formal dietitian validation, which is part of our planned university partnership work.

Validation status: what is complete vs pending

Complete

  • Convergent validity (NPM): all three disagreements with the UK Nutrient Profiling Model (HFSS) favour the MyFoodFit system. Cross-validated with 83.3% agreement. Where we diverge, Coca-Cola is correctly flagged as red despite NPM's non-HFSS classification; peanut butter and olive oil are correctly scored green despite NPM's HFSS classification.
  • Convergent validity (Nutri-Score): cross-validated against Nutri-Score with Pearson correlation of 0.835 (strong positive).
  • Automated testing: 16,570 UK products tested across 20 dietary profile configurations. 100% barcode resolution, 88% scoreable.
  • Anomaly detection: automated pipeline flags scoring edge cases for manual review. 95% of flagged anomalies trace to missing source data (typically absent ingredient lists), not scoring errors.
  • Clinical audit: internal review against NHS, SACN, WHO, and NICE guidance identified 11 issues across 3 severity levels. All critical and important issues have been addressed.

Pending

  • Face validity: independent dietitian review of 150–300 products against scoring bands. Planned with Solent University.
  • Outcome validation: in-product study measuring whether the scoring system improves food choice behaviour. Requires beta user cohort.
  • Peer-reviewed publication of validation methodology and results.

Current status

  • v6.1.0 (Build 105 on TestFlight), with 6,945 automated tests across 203 test files.
  • 40 dietary profiles covering medical, dietary, ethical, and life-stage needs.
  • 3,062,580 products in the food database (3 million+) with global coverage, and an offline bundle of ~120,000 UK products.
  • Academic partnership with Solent University in progress for independent scoring validation.
  • Open to further academic collaboration.

This page was last updated March 2026. MyFoodFit is built by JTM Chilton Ltd.