FSA-NPS Algorithm: Technical Reference
Reference documentation for the Food Standards Agency Nutrient Profiling System (FSA-NPS) underlying Nutri-Score, including the 2023 revision. The rules below are documented as implemented in the official Santé publique France calculation workbook "Nutri-Score Updated algorithm" (4 April 2024)[3].
Background
The FSA-NPS was developed by Rayner, Scarborough and Stockley at the University of Oxford for the United Kingdom Food Standards Agency in 2005[1], originally to regulate the marketing of foods to children. The model was later adapted by Julia, Hercberg and colleagues into a five-colour front-of-pack label and formally adopted as Nutri-Score by France in October 2017[2].
Belgium, Germany, Luxembourg, the Netherlands, Spain and Switzerland adopted the same algorithm for voluntary use between 2018 and 2022. A transnational steering committee composed of public-health agencies from these seven countries reviewed the algorithm in 2022; the revised algorithm referenced here entered force for general foods in 2023 and for beverages in 2024.
Timeline
- 2005: FSA-NPS published for the UK Food Standards Agency[1]
- 2017: Nutri-Score adopted by France based on FSA-NPS[2]
- 2018–2022: Adoption by Belgium, Germany, Luxembourg, Netherlands, Spain, Switzerland
- 2022: Transnational steering committee review of the algorithm
- 2023: Revised algorithm enters force for general foods
- 2024: Revised algorithm enters force for beverages
Scoring components
The FSA-NPS produces an integer score per 100 g (or 100 ml for beverages) by combining negative and positive component points. The result is mapped to a letter grade A–E using category-specific cut-offs.
Negative points (N)
- Energy: general foods 0–10, thresholds 335 → 3350 kJ in steps of 335 kJ. Beverages use stricter thresholds (30 → 390 kJ).
- Sugars: general foods 0–15 on the revised "Sugar Ib" scale (3.4 → 51 g). Beverages 0–10, thresholds 0.5 → 11 g per 100 ml.
- Saturated fat: 0–10, 1 point per gram up to 10 g. Replaced by an SFA-to-total-fat ratio for added fats (see below).
- Salt: 0–20 on the revised scale, thresholds in 0.2 g steps up to 4.0 g.
- Sweetener penalty: beverages only: +4 points if a non-nutritive sweetener is present (2023 addition).
Positive points (P)
- Fruits, vegetables, legumes and nuts (FVL): general foods 0–5 (40%, 60%, 80%, >80%). Beverages use a four-band scale with point values 0/2/4/6.
- Fibre: 0–5 on the "Fibre scenario II" table from the Excel, thresholds 3.0 → 7.4 g.
- Protein: general foods, cheese and added fats: 0–7 with thresholds 2.4 → 17 g (the "Protein scenario II" table). Red meat is capped at 2 points. Beverages use a separate, stricter scale (see beverages section below).
Score-combining rule
The score is not a straight N − P subtraction. How positive points are combined with negative points depends on the product category and on the magnitude of N. The 2023 revision standardised these rules across the seven coordinating countries.
The rules below are reproduced from the per-category Score formulas in the Updated-algorithm columns of the SPF Excel[3]:
| Category | Score formula |
|---|---|
| General foods | IF N < 11 then N − P else N − FVL − Fibre(protein excluded when N ≥ 11) |
| Red meat | IF N < 11 then N − P else N − FVL − Fibre(same rule as general foods; protein additionally capped at 2) |
| Cheese | N − P(protein always counted, regardless of N) |
| Added fats and oils | IF N < 7 then N − P else N − FVL − Fibre(stricter threshold of 7; protein excluded when N ≥ 7) |
| Beverages | N − P(protein always counted, no N-based exception) |
The rationale for excluding protein at high N is to prevent protein-rich products that are otherwise high in negatives (e.g. processed meats high in salt and saturated fat) from offsetting their negative score through their protein content. Cheese and beverages are not subject to this exclusion in their respective tabs.
Category-specific rules
1. Beverages
- Plain water is graded A by default through a dedicated water flag; non-water beverages are graded B–E exclusively, regardless of computed score
- Energy thresholds 30 → 390 kJ per 100 ml (substantially stricter than the 335 kJ steps used for solid foods)
- Sugar thresholds 0.5 → 11 g per 100 ml, mapping to 0–10 points
- FVL scored on a four-band scale: ≤40% → 0, ≤60% → 2, ≤80% → 4, >80% → 6
- Protein scored on a beverage-specific scale: 1.2 / 1.5 / 1.8 / 2.1 / 2.4 / 2.7 / 3.0 g per 100 ml → 0 / 1 / 2 / 3 / 4 / 5 / 6 / 7 points (hardcoded in the Excel; does not reference the general-foods Scenario tab)
- A +4 penalty is added to negative points when a non-nutritive sweetener is present (2023 addition)
2. Cheese
For cheese the protein component is always subtracted from negative points, regardless of N. This was inherited from the original 2005 specification and accounts for the saturated-fat and salt that naturally occur in cheese. The letter cut-offs are the same as for general foods; only the score-combining differs.
3. Added fats, oils, nuts and seeds
- Saturated fat is scored as the SFA-to-total-fat ratio (percentage), with thresholds 10% → 64% in 6-point increments, rather than as absolute saturated fat per 100 g
- Energy is derived from saturated-fat energy (SFA × 37 kJ/g), with thresholds 120 → 1200 kJ per 100 g
- Score combining: if N < 7, the full positive score is subtracted; otherwise only fibre and FVL points are subtracted (protein excluded)
- This treatment differentiates oils with favourable fatty-acid profiles (olive, rapeseed, walnut oil) from those with high SFA content (coconut oil, butter, margarine)
4. Red meat
The 2023 revision caps protein points for red meat at 2 (down from 7), reflecting public-health guidance on red-meat consumption. Otherwise the category uses the same score-combining rule and letter cut-offs as general foods.
Letter cut-offs
| Category | A | B | C | D | E |
|---|---|---|---|---|---|
| General foods, cheese, red meat | < 1 | < 3 | < 11 | < 19 | ≥ 19 |
| Beverages | water only (via flag) | ≤ 2 | ≤ 6 | ≤ 9 | > 9 |
| Added fats and oils | < -5 | < 3 | < 11 | < 19 | ≥ 19 |
Per the SPF beverages letter formula, A is reachable only via the water flag; any non-water beverage with a computed score ≤ 2 maps to B.
Implementation verification
The implementation backing this reference is verified at two levels against the official SPF Excel[3]:
- Threshold tables: all numeric tables in
nutriscore_scenarios.rbare derived line-for-line from the Scenario tab of the Excel and verified to match cell values. - Score-combining formulas: each per-category Score cell of the Excel (General foods AD, Red meat AB, Cheese AB, Fats AI, Beverages AG) is reproduced in
nutriscore.rb#score_value, including the N < 11 protein exception for general foods and red meat, the N < 7 rule for added fats, and the water-flag-only path to grade A for beverages.
Several edge conditions are explicitly covered by the test cases: high-N general foods with protein, beverages with protein above 3 g per 100 ml, zero-score non-water beverages, the four cheese reference examples, and the fats SFA-ratio path. The datasets are published in machine-readable form alongside this reference:
References
- Rayner M, Scarborough P, Stockley L. Nutrient Profiles: a scoring system for use in differentiating foods and drinks. University of Oxford for the UK Food Standards Agency, 2005.
- Julia C, Hercberg S. Development of a new front-of-pack nutrition label in France: the five-colour Nutri-Score. Public Health Panorama 2017;3(4):712–725. WHO IRIS: apps.who.int/iris/handle/10665/325207
- Santé publique France. Nutri-Score: Updated algorithm calculation workbook. Saint-Maurice, 4 April 2024. Original: santepubliquefrance.fr (Nutri-Score_Updated-algorithm_20240404.xlsx). Dutch redistribution (Rekentool): rijksoverheid.nl, 11 April 2024.
- Rijksinstituut voor Volksgezondheid en Milieu (RIVM). Nutri-Score. Bilthoven, updated 2024. Available at: rivm.nl/voeding/nutri-score. (Dutch government scientific institute responsible for advising on the Nutri-Score algorithm adoption in the Netherlands.)
About this reference. Compiled by Eclarion BV as supporting documentation for the FSA-NPS algorithm. Content reflects the 2023 revision as documented in the cited Santé publique France calculation workbook. Corrections and suggestions are welcome via team@eclarion.com.