How we score

Short version: we read the ingredient list on the label, grade every single ingredient, and add up what looks like a nutritious bowl and what looks like marketing. The same rules are applied to every scored complete meal, with no per-product human override.

In one sentence: the headline score rewards lots of real meat and vegetables, few fillers and additives, and a label that tells you the truth; the opposite lands low. For scored complete meals, four further dimensions measure what the label and the public record can verify beyond the recipe.
Calibration limitation: this is a label interpretation, not a clinically validated health prediction. The Recipe coefficients are fitted to a pinned copy of our original scoring algorithm, not to dogs' health outcomes. It can show how a label reads under our rules; it cannot predict how an individual dog will respond.

Evidence behind the score

Some rules are informed by dog-food studies, some use indirect evidence, and some are editorial heuristics. A study does not validate a coefficient, and context-only sources do not justify a scoring rule by themselves.

Browse the research & evidence →

The five steps, in plain English

  1. We read the label. We take the ingredient list exactly as it is printed on the bag or tin, word for word.
  2. We work out how much is in it. UK law only requires percentages for the headline ingredients. For the rest, we use the order of the list. By law, ingredients are listed from heaviest to lightest, so a longer list position means less.
  3. We grade every ingredient. Each of the 1,151 known ingredients is graded as good, medium or poor. Named meats and fish score well; cheap fillers, artificial colours and vague “by-products” score badly.
  4. We add it all up. Good ingredients pull the score up. Fillers, additives and undeclared “other” stuff pull it down. Labels that print real percentages get a small bonus for transparency.
  5. We sanity-check the results. Pinned-baseline tests check consistency and release impact, not clinical accuracy. You can read the label yourself and see why a product scored the way it did.

The five dimensions

For scored complete meals, the 1-100 headline is the Recipe score and four further dimensions sit alongside it. Treats and complementary products do not receive Recipe and Nutritional dimensions: their pages add a factual label read-back, while any Transparency, Safety and Evidence records remain separate and never create a headline score. The five dimensions are never added together to make the headline score.

Recipe (the headline score)

Ingredient quality and specificity, dry-matter composition, transparency of printed quantities, processing type and additives. This is the published 1-100 score, and the only dimension that feeds the headline number.

Nutritional

How the declared analytical constituents compare with FEDIAF reference ranges, scored on a dry-matter basis. FEDIAF's ranges presume a standard energy density of 4,000 kcal per kg of dry matter, so where a label declares its energy content we correct the minimums for a more calorie-dense food, as FEDIAF instructs; the correction can only raise the bar, never lower it. Confidence markers (high, medium, low) show how much was actually declared; missing data is shown, never silently assumed.

Transparency

How much the manufacturer discloses, measured against the FEDIAF Code of Good Labelling Practice and Regulation 767/2009. Mandatory items dominate the weighting.

Safety

Recall and safety-notice history, time-decayed. This dimension never feeds the headline score, and the incident list is always shown next to the number. A higher Recipe score is not a safety guarantee or an individual feeding recommendation. Safety is limited to the records we hold: no recorded incident is not proof of a spotless history.

Evidence

Whether what the label claims matches what the label declares. Checkable claims (grain-free, high protein, no chicken, made in the UK) are tested against the parsed ingredients and declared analysis; the score is the share of checkable claims that hold up. Health claims are recorded but never scored. "Nothing we can check" is shown as such, never as a zero.

The evidence and its limits

Each rule below names the evidence used and what it does not establish. The full source list lives on the research page.

Named cuts beat bare species names

“Chicken breast / beef liver” score higher than plain “chicken / beef”, which could legally be frames or mechanically recovered meat.

Why: Protein quality varies enormously with the actual tissue used; unspecified sources cannot be judged.

Dry-matter normalisation

Percentages are compared on a dry-matter basis: fresh meat is ~72% water, meat meal ~8%, so wet and dry recipes are converted before comparison.

Why: Comparing as-fed percentages flatters wet foods; moisture changes misrepresent nutrient content.

Fresh frozen and raw processing

Some minimally processed formats receive a different processing adjustment from high-heat extruded food.

Why: Some studies report higher amino-acid digestibility and metabolisable energy for frozen raw, freeze-dried and fresh diets than for extruded food. Those studies support a direction for the diets tested, not a universal health advantage or the size of our adjustment.

Shelf-stable “fresh” gets no fresh bonus

Ambient-stable fresh food (steam-cooked in a sealed pack, e.g. retorted trays) receives no minimal-processing advantage.

Why: Retort sterilisation is process-wise identical to canning. Human-food evidence about heat-labile vitamins and AGEs is indirect and does not establish a canine health outcome; it is used only to explain the editorial processing choice.

Extrusion and high-heat drying

Extruded and baked dry foods receive a different processing adjustment from gently processed formats.

Why: Extrusion and 160–180°C drying can reduce available lysine and other nutrients. The exact processing coefficients remain editorial model choices.

Additive penalties are moderate, not extreme

Artificial colours are penalised most (they exist only to impress buyers); approved preservatives get small penalties.

Why: A systematic review found approved additives show no measurable harm within regulatory limits - so we penalise non-disclosure and cosmetic additives, not safety.

Grain-inclusive is not penalised per se

Grains are fine as part of a recipe; only filler dominance (high carb, low meat) drags a score down.

Why: Controlled trials found no DCM signal or taurine effect from grain-free vs grain-inclusive diets; formulation quality matters more than grain ideology.

Transparency is rewarded three times

Printing some percentages earns a clear-label bonus; ~fully quantifying the recipe (95%+ of mass declared) earns a full-disclosure bonus; declaring exactly which additives are used (with doses) earns a small transparency bonus.

Why: Transparency is an editorial auditability rule, not a claim of clinical benefit. Printing quantities makes the recipe easier to inspect; no research source is claimed for the bonus.

    What lifts a score

    • A high share of named meat, fish and meat meal
    • Vegetables, fruit and useful oils instead of fillers
    • A clear, honest label with percentages printed for (nearly) every ingredient
    • Declaring exactly which additives are used (small transparency bonus)
    • Few or no artificial colours, flavours and preservatives

    What drags a score down

    • Filler-heavy recipes - wheat, maize or rice making up most of the bowl
    • Vague ingredients such as “meat derivatives” or “animal by-products”
    • Artificial additives and colourings
    • A lot of the recipe not declared by weight

    What the headline score does not look at

    The 1-100 headline is the Recipe score: it ignores the price, the brand's reputation, the pack design and whether a specific dog happens to be allergic to something. A cheap food with a great ingredient list can outscore an expensive one, and vice versa. Recall history and claim evidence are shown separately in the Safety and Evidence dimensions and never feed the headline number.

    Advanced: the exact model, data and weights

    For the curious: the machinery below lets you audit stored arithmetic and inspect the assumptions. It is not a claim that every raw-label parse can be reproduced from one web page.

    The full pipeline

    1. Parse the ingredient list as declared on the packaging, extracting percentages where present and expanding grouped ingredients (e.g. Chicken 60% (Chicken, Chicken Liver)).
    2. Strip marketing terms. Words like premium, natural, human-grade, free-range carry no nutritional information and are removed before matching.
    3. Estimate missing quantities. The undeclared remainder is distributed across the remaining ingredients, weighting earlier-listed ingredients more heavily (labels list ingredients in descending order of weight).
    4. Match each ingredient against the glossary of 1,151 ingredients, each classified (meat, carb, oil, veg, supplement, additive…) and tiered from published nutritional guidance.
    5. Compute features: category percentages, average ingredient-quality score, count and share of poor ingredients, clear-label flag, additive penalties, processing type.
    6. Apply the model. Ingredient tiers, composition, additives, processing and label disclosure produce feature values. The published coefficients turn those values into the 1–100 Recipe score.

    Current model

    Version
    v3 live
    Type
    linear
    Features
    40
    Trained
    2026-09-25
    Weights hash
    86b97d9e2f09fc1e…

    What changed in model v3

    Model v3 corrects the scoring model where the evidence did not support it, and where the model was crediting things it could not see on the label. Each change has its evidence and measured impact published; the full write-up is in the release note article.

    • The fresh premium is earned, not automatic. The separate "is fresh" bonus is removed: format credit now comes from the cooking method itself plus a single quality-gated reward that fires only for recipes with at least 30% declared dry-matter meat and no poor-tier ingredients. Fresh-frozen drops about 13 points on average and chilled fresh about 11; a chilled naming gap is fixed as part of the same change, so chilled now matches frozen exactly.
    • Raw trimmed to a little above frozen. The fitted raw premium had grown to about 8 points over frozen on an identical label, letting medium-ingredient raw recipes out-score better-ingredient fresh ones on format alone. Raw keeps the top format slot, with a gap of about 3 points.
    • Two processing premiums removed for lack of evidence. Cold-pressed food drops about 12 points on average (no study shows it digests better than extrusion, and FEDIAF does not recognise it as a category); baked food drops about 5 to extruded level (Alvarenga 2024 found the same recipe digests equally well extruded).
    • One score for one process. Wet, retort-pouched and shelf-stable "fresh" foods are the same retort process (Hagen-Plantinga 2017) and now share one processing slot: wet formats drop about 4 points to match.
    • Unknowns no longer earn credit. Meat-share bonuses count only percentages printed on the label, not our estimates; label-disclosure credit slides with how much of the recipe is declared rather than two binary gates; and a "complete" claim needs fortification declared or a whole-prey recipe before it earns the complete-food bonus.
    • No score without a readable label. Products whose ingredient list cannot be parsed are unscored instead of getting an arbitrary number.
    • The ingredient glossary was audited end to end. Whole pulses (peas, lentils, chickpeas) move from good to medium tier on the pulse-heavy diet evidence; salt and natural preservatives leave the poor tier (safe, lawful processing aids that were punishing honest declaration); hydrolysed and dehydrated protein families are unified under one rule each; and declared processing water no longer drags a label's score.
    • Additive penalties corrected against the evidence. STPP and sodium hexametaphosphate penalties removed (the dental-benefit evidence inverts them), propylene glycol reduced to a token value (the FDA action was cat-specific), and carrageenan reduced (EFSA judges it safe at feed levels). Whole maize moves up to the medium band with oats and barley; processed fractions (maize gluten, corn protein) stay penalised.
    • Claims are checked against the label. The Evidence dimension checks what the claim says against the declared ingredients and analysis: grain-free claims verified or contradicted by the parse, protein and fat level claims checked against dry-matter bands, UK-origin claims against the declared country of manufacture, with upheld ASA rulings capping brands. Functional health claims stay recorded but never scored.
    • Transparency no longer punishes lawful labels. Batch coding is mandatory on the physical pack but legally exempt from web pages (Regulation 767/2009 Art. 11(3)), so it sits in the voluntary checklist and the Transparency dimension discriminates above the old 60-point cap.

    The scoring rules and evidence for each change are documented in our strategy records, and the release note article covers the measured impact across the catalogue.

    How the model is calibrated

    The coefficient table below is not hand-tuned per product, and it is not fitted to health outcomes. It is fitted against a pinned copy of our original scoring algorithm, which encodes our editorial judgements about what a good label looks like. This makes the model internally consistent with those judgements, not externally validated against health outcomes. That distinction matters: the score is a reproducible reading of the label, not a proven prediction about your dog.

    When a new version is trained, we measure how far its scores drift from that pinned baseline across the whole catalogue, and any drift has to be explained in the release note before the version can be published. We deliberately do not publish the error figures: they measure agreement with our own earlier algorithm, not accuracy against any external truth, and a small number would read as more validation than it is.

    Model changelog

    Named algorithm versions. One version is live on the site at a time; drafts are trained and tested locally before being published. Every release has a public write-up of what changed and why.

    Model coefficients

    The exact weights applied to each Recipe feature (plus per-processing-type terms). Every stored rating keeps its full feature vector, so the stored arithmetic can be checked against this table. The other four dimensions use fixed published parameters rather than learned coefficients; they ship in the same published weights file under their own blocks.

    FeatureCoefficient
    Base score (bias)30.9088
    Average ingredient quality (avgIngredientScore)9.1913
    Meat share of dry matter (meatPctDM)0.0960
    Carb share of dry matter (carbPctDM)-0.1151
    Oil share of dry matter (oilPctDM)-0.0920
    Vegetable share of dry matter (vegPctDM)-0.0052
    Additive share of dry matter (additivePctDM)0.1629
    Supplement share of dry matter (supplementPctDM)-0.0122
    Other share of dry matter (otherPctDM)-0.3747
    Unrecognised share of dry matter (unknownPctDM)-0.0265
    Recipe graded poor (poorPct)-0.0650
    Poor-quality meat in recipe (poorMeatPct)-0.1787
    Number of poor ingredients (poorCount)-0.8762
    Largest single poor ingredient (poorMaxPct)0.0600
    Undeclared quantities (missingPct)-0.1056
    Prints ingredient percentages (clearLabel)0.0000
    Complete diet (complete)2.2936
    Frozen or chilled fresh (isFresh)0.0000
    High meat (30%+ of dry matter) (highMeat)0.7067
    Low meat (under 10% of dry matter) (lowMeat)-3.1583
    High carb and low meat (highCarbLowMeat)-1.1802
    Meat share × printed percentages (meatClearLabel)0.0000
    Meat share × fresh (meatFresh)0.0000
    Fresh × high meat (freshHighMeat)11.0841
    Additive penalty (additivePenalty)0.2220
    Processing multiplier (processingMult)33.7864
    Processing: Raw (proc_raw)-0.0543
    Processing: Fresh Chilled (proc_fresh-chilled)-2.3543
    Processing: Fresh Frozen (proc_fresh-frozen)-2.3543
    Processing: Fresh Refrigerated (proc_fresh-refrigerated)0.0000
    Processing: Fresh Shelf (proc_fresh-shelf)-0.6716
    Processing: Dry Freeze Dried (proc_dry-freeze-dried)6.6292
    Processing: Dry Air Dried (proc_dry-air-dried)6.3310
    Processing: Dry Cold Pressed (proc_dry-cold-pressed)-6.7127
    Processing: Dry Baked (proc_dry-baked)-6.7127
    Processing: Dry Extruded (proc_dry-extruded)-6.7127
    Processing: Dry Semi Moist (proc_dry-semi-moist)-6.1742
    Processing: Dry Muesli (proc_dry-muesli)-10.1457
    Processing: Wet Pate (proc_wet-pate)-0.6716
    Processing: Wet Chunks (proc_wet-chunks)-0.6716

    Ingredient glossary

    CategoryTierCount
    additivegood2
    additivemedium37
    additivepoor38
    carbgood15
    carbmedium71
    carbpoor23
    fibregood13
    fibremedium40
    fibrepoor3
    fruitgood3
    fruitmedium2
    herbgood1
    herbmedium1
    meatgood178
    meatmedium98
    meatpoor11
    mineralgood11
    mineralmedium18
    oilgood26
    oilmedium20
    oilpoor4
    othergood4
    othermedium20
    otherpoor11
    otherunknown1
    supplementgood180
    supplementmedium57
    supplementpoor4
    veggood189
    vegmedium67
    vegpoor3

    Assumptions register

    Every score rests on the assumptions below. Each is a deliberate choice, listed with what breaks if it turns out to be wrong for a given product.

    Undeclared quantity estimation

    If n ingredients lack a declared or group-derived quantity, the remaining as-fed mass is max(100 - known total, 0). For zero-based position i, its weight is 1 + (n - i) / n. Each unknown receives its weight divided by all unknown weights, multiplied by the remaining mass. The first unknown can therefore receive up to twice the last one's weight. Printed percentages are kept as declared; group-derived shares are not reclassified as printed.

    Dry-matter conversion factors

    Each ingredient's estimated as-fed share is multiplied by the applicable factor. Category dry-matter shares are then normalised by total dry matter. Name cues and the glossary's dry flag decide whether an item is treated as dried; liquid dairy and broth cues take the special cases listed below.

    Published ingredient dry-matter factors
    Ingredient caseDry-matter factor
    Declared processing water0.00
    Liquid dairy, unless dried0.13
    Oils0.99
    Meat or fish: fresh0.28
    Meat or fish: dried or meal0.92
    Meat broth, stock, gravy or juice0.08
    Vegetables: fresh0.15
    Vegetables: dried0.90
    Carbohydrates: grains, rice and oats0.88
    Carbohydrates: fresh roots, tubers or cooked pasta0.25
    Carbohydrates: dried0.90
    Fibre0.90
    Supplements0.92
    Minerals0.95
    Additives: dry or unspecified0.90
    Additives: broth, stock, gravy or juice0.08
    Other ingredients: default0.50
    Other ingredients: broth, stock, gravy or juice0.05
    AssumptionWhy we make itWhat breaks if it is wrong
    Missing moisture is estimated per ingredient categoryLabels only have to print moisture above 14%. Estimating it lets wet and dry foods be compared on a dry-matter basis.That product's composition shares shift. Scores move a little; rankings between similar products rarely do.
    Undeclared quantities are estimated from list orderUK law requires percentages only for headline ingredients, but does require the list itself in descending order of weight.The split between minor ingredients is approximate. Printed percentages are always used exactly as declared.
    Processing type comes from storage instructions, not the product name"Fresh" on the bag can mean frozen, chilled or shelf-stable retort, which are very different processes.A misclassified product gets the wrong processing adjustment. The storage instructions are shown on the product page so you can check.
    "Complete" and "complementary" are taken at label valueThese are legal declarations made by the manufacturer; we do not test any product ourselves.A complementary food could be presented as complete or vice versa. Report it and we correct the record.
    Additive transparency counts presence, not dosesWhether a label lists "Vitamin A" or "Vitamin A 1,500 IU/kg", the only signal reliably available across the whole catalogue is that the section exists.A bare list of names gets the same small transparency credit as a fully dosed one.

    Check a score yourself

    Every number in a score is published, so you can check the arithmetic with a calculator:

    1. Open the product page and expand "Recipe: how the 1-100 score is calculated". Each row shows the feature value taken from the label, the published coefficient, and the contribution that results from multiplying them.
    2. Add the contributions together with the processing-type offset and any label bonuses. If the total lands above 100 or below 1, it is pulled back to 100 or 1; otherwise it stays as it is. The result should match the displayed score; contributions are rounded to two decimals, so allow a rounding difference.

    This is an arithmetic audit of stored features, not independent laboratory validation or a complete reproduction of the raw-label parse. The estimation formula, dry-matter factors, glossary tiers and published coefficients are available for inspection; the whole parser and every historical input snapshot are not packaged as a one-click public reproduction.

    The weights for every published version are kept, and historical scores stay checkable under their original version. If your recomputation differs from the site, tell us: we treat it as a bug and answer publicly.

    Brand attribution

    Products are matched to their manufacturer brand from the product name, URL and ingredient list. Every assignment is stored with a timestamp and a confidence, so you can audit it in the provenance section of any product page. Errors are possible, and provenance lets you check each one.