How we score grocery products

If you've ever wondered how is health star rating calculated for an Aussie product, or stared at the side of a packet wondering what to look for on food labels, this post walks through the rubric SwapScore uses for its 1–10 score — and which signals actually move the needle for each of your seven health goals.

Scan yours now →

What we read from the pack

Every barcode lookup feeds from FatSecret (primary) or Open Food Facts (fallback). We don't make up the numbers — we read them, normalise them per 100g, and apply the rubric.

Nutrition facts

Per-100g energy (kcal), sugars, fibre, protein, fat, saturated fat, sodium and carbohydrates. The bulk of the score is built from these.

Ingredient list

Drives our UPF-share estimate: a soft, ingredient-position-aware ultra-processing signal that five of the seven goals weight into the score.

Typical serve

An optional portion cap. If a product lands well above the per-serve kilojoule ceiling for your goal, a soft penalty pulls the final score down.

The seven goals and what each one weighs

Each goal reads the same nutrition packet through a different lens. Use the weight column to judge which lever matters most — bigger percentage, bigger swing.

GoalSignals and weights
Low Sugarsugars ↓ (50%), UPF share ↓ (30%), energy density ↓ (10%), carbohydrates ↓ (10%)
High Proteinprotein ↑ (55%), saturated fat ↓ (20%), UPF share ↓ (15%), sugars ↓ (10%)
Weight Lossenergy density ↓ (30%), sugars ↓ (20%), fibre ↑ (20%), protein ↑ (15%), fat ↓ (15%)
Low Sodiumsodium ↓ (65%), UPF share ↓ (20%), saturated fat ↓ (15%)
Heart Healthysaturated fat ↓ (40%), sodium ↓ (30%), fibre ↑ (20%), sugars ↓ (10%)
Gut Healthfibre ↑ (45%), sugars ↓ (20%), UPF share ↓ (15%), saturated fat ↓ (10%), protein ↑ (10%)
Low Carbcarbohydrates ↓ (55%), fibre ↑ (20%), sugars ↓ (15%), UPF share ↓ (10%)

Numbers reflect the v2 weights file shipped with the app (data/scoring-weights.v2.json). Update the file and the table updates with it.

How to read a 1–10 band

Bands are listed alongside the rubric so you can scan a product and place it. They're relative to the goal you've picked, not absolute: the same cereal can sit at 7/10 for weight loss and 5/10 for high protein on the same day, because the two goals care about different things.

What the bands mean
9–10Excellent
7–8Good
5–6OK
3–4Poor
1–2Avoid

Worked example — Weet-Bix for Weight Loss

Pulled from our seeded catalogue and scored against the live v2 weights file. This is the same product used on the how-it-works page so the two stay consistent.

WoolworthsWeight Loss

Weet-Bix Original

Sanitarium

  1. energy density — 348 per 100g ↓ · weight 30% · ≤400 → 0.35
  2. sugars — 4 per 100g ↓ · weight 20% · ≤5 → 0.75
  3. fibre — 10 per 100g ↑ · weight 20% · ≥10 → 0.9
7/10

The number on top is the goal-weighted composite; the bullets above show the three heaviest signals and where Weet-Bix lands inside each threshold bucket. If you change the goal, the same product re-runs against a different rubric and lands in a different band.

What we deliberately leave out

Scores are per-100g, not the whole pack. The portion cap is a soft nudge, not a calorie-budget counter. And SwapScore is a fit check for a shopper's chosen goal — not medical advice. If you have a specific condition (kidney disease, diabetes, etc.), talk to a clinician before treating a scan as a verdict.

The rubric is open: the underlying weights file ships with the app at data/scoring-weights.v2.json.