Research
What a dog food label
does not tell you.
A guaranteed analysis is a legal promise, not a measurement. We measured how far the real food sits from the printed guarantee across 96 paired observations on 34 products, so a label can be read as a range instead of a number. Every figure is published by the maker of the food, and every one can be checked without asking us anything.
What we found
- Guarantees understate reality, and the gap depends on the format. Dry kibble protein runs a median 1.092 times its printed minimum, canned and wet pouches protein runs a median 1.343 times its printed minimum and fresh, cooked or refrigerated protein runs a median 1.081 times its printed minimum. Canned and wet pouches crude fat reaches 2.082 times at the 90th percentile.
- The printed calorie figure already reflects the real food. AAFCO Model Regulation PF9 requires a calculated calorie statement to use average values, not guaranteed ones. Across 28 products the typical values reproduce the printed calories to a median of 0.16 percent.
- Overage shrinks as the guarantee rises. Dry kibble protein sits at 1.163 where the printed minimum is below 23 percent, 1.088 where the printed minimum is 23 to 26 percent and 1.054 where the printed minimum is 26 percent and above. One margin per format is therefore a simplification, and the data file carries the bands.
- The population is narrow, and that is the honest headline. Every kind of food here is carried by one maker. Dry kibble and canned and wet pouches are Purina Pro Plan Veterinary Diets; Fresh, cooked or refrigerated is Wynwood Dog Food Co.. 10 of the 34 products are our own, so for that one kind of food we are the maker and we are not a neutral source. Both halves of every pair are printed on our public product pages, but the choice of which products form the population was ours.
The problem
Two labels, no way to compare them.
One label says 26% protein. Another says 9%. The second is not a third of the first, it is mostly water. Dry matter removes the water but not the energy density, and a dog is fed calories rather than kilograms. Everything therefore converts to grams per 1,000 kilocalories, the basis the AAFCO profiles are written on and the only one on which a kibble, a can and a fresh diet sit in one column.
grams per 1,000 kcal = (nutrient % as fed × 10,000) ÷ kcal per kg
Both inputs come off the label. But the first one is a promise. A guaranteed analysis states a minimum for crude protein and crude fat, and a maximum for crude fibre, moisture and ash. The real food is normally on the other side of those numbers, and the label never says by how far. Converting a printed 26% into a single figure is false precision. The honest output is a range, and that range has to be measured.
Method
Defining a margin.
For one product, the margin is the ratio of its typical content to its own printed guarantee. Same product, both figures as fed.
margin = typical % ÷ guaranteed %
A ratio rather than a difference in percentage points, so the figure transfers between products of different nutrient density. Margins on minima come out above 1.00, margins on maxima below it. Each is reported as the 10th, 50th and 90th percentile of the observed distribution rather than the observed minimum and maximum, so one atypical product cannot set the bounds for an entire format.
That choice is tested rather than argued, on this data, at every build. The two models are compared on every format and nutrient cell by coefficient of variation, the lower being the more transferable.
| Food type | Nutrient | Products | CV, ratio | CV, difference | Lower is better |
|---|---|---|---|---|---|
| Dry kibble | Crude protein | 15 | 0.044 | 0.443 | Ratio |
| Dry kibble | Crude fat | 11 | 0.074 | 0.315 | Ratio |
| Dry kibble | Crude fibre | 15 | 0.320 | 0.609 | Ratio |
| Canned and wet pouches | Crude protein | 9 | 0.084 | 0.401 | Ratio |
| Canned and wet pouches | Crude fat | 7 | 0.159 | 0.246 | Ratio |
| Canned and wet pouches | Crude fibre | 9 | 0.482 | 0.501 | Ratio |
| Fresh, cooked or refrigerated | Crude protein | 10 | 0.022 | 0.153 | Ratio |
| Fresh, cooked or refrigerated | Crude fat | 10 | 0.067 | 0.221 | Ratio |
| Fresh, cooked or refrigerated | Crude fibre | 10 | 0.181 | 0.064 | Difference |
The ratio model wins 8 of the 9 cells. It loses fresh, cooked or refrigerated crude fibre, and the ratio is used there anyway so that one model covers the whole file. That is a stated choice rather than a measurement, and it makes that the weakest cell published here.
Results
The margins.
96 paired observations on 34 products. Multipliers applied to the printed guarantee. Minima are floored at 1.00 and maxima capped at 1.00.
| Food type | Products | Confidence | Nutrient | Guarantee is a | p10 | p50 | p90 |
|---|---|---|---|---|---|---|---|
| Dry kibble | 15 | High | Crude protein | Minimum | 1.04 | 1.092 | 1.168 |
| Crude fat | Minimum | 1.109 | 1.219 | 1.357 | |||
| Crude fibre | Maximum | 0.33 | 0.49 | 0.682 | |||
| Canned and wet pouches | 9 | Low | Crude protein | Minimum | 1.156 | 1.343 | 1.468 |
| Crude fat | Minimum | 1.341 | 1.63 | 2.082 | |||
| Crude fibre | Maximum | 0.186 | 0.42 | 0.804 | |||
| Fresh, cooked or refrigerated | 10 | High | Crude protein | Minimum | 1.062 | 1.081 | 1.127 |
| Crude fat | Minimum | 1.091 | 1.185 | 1.308 | |||
| Crude fibre | Maximum | 0.361 | 0.508 | 0.619 |
A cell built on fewer than 5 products is left out of the published file entirely rather than published with a caution attached, which is why some formats carry fewer nutrients than others. No moisture margin is published for any format: these makers print carbohydrate instead of moisture, so no moisture pair exists to measure and the converter does not discount a guaranteed moisture maximum at all.
| Food type | Products | Low | Middle | High |
|---|---|---|---|---|
| Dry kibble | 14 | 2.415% | 5.992% | 9.55% |
| Canned and wet pouches | 9 | 0% | 1.25% | 2.9% |
| Fresh, cooked or refrigerated | — | no ash could be bounded, so carbohydrate is withheld for this food type rather than borrowing another type's ash | ||
Low is the 10th percentile of the per product lower bounds and high is the 90th percentile of the upper bounds. The middle is the median of the midpoints and is not an observation: it sits between two bounds. The converter sweeps all three, so the middle neither widens nor narrows the result.
The load-bearing finding
The calorie denominator does not move.
The conversion divides nutrient percentage by the label's stated calorie density, so it matters whether inflating the numerator should also inflate the denominator. It should not. AAFCO Model Regulation PF9 requires a calculated calorie statement to be derived from average values, with fibre, moisture and ash determined in the same manner. The printed calorie figure therefore already reflects the real protein and fat.
This is verified on the data rather than taken on trust. For all 28 products carrying a published carbohydrate, the typical values reproduce the maker's own printed kcal per kg under modified Atwater factors, to a median of 0.16 percent and a worst case of 2.19 percent. Guaranteed values do not reproduce it at all. The margin is applied to the numerator alone.
A worked example
| Label says protein, % as fed | 26 |
|---|---|
| Label says calories, kcal per kg | 3,800 |
| Dry kibble protein margin, p10 | 1.04 |
| Dry kibble protein margin, p90 | 1.168 |
| Adjusted protein, low end | 27.0% |
| Adjusted protein, high end | 30.4% |
| Grams per 1,000 kcal, low end | 71.2 |
| Grams per 1,000 kcal, high end | 79.9 |
The calorie figure is not adjusted. The printed calories already reflect the real protein and fat.
The pairing test
Proving both halves are the same food.
The weak point of this method is pairing. A guarantee from one product accidentally matched to a typical table from another produces a margin that looks perfectly reasonable and means nothing. So every product has to pass an arithmetic test before any of its rows are used, and the test is the maker's own calorie statement.
kcal per kg = 10 × (3.5 · protein + 8.5 · fat + 3.5 · carbohydrate), all as fed
If the maker's own nutrient table does not reproduce the maker's own printed calorie figure, the two documents are not describing one food and the product is dropped. The tolerance is 2.5 percent: not zero, because makers round what they print, and not generous, because a real mispairing misses by far more than rounding.
- residual, 96 observations. Moisture and ash are published as one number, carbohydrate, so they cannot be separated. The published carbohydrate has to reproduce the printed calorie statement, what remains has to be positive, and it has to fit inside the label's own maxima. This is a weaker test than the ash back solve, and the published file records that per cell, by count, rather than hiding it.
Ash, which nobody publishes
To turn a label into carbohydrate you need ash, and ash is not a required guarantee, so most labels do not print it. The usual practice is to assume a number. We do not assume one. We bound it, using only figures printed on the product's own label and in its own nutrient table.
residual = 100 − protein − fat − fibre − carbohydrate = moisture + ash
Moisture and ash are the only two things left, so their sum is known exactly. That gives two bounds with nothing modelled in either: ash is at least the residual minus the label's moisture maximum, and at most the label's ash maximum. Where a label prints no ash maximum there is no upper bound at all, only the residual, and the residual includes all the water. On a fresh food that is around 70 percent, so "ash is somewhere between 0 and 70 percent" is true and tells you nothing. A bound that does not bound is not published, which is why fresh food carries no ash figure and the converter declines to give it a carbohydrate range rather than inventing one.
Decisions
The choices, and why.
Percentiles
Weighted, at midpoint of weight positions, with linear interpolation and no extrapolation past the highest and lowest products actually measured. The 10th and 90th are used rather than the minimum and maximum so that one unusual product cannot set the range for everything else.
Pooling at equal weight
Every population present in a cell carries the same total weight whatever its row count, so a published percentile cannot become an artefact of how many rows one source happened to yield. On this build the rule is inert, and it is worth saying so plainly: every row is a manufacturer's own published typical value, so there is one population and nothing is being balanced against anything. The rule stays in the build because the moment a second kind of evidence appears, raw counts would otherwise decide the answer.
Clamping at 1.00
Margins on minima are floored at 1.00 and on maxima capped at 1.00. On this data the clamp never fires and removes nothing: 0 of 34 crude protein, 0 of 28 crude fat and 0 of 34 crude fibre values fall on the wrong side of their own guarantee. That is what you would expect of manufacturer typical values, which are a maker describing a food it formulated to clear its own label. It also means the clamp is doing no hidden work here, and the unclamped figures carried in the data file are identical to the published ones.
A cell below the floor is omitted, not flagged
A format and nutrient cell built on fewer than 5 products is left out of the published file rather than published with a warning attached to it. A figure that is on the page looks like a figure you can use, and a caution underneath does not undo that.
Data
Every source, named.
Each row below is one product. The guarantee and the typical value are listed separately because they routinely come from two different documents, and a method that records only one source cannot show you that.
Dry kibble
| Product | kcal/kg | Guarantee | Typical values |
|---|---|---|---|
| CC CardioCare Dry Dog Food | 3672 | Guaranteed Analysis table | Average Nutrient Content, guide page 7 |
| DRM Dermatologic Management Naturals Dry Dog Food | 3665 | Guaranteed Analysis table | Average Nutrient Content, guide page 13 |
| EL Elemental Dry Dog Food | 3316 | Guaranteed Analysis table | Average Nutrient Content, guide page 15 |
| EN Gastroenteric Dry Dog Food | 3503 | Guaranteed Analysis table | Average Nutrient Content, guide page 17 |
| EN Gastroenteric Fiber Balance Dry Dog Food | 3348 | Guaranteed Analysis table | Average Nutrient Content, guide page 23 |
| EN Gastroenteric Low Fat Dry Dog Food | 3216 | Guaranteed Analysis table | Average Nutrient Content, guide page 25 |
| EN Gastroenteric Naturals Dry Dog Food | 3549 | Guaranteed Analysis table | Average Nutrient Content, guide page 21 |
| HA Hydrolyzed Protein Chicken Flavor Dry Dog Food | 3579 | Guaranteed Analysis table | Average Nutrient Content, guide page 29 |
| HA Hydrolyzed Protein Salmon Dry Dog Food | 3492 | Guaranteed Analysis table | Average Nutrient Content, guide page 31 |
| JM Joint Mobility Dry Dog Food | 3571 | Guaranteed Analysis table | Average Nutrient Content, guide page 33 |
| NC NeuroCare Dry Dog Food | 3732 | Guaranteed Analysis table | Average Nutrient Content, guide page 35 |
| NF Kidney Function Dry Dog Food | 3860 | Guaranteed Analysis table | Average Nutrient Content, guide page 37 |
| OM Metabolic Response & Joint Mobility Dry Dog Food | 3250 | Guaranteed Analysis table | Average Nutrient Content, guide page 43 |
| OM Overweight Management Dry Dog Food | 2918 | Guaranteed Analysis table | Average Nutrient Content, guide page 39 |
| OM Overweight Management Select Blend Chicken Flavor Dry Dog Food | 2941 | Guaranteed Analysis table | Average Nutrient Content, guide page 41 |
Canned and wet pouches
| Product | kcal/kg | Guarantee | Typical values |
|---|---|---|---|
| CC CardioCare Wet Dog Food | 1016 | Guaranteed Analysis table | Average Nutrient Content, guide page 7 |
| EN Gastroenteric Low Fat Wet Dog Food | 956 | Guaranteed Analysis table | Average Nutrient Content, guide page 25 |
| EN Gastroenteric Wet Dog Food | 1164 | Guaranteed Analysis table | Average Nutrient Content, guide page 17 |
| EN Savory Selects Gastroenteric with Chicken in Gravy Canine Formula (Canned) | 891 | Guaranteed Analysis table | Average Nutrient Content, guide page 19 |
| EN Savory Selects Gastroenteric with Lamb in Gravy Canine Formula (Canned) | 909 | Guaranteed Analysis table | Average Nutrient Content, guide page 19 |
| HA Hydrolyzed Protein Chicken Wet Dog Food | 905 | Guaranteed Analysis table | Average Nutrient Content, guide page 29 |
| NF Kidney Function Wet Dog Food | 1282 | Guaranteed Analysis table | Average Nutrient Content, guide page 37 |
| OM Overweight Management Wet Dog Food | 663 | Guaranteed Analysis table | Average Nutrient Content, guide page 39 |
| UR Urinary Ox/St Wet Dog Food | 1027 | Guaranteed Analysis table | Average Nutrient Content, guide page 45 |
Fresh, cooked or refrigerated
| Product | kcal/kg | Guarantee | Typical values |
|---|---|---|---|
| ALLERGY + SKIN | 1632 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| BEEF + POTATO | 1236.87 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| CARDIAC | 1319 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| CHICKEN + RICE | 1474.47 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| DIGESTIVE | 1448 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| LAMB + EGG | 1161.6 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| LOW FAT DIGESTIVE | 1039 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| TURKEY + SWEET POTATO | 976.81 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| VENISON + SQUASH | 1032.5 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
| WEIGHT + MOBILITY | 1069 | Guaranteed Analysis basis toggle | Basics, per 1,000 kcalsame page |
Both halves of every pair come from the maker of the food. No retailer, aggregator or third party supplied any figure on this page. 10 of the 34 products are made by the publisher of this page. That is declared rather than explained away: the figures can be checked by anyone, but the choice of which products form the population was ours.
Exclusions
What was thrown out.
21 of 117 observations were excluded. The exclusion log is published in full, because showing what was rejected and why is most of what separates a method from a brochure.
not complete diet, 12 observations across 4 products
The product is not a complete and balanced diet, so it does not belong in a population of complete diets.
| Product | Nutrients | What happened |
|---|---|---|
| HEPATICWynwood Dog Food Co. | Crude fat, Crude fibre, Crude protein | product_role is 'supplement' |
| LOW FAT RENALWynwood Dog Food Co. | Crude fat, Crude fibre, Crude protein | product_role is 'supplement' |
| RENALWynwood Dog Food Co. | Crude fat, Crude fibre, Crude protein | product_role is 'supplement' |
| URINARYWynwood Dog Food Co. | Crude fat, Crude fibre, Crude protein | product_role is 'supplement' |
bracketed guarantee, 6 observations across 6 products
The label prints both a minimum and a maximum for this nutrient, and a printed maximum always beats a modelled margin.
| Product | Nutrients | What happened |
|---|---|---|
| EL Elemental Dry Dog FoodPurina Pro Plan Veterinary Diets | Crude fat | the label prints both a minimum and a maximum for this nutrient |
| EN Gastroenteric Low Fat Dry Dog FoodPurina Pro Plan Veterinary Diets | Crude fat | the label prints both a minimum and a maximum for this nutrient |
| EN Gastroenteric Low Fat Wet Dog FoodPurina Pro Plan Veterinary Diets | Crude fat | the label prints both a minimum and a maximum for this nutrient |
| OM Overweight Management Dry Dog FoodPurina Pro Plan Veterinary Diets | Crude fat | the label prints both a minimum and a maximum for this nutrient |
| OM Overweight Management Select Blend Chicken Flavor Dry Dog FoodPurina Pro Plan Veterinary Diets | Crude fat | the label prints both a minimum and a maximum for this nutrient |
| OM Overweight Management Wet Dog FoodPurina Pro Plan Veterinary Diets | Crude fat | the label prints both a minimum and a maximum for this nutrient |
calorie statement mismatch, 3 observations across 1 products
The maker's own nutrient table does not reproduce the maker's own printed calorie statement, so the two are not describing one food.
| Product | Nutrients | What happened |
|---|---|---|
| EN Gastroenteric Naturals Wet Dog FoodPurina Pro Plan Veterinary Diets | Crude fat, Crude fibre, Crude protein | the published carbohydrate implies 1089 kcal/kg by modified Atwater against a printed 1130, a gap of 3.67% on a tolerance of 2.5%: the nutrient table and the calorie statement are not describing one product |
Limits
What this does not support.
- It is not a survey of the market. Every kind of food here is carried by a single maker. Dry kibble and canned and wet pouches are Purina Pro Plan Veterinary Diets; Fresh, cooked or refrigerated is Wynwood Dog Food Co.. Applying a margin to a different brand or a different tier of product is an extrapolation, and the direction of the error is not known. A therapeutic line may hold tighter formulation tolerances than a supermarket one, or looser. This is the largest single limitation of the file.
- For fresh food, we are the maker. No other fresh maker publishes a guarantee and a typical value for the same product at the same time, so the fresh figures are built from our own recipes, 10 of the 34 products here. Both halves of every pair are printed on our public product pages and can be checked by anyone, but the choice of which products form the population was ours. We are not a neutral source for that one kind of food.
- Nothing here was tested by an independent laboratory. Every typical value is the maker's own published figure. That is the same class of evidence for every product on this page, ours included, and it is not the same thing as an outside assay of a retail bag.
- There is no moisture margin. These makers publish carbohydrate instead of moisture, so no moisture pair exists to measure. The converter therefore does not discount a guaranteed moisture maximum at all. It uses the number printed on the label, which will usually be too high.
- The pairing test is the weaker one throughout. No maker on this page publishes typical ash, so the strong ash back solve never runs and every product is gated on the residual test instead. The published file records that per cell rather than hiding it.
- One margin per format is a simplification. Overage shrinks as the printed guarantee rises, consistently, and the data file carries the bands. The converter still applies one margin per format. Branching on the size of the printed guarantee is the obvious next version.
- Amino acids, vitamins and trace minerals are not on labels. Nothing here speaks to them, which is why the converter reports them as bounds rather than ranges.
- A guaranteed analysis says nothing about digestibility, ingredient quality, or whether the diet was ever fed to a dog. This compares what is declared. It does not compare foods.
The data
Free to reuse with attribution. The row level file is the deliverable, not this page: every percentile above regenerates from it, and if it does not, the build refuses to publish. Checksum 25f2c07cce58fd3f.
- One row is one product and one nutrient, carrying both source URLs.
- Open any row, follow the two URLs, and read the two figures off the maker's own pages.
- Divide the typical value by the guarantee. That is the margin for that row.
- Take every included row for one kind of food and one nutrient. The 10th, 50th and 90th percentile of those margins are the three numbers published above.
How to cite this
Wynwood Dog Food Co. (2026). Guaranteed analysis margins for dog food labels: converting printed guarantees to expected ranges. Version 2.0.0-rc1. https://wynwooddogfood.com/pages/label-methodology
References
Works cited.
- Association of American Feed Control Officials. Model Regulation PF9, calorie content statements. The basis for treating a printed calculated calorie figure as already reflecting typical values.
- Product pages at https://wynwooddogfood.com, Guaranteed Analysis panels and published nutrient tables.
- Product pages at https://www.proplanvetdirect.com, Guaranteed Analysis panels and published nutrient tables.
- Purina Pro Plan Veterinary Diets 2026 Product Guide. https://www.proplanvet.com/media/wysiwyg/Vet_Direct/PDF/Digital_Product_Guide/ppv-2026-product-guide.pdf
- Hill RC, Choate CJ, Scott KC, Molenberghs G. Comparison of the guaranteed analysis with the measured nutrient composition of commercial pet foods. J Am Vet Med Assoc. 2009;234(3):347-351. The largest published comparison of its kind, n=2208. Listed as prior work only: no row on this page comes from it and nothing here is validated against it.
Try it on a label.
The tool applies everything on this page. Enter any dog food label and see the range.





