How Sniff Scores Dog Food
Last Verified: 2026-05-25 • The Sniff System • Author: Matt Gehring, Sniff founder ([email protected])
This page is the full technical specification. Every weight, threshold, penalty, and citation that goes into a Sniff Score is published here. No black box. If you disagree with a score, you can read this page, identify what you think we got wrong, and tell us. If you think the methodology itself is wrong, we'd rather have that argument out in the open than pretend our number is final truth.
For a plain-language overview written for dog owners, see How We Grade Dog Food. This page goes deeper for veterinary nutritionists, researchers, brand teams, and anyone who wants to audit the math.
TL;DR
Sniff scores dog food on two independent axes:
- Nutrition & Quality Score: a 0-100 number with an A-F letter grade. How good is the food's actual formulation? Built from protein quality, fat quality, carbohydrate quality, AAFCO compliance, controversial ingredients, and nutritional completeness.
- Evidence Rating. Robust / Good / Fair / Limited / None. How much do we trust our own score? Built from data completeness, manufacturer transparency, and source verification.
Both axes always appear together. A food scoring 88/A with "Limited" evidence is a high-quality formulation we couldn't fully verify. A food scoring 62/C with "Robust" evidence is a well-documented but nutritionally average product. Neither alone tells the full story: the methodology is designed to be epistemically honest about uncertainty.
What we are. What we aren't.
Sniff is independent. We accept no money from any pet food manufacturer, retailer, or affiliate network. No commission, no sponsored placement, no preferential ranking. Product pages contain no commission-bearing "buy" links. The full policy lives at sniffscore.co/independence, including what would change if affiliate partnerships are added in the future (flat rate for every product, published charity split routed through the Pax Pledge, editorial always senior to commerce).
We are not a veterinary practice. Nothing on Sniff is medical advice. If your dog has a condition, talk to your veterinarian.
The Sniff Score, broken down
The 0-100 Nutrition & Quality Score is built from nine components plus controversial-ingredient penalties. Here's the full breakdown:
Tier 1: Nutritional Foundation (58 points max)
| Component | Max | What it measures |
|---|---|---|
| PQI (Protein Quality Index) | 27 | The amount, source quality, and biological availability of protein in the first 10 ingredients. Rewards named whole meats and same-species meal stacking. Uses DIAAS-like digestibility proxies from Templeman & Shoveller 2022 (the most rigorous canine ingredient protein assay available). |
| FQI (Fat Quality Index) | 16 | Named fats > generic. Marine omega-3 sources (fish oil, salmon oil, algae oil) > flaxseed alone, because dogs convert less than 1% of plant ALA to DHA (Bauer 2011). Penalizes generic "animal fat." |
| CQI (Carbohydrate Quality Index) | 16 | Whole grains > refined > grain-free with pulses. Critical distinction: grain-free is neutral. High-legume is a WATCH-level concern (FDA DCM investigation 2018-2022, Freeman 2025 phospholipidosis biomarker). |
Tier 2: Safety & Transparency (27 points max)
| Component | Max | What it measures |
|---|---|---|
| ACF (AAFCO Compliance Factor) | 8 | Feeding trial (8 pts) > family product trial (6) > nutrient profile formulation (4) > ambiguous statement (2) > no AAFCO (0). The substantiation method matters, a feeding trial is real evidence; "formulated to meet" is paper compliance. |
| ISS (Ingredient Specificity Score) | 12 | What fraction of protein sources are species-named ("chicken meal" yes, "poultry meal" no, "meat meal" definitely not)? Halved if any unnamed protein is in the top 3. |
| CIP (Controversial Ingredient Penalty) | up to -40 | 25 ingredients on the watchlist. Each carries a verdict. FLAG, WATCH, or CLEAR, with a published basis type (confirmed canine harm / regulatory action / precautionary). Penalties stack but cap at -40 total. |
Tier 3: Nutritional Completeness (16 points max)
| Component | Max | What it measures |
|---|---|---|
| GAA (Guaranteed Analysis Adequacy) | 7 | Does the actual GA meet AAFCO minimums on a dry-matter basis for the labeled life stage? Computed live, not trusted from marketing claims. |
| CDA (Caloric Density Appropriateness) | 4 | Form-dependent kcal targets. A 250 kcal/cup dry kibble is too low; a 700 kcal/cup kibble is too high. Wet food, freeze-dried, raw, each has its own range. |
| MNI (Micronutrient Indicators) | 5 | Premium mineral forms (chelated/proteinated, not oxide), natural vitamin E (d-alpha-tocopherol), selenium yeast, evidence-based probiotics (Bacillus coagulans, Enterococcus faecium SF68). These signal formulation investment, not just labels. |
The penalty cap system (Yuka-inspired)
A premium ingredient list doesn't wash away a suspected carcinogen. If certain ingredients are present, the score is hard-capped regardless of what else the formula contains:
| Trigger | Hard cap |
|---|---|
| Any FLAG ingredient (BHA, artificial colors, ethoxyquin, sodium nitrite, titanium dioxide, TBHQ) | 49 (D-tier) |
| Two or more FLAG ingredients | 39 (F-tier) |
| Three or more WATCH ingredients | 64 (C-tier) |
| No AAFCO statement | 59 (D-tier) |
| Primary protein is generic / unnamed | 54 (D-tier) |
| Fails AAFCO minimum on any nutrient | 49 (D-tier) |
| Pea protein in top 5 OR 3+ pulse ingredients in top 15 (FDA DCM signal) | 64 (C-tier) |
| Active unresolved FDA recall in last 12 months | 39 (F-tier) |
This is the most important mechanic in the system. It encodes "some things are non-negotiable." A food with BHA and artificial colors cannot score above 49 regardless of how much chicken it contains.
Letter bands
| Band | Score | Color | Label |
|---|---|---|---|
| A | 75-100 | Dark green | Excellent |
| B | 60-74 | Light green | Good |
| C | 45-59 | Yellow | Fair |
| D | 25-44 | Orange | Poor |
| F | 0-24 | Red | Avoid |
The bands were calibrated against an empirical run of 3,485 products (per addendum Fix 15). A-tier represents the best ~1.3% of dog foods on the market. F-tier represents the worst ~3%.
Three trust-establishing distinctions
1. Grain-free vs. high-legume: they're different.
The pet food industry conflates these. Sniff does not.
- Grain-free formula based on sweet potato or tapioca with no pulses: no penalty.
- Grain-free formula with peas, lentils, chickpeas in the top 5. WATCH-level concern. The FDA's 2018-2022 investigation linked diet-associated DCM to pulse-rich formulations; Freeman 2025 identified the first plausible mechanism (urinary di-22:6-BMP phospholipidosis biomarker).
- Three or more pulse-family ingredients in the top 15: hard cap at 64 (C-tier). The window was extended from top 10 in v2.0.1 because some brands concentrate pulses at positions 11-15 to escape positional rules.
This is conservative without being reactionary. Burden of proof falls on the novel formulation (the Lindy principle): peas/lentils as kibble base have existed at scale for ~10 years; named animal protein has anchored canid nutrition for ~15,000.
2. Sodium selenite is CLEAR. Copper hepatopathy is WATCH (pending data).
The internet pet food community flags sodium selenite as dangerous. The peer-reviewed literature does not, at AAFCO-permitted levels (max 2 mg/kg DM, typical use 0.1-0.3), there are no documented canine harm cases. A scoring system that flags sodium selenite is epistemically dishonest. Sniff awards a small bonus (+1) for selenium yeast as a marginal upgrade; sodium selenite gets no penalty.
Meanwhile, copper-associated hepatopathy in dogs is a strong recent safety signal (Center 2021 JAVMA; Strickland 2018 JVIM). After 1997, AAFCO switched the permitted copper sources from low-bioavailability oxide (~5%) to high-bioavailability sulfate/chelate (60-100%). Liver biopsy prevalence of elevated hepatic copper has risen significantly.
Where we are today. Sniff classifies copper as WATCH, not FLAG, because we cannot yet verify total copper content from labels alone (manufacturers are not required to publish copper milligrams per kg of dry matter). When a product lists copper sulfate or copper gluconate as the supplemental copper source, we apply a precautionary WATCH; products using copper proteinate (chelated) or no added copper get a neutral assessment. This is conservative compared to peer-reviewed expert opinion (which favors a stronger position) but represents the most we can responsibly claim with the data currently on labels.
Where we want to be. When manufacturers publish nutrient panel data showing total copper >25 mg/kg DM from bioavailable sources, we will FLAG those products at the C-tier cap. This requires either (a) AAFCO mandating copper disclosure, or (b) brands voluntarily publishing third-party lab assays. We're tracking both.
3. "Confirmed harm" vs "regulatory action" vs "precautionary"
Every controversial ingredient on Sniff carries a basis_type label so you can see exactly why we flagged it:
| Basis | Meaning | Example |
|---|---|---|
| Confirmed | Documented canine harm at commercial exposure | Sodium nitrite (Worth 2005 NZ Vet J, canine death) |
| Regulatory | Banned, suspended, or warning-labeled by a major jurisdiction (FDA, EFSA, AAFCO) | BHA (IARC 2B, CA Prop 65, FDA reassessment 2025) |
| Precautionary | Plausible concern from non-canine evidence or jurisdictional asymmetry | Carrageenan (rodent colitis mechanism, no canine clinical evidence) |
A FLAG with basis_type: precautionary is honest about being a judgment call. Reasonable people can disagree about precautionary weighting; we publish the basis so the disagreement can be specific. This is the difference between Sniff's methodology and pure hazard-based clean-label ideology.
The Evidence axis
Five tiers: None / Limited / Fair / Good / Robust. Built from 8 binary signals:
- Full ingredient list captured (>=10 entries)
- Complete guaranteed analysis (all four AAFCO percents present)
- AAFCO statement present and parseable
- Calorie content declared
- Recently scraped (within 180 days)
- AAFCO method = feeding trial OR published trial data
- Cross-source verification (brand-site AND retailer data both available)
- Manufacturer transparency disclosed (DACVN on staff, owned plant, country of origin, third-party testing, recall transparency)
Source-type cap: retailer-sourced and Open Pet Food Facts-sourced rows are capped at "Fair" regardless of signal count, because the data was transcribed by a third party rather than authored by the manufacturer.
Why this axis exists: large manufacturers (Purina, Hill's, Royal Canin) often score higher on Evidence because they can afford DACVN staff and feeding trials. This does not mean their food is nutritionally superior: it means we have more data to verify their claims. A small boutique brand with excellent ingredients may score A on Nutrition but Limited on Evidence; that's a real signal, not a bug.
Per-product "Why this score"
Every product page surfaces the top 3 positive drivers and top 3 negative drivers of its score. Same template, different content per product. Example:
WHY THIS SCORE
✓ Strong protein profile, deboned chicken as primary protein with high biological value ✓ Quality fat sources, named chicken fat with salmon oil for omega-3 ✓ AAFCO feeding trial substantiation for all life stages
✗ Contains BHA. IARC Group 2B probable carcinogen; CA Prop 65 listed ✗ No declared omega-3 marine source, flaxseed alone cannot raise DHA levels ✗ Score capped at 49 due to FLAG ingredient (BHA)
You don't have to take our score on faith. You can see exactly what raised it and what dropped it. The drivers are also what AI assistants extract when someone asks "is [brand] good dog food?", they're designed to be self-contained, citation-ready facts.
What we don't know
Epistemic honesty matters more than authority. Here's what we're uncertain about:
- The mechanism of diet-associated DCM is not established. FDA closed routine updates in December 2022 citing insufficient causal data. Freeman 2025's phospholipidosis biomarker is the first plausible mechanism but requires replication. Our pulse-heavy penalties are precautionary, not causal.
- No validated canine-specific PDCAAS or DIAAS database exists. We use Templeman & Shoveller 2022 DIAAS-like values (rooster-derived) as the best available proxy. The Crosbie 2024 paper notes even chicken meal "is not an appropriate reference protein for estimating protein quality in extruded diets for dogs" due to rendering damage. True canine ingredient quality may be over-estimated.
- AAFCO has no senior life stage profile. Our senior-specific scoring leans on Laflamme 2008 (sarcopenia work), extra-regulatory.
- Optimal canine omega-6:omega-3 ratio is not precisely established. Working consensus 5:1 to 10:1. AAFCO permits up to 30:1. Wild canid diet estimated 1:1 to 4:1.
- NRC and AAFCO disagree on protein minimums by more than 2x (20 g vs 45 g per 1,000 kcal). Both are scientifically defensible under different assumptions.
- Raw feeding presents an irreducible nutrition vs. pathogen-risk tradeoff. Our raw-track penalty is a methodology choice, not settled scientific consensus. We tier it by declared pathogen controls (uncontrolled / tested / verified).
- Probiotic survival post-extrusion is highly variable and label CFU claims are frequently unverified. We award bonuses only for declared CFU at expiration.
- Copper hepatopathy is a strong recent safety signal (Center 2021) but AAFCO declined to set a copper maximum in 2023. Our >25 mg/kg DM FLAG is on the leading edge of expert opinion, not regulatory consensus.
- AMY2B copy number varies dramatically by breed (2 to 34). Population-level statements about "dogs digest starch well" should not be applied to individual dogs without genotyping.
- Lindy heuristics are conservative priors, not deterministic conclusions. Some novel ingredients (algae oil DHA, chelated minerals, B. coagulans probiotics) have accumulated sufficient positive evidence to overcome the prior.
If you read this list and think "they're being too cautious about X" or "not cautious enough about Y," you might be right. Tell us. The methodology is versioned (this is v2.0.2) and the changelog is public.
Sources
This methodology is grounded in:
- NRC (2006). *Nutrient Requirements of Dogs and Cats.* National Academies Press.
- AAFCO 2024 Official Publication. Dog Food Nutrient Profiles (2016 revision, carried forward).
- Hand, Thatcher, Remillard, Roudebush, Novotny. *Small Animal Clinical Nutrition* 5th ed. Mark Morris Institute.
- Fascetti & Delaney (Eds). *Applied Veterinary Clinical Nutrition.* Wiley-Blackwell.
- Templeman & Shoveller (2022). DIAAS of animal and plant ingredients for dog diet formulation. *J Anim Sci* 100:skac279.
- Faber et al. (2010). Protein digestibility in ileal-cannulated dogs. *J Anim Sci* 88:1421.
- Freeman et al. (2025). Urinary di-22:6-BMP phospholipidosis biomarker in diet-associated DCM. *Am J Vet Res* 86:ajvr.24.07.0211.
- Center et al. (2021). Reconsider copper content in commercial dog foods. *JAVMA* 258:357.
- Bauer (2011). Therapeutic use of fish oils in companion animals. *JAVMA* 239:1441.
- Axelsson et al. (2013). Genomic signature of dog domestication. *Nature* 495:360.
Genetic layer (breed-level population genetics)
Breed-level genetic analysis uses data from CanVAS: A Harmonized and Imputed Canine Variant Atlas (Brundage 2026), bioRxiv 10.64898/2026.04.13.718238, Zenodo deposit 10.5281/zenodo.19186944, licensed CC-BY-4.0. CanVAS harmonizes 15 publicly-available canine genotype cohorts into a single PLINK file set on the CanFam4 reference with canonical breed labels per dog (15,449 dogs across 345 breeds; Sniff filters to 215 breeds with n ≥ 8 dogs for stable allele-frequency estimates). Pairwise Hudson-style Fst across 77,215 SNPs produces the breed × breed genetic distance matrix; PCA on per-breed allele-frequency vectors produces a 214-dim per-breed embedding (zero-padded to 768 dims for storage compatibility with the existing editorial embedding layer).
The genetic layer is staged at data/kb-snapshot/breed-fst.json and data/kb-snapshot/breed-genetic-embeddings.json. Companion files at data/reference/breed-crosswalk-canvas.json and data/reference/genetic-vs-semantic-comparison.json document the slug crosswalk and per-priority-breed comparison of genetic vs editorial neighbors. See ATTRIBUTION.md in the repository root for the full attribution record.
Corrected ancestry
Every dog page at sniff.world/dog/ displays a breed-similarity breakdown computed from that dog's position in PCA-256 space, decomposed against 91 breed centroids via non-negative least squares. The raw NNLS weights are pre-computed in the sniff-research pipeline and shipped to Turso as the inferred_ancestry field on each dog record.
The raw NNLS weights are biased by atlas sample-size imbalance and are not displayed directly. Three sources of bias:
- Over-represented breeds leak signal into every dog. The Golden Retriever cohort is 3,197 of 14,478 dogs (22% of the atlas), driven by the GRLS sub-study. Their centroid sits in a central PCA position, partly because PCA axes are themselves oriented by Golden variance. Raw NNLS gives 15-20% Golden weight to dogs in unrelated breed clades. A Bullmastiff in the atlas (
bulm_bulm_01107, "Apollo") shows raw weights of 27.8% Bullmastiff, 16.7% Golden Retriever, 10.4% Labrador, 5.6% Polish Lowland Sheepdog. Own-breed is third or fourth on many small-cohort dogs. - Tiny-cohort breeds compound from the other side. Polish Lowland Sheepdog has roughly 10 dogs in the atlas. Its centroid is estimated from a small noisy sample and lands near random PCA positions by chance. The raw NNLS gives it high weight on many unrelated dogs because nothing else in the centroid library explains those positions better.
- Reconstruction is leaky for purebreds. The raw NNLS is constrained to non-negative weights but not constrained to put high mass on the dog's labelled breed. For a purebred-labelled dog whose own breed has a small atlas cohort, the optimizer can split mass across genetically-adjacent centroids that have more samples.
The display correction is applied at SSR time in web/src/lib/correct-ancestry.ts. It does not touch the underlying PCA, the UMAP coordinates, the centroids, or the raw NNLS weights, which remain in the dataset for re-derivation. The five-step transform:
- Cohort floor. Drop any breed with fewer than 50 atlas dogs. Always retain the dog's own
label_breedso a Bullmastiff page never loses the Bullmastiff row even though the Bullmastiff cohort is below the floor. - Inverse-frequency weight. For each retained breed, compute
weight = raw_fraction / (breed_count / total_dogs). Cap the boost at 20x to prevent a tiny-cohort own-breed (e.g., Bullmastiff with 15 atlas dogs, share 0.001) from receiving a 1000x boost that consumes the whole display. - Normalize. Rescale the weights to sum to 1.
- Display floor. Drop any breed below 5% post-normalization.
- Renormalize. Rescale the survivors so the display sums to 100%.
Worked examples from the live data:
| Dog | Raw NNLS (top 4) | Corrected (display) |
|---|---|---|
Bullmastiff (bulm_bulm_01107) | Bullmastiff 28%, Golden 17%, Lab 10%, Polish Lowland 6% | Bullmastiff 77%, Lab 13%, Golden 10% |
Labrador (1_G0380_0004) | Lab 27%, Golden 20%, Polish Lowland 9% | Lab 75%, Golden 25% |
Chihuahua (CHIH_CHIH_01202) | Chihuahua 31%, Golden 13%, Polish Lowland 12%, Lab 9% | Chihuahua 82%, Lab 10%, Golden 7% |
Golden Retriever (3967_3967) | Golden 59%, Lab 8% | Golden 78%, Lab 22% |
The breed-counts table used by the runtime is staged at web/src/data/breed-counts.json and is regenerated from dogs.json by web/scripts/add-corrected-ancestry.mjs. The two tuning constants (cohort floor 50, max boost 20, display floor 5%) are recorded in _meta.corrected_ancestry inside both dogs.json and breed-counts.json so any reader can reconstruct the exact transform offline.
Known trade-off: the cohort floor filters out biologically meaningful sister breeds when the sister breed itself has a small atlas cohort. For example, a Bullmastiff's corrected display loses Mastiff (less than 50 atlas dogs) even though Mastiff is closer genetically than Labrador. The post-launch upgrade replaces the hard floor with a soft penalty driven by the Fst distance to the dog's labelled breed, which retains genuine sister breeds regardless of cohort size. The current correction prioritizes killing the credibility-breaking 15-20% Golden artifact without that complexity.
A full reference list (20 essential papers) and detailed citation table for every controversial-ingredient verdict is available on request at [email protected].
Version history
| Version | Date | Change |
|---|---|---|
| v1.0.0 | 2026-05-15 | Initial 1-10 scale, 4-component rubric (protein 40, controversial 25, filler 20, AAFCO 15). |
| v1.1.0 | 2026-05-17 | Added Evidence axis (5 signals), source-type cap, descriptor-stripping in ingredient normalization. |
| v2.0.0 | 2026-05-19 | Architectural rewrite. 0-100 scale with A-F bands. Two-axis (Nutrition x Evidence) formalized. Penalty caps (Yuka-style). 7-tier named-species multiplier with DIAAS-like quality values. Grain-free vs high-legume separated. Sodium selenite reclassified CLEAR. Copper >25 mg/kg DM bioavailable added as FLAG. Form-specific calibration (dry / wet / raw / freeze-dried / etc.). 25 controversial ingredients with basis_type. Per-product score drivers + summary sentences. Personalization layer (deferred to v2.1). |
| v2.0.1 | 2026-05-19 | Calibration fixes from real-data validation. (1) Pulse-stack rule window extended from top 10 to top 15 (catches stacking at positions 11-15 that previously escaped the rule). (2) AAFCO inference rule: retailer/OPFF products with an AAFCO-regulated life-stage term in the product name ("Adult", "Puppy", "Senior", "All Life Stages") but no verbatim statement on the page get aafco_method: formulation with aafco_inferred: true, fixes systematic 59-cap suppression of premium retailer rows. (3) Common-bean family added (pinto/navy/kidney/black/white/cranberry/adzuki/mung), was missing from the pulse-family table, so several brands appeared to escape pulse-stack detection. Score distribution shifted to a healthier 5/19/55/17/3 spread (was 1/5/72/19/3). |
| v2.0.2 | 2026-05-19 | Form-aware PQI. The dry-matter-fraction (DMF) correction in PQI is only applied to forms that undergo significant moisture removal during processing, dry, freeze-dried, air-dried, dehydrated. For wet, raw, and gently-cooked fresh foods (where the ingredient listing already reflects the final composition without dramatic shrinkage), DMF = 1.0. Fix lifts fresh DTC formulations (Farmer's Dog, Ollie, ORIJEN FreshPrey, Stella & Chewy's raw, Spot & Tango Fresh) to compete on equal terms with kibble on protein quality. Kibble scores unchanged. Final distribution shifted to 6.3/21.1/55.9/13.9/2.8. |
Every version is preserved as scoring/rubric-vN.js, historic scores are always reproducible.
Brand correction process
If you are a brand owner, manufacturer, or authorized representative of a product on Sniff and you believe any factual information is materially inaccurate, you may submit a correction request at sniffscore.co/corrections. We acknowledge every submission within 48 hours. Within 14 days we provide a written determination: correct the information, annotate the page with the dispute, or decline with written reasons referencing the sources we relied on.
Submitting a correction does not waive any legal right held by the brand or by Sniff. Sniff's documented good-faith engagement with this process is admissible in any subsequent legal proceeding.
Contact
- Methodology questions:
[email protected] - Brand corrections:
sniffscore.co/corrections - DMCA:
[email protected] - General: [email protected]
*This page is versioned at sniffscore.co/methodology/technical/. The plain-language overview for dog owners lives at sniffscore.co/methodology/.*