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.

Version 2.0.0-rc1 · Published 2026-09-05 · Wynwood Dog Food Co. · Free to reuse with attribution

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.

Table 1. Ratio against difference, by coefficient of variation
Food typeNutrientProductsCV, ratioCV, differenceLower is better
Dry kibbleCrude protein150.0440.443Ratio
Dry kibbleCrude fat110.0740.315Ratio
Dry kibbleCrude fibre150.3200.609Ratio
Canned and wet pouchesCrude protein90.0840.401Ratio
Canned and wet pouchesCrude fat70.1590.246Ratio
Canned and wet pouchesCrude fibre90.4820.501Ratio
Fresh, cooked or refrigeratedCrude protein100.0220.153Ratio
Fresh, cooked or refrigeratedCrude fat100.0670.221Ratio
Fresh, cooked or refrigeratedCrude fibre100.1810.064Difference

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.

Table 2. Guaranteed analysis margins by food type
Food typeProductsConfidenceNutrientGuarantee is ap10p50p90
Dry kibble15HighCrude proteinMinimum1.041.0921.168
Crude fatMinimum1.1091.2191.357
Crude fibreMaximum0.330.490.682
Canned and wet pouches9LowCrude proteinMinimum1.1561.3431.468
Crude fatMinimum1.3411.632.082
Crude fibreMaximum0.1860.420.804
Fresh, cooked or refrigerated10HighCrude proteinMinimum1.0621.0811.127
Crude fatMinimum1.0911.1851.308
Crude fibreMaximum0.3610.5080.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.

Table 3. Ash bounds as fed, used only to derive carbohydrate by difference
Food typeProductsLowMiddleHigh
Dry kibble142.415%5.992%9.55%
Canned and wet pouches90%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

Table 4. A 26 percent protein kibble at 3,800 kcal per kg
Label says protein, % as fed26
Label says calories, kcal per kg3,800
Dry kibble protein margin, p101.04
Dry kibble protein margin, p901.168
Adjusted protein, low end27.0%
Adjusted protein, high end30.4%
Grams per 1,000 kcal, low end71.2
Grams per 1,000 kcal, high end79.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

Purina Pro Plan Veterinary Diets. Guarantees read 2026-09-04. Typical values from Purina Pro Plan Veterinary Diets 2026 Product Guide, read 2026-09-04.
Productkcal/kgGuaranteeTypical values
CC CardioCare Dry Dog Food3672Guaranteed Analysis tableAverage Nutrient Content, guide page 7
DRM Dermatologic Management Naturals Dry Dog Food3665Guaranteed Analysis tableAverage Nutrient Content, guide page 13
EL Elemental Dry Dog Food3316Guaranteed Analysis tableAverage Nutrient Content, guide page 15
EN Gastroenteric Dry Dog Food3503Guaranteed Analysis tableAverage Nutrient Content, guide page 17
EN Gastroenteric Fiber Balance Dry Dog Food3348Guaranteed Analysis tableAverage Nutrient Content, guide page 23
EN Gastroenteric Low Fat Dry Dog Food3216Guaranteed Analysis tableAverage Nutrient Content, guide page 25
EN Gastroenteric Naturals Dry Dog Food3549Guaranteed Analysis tableAverage Nutrient Content, guide page 21
HA Hydrolyzed Protein Chicken Flavor Dry Dog Food3579Guaranteed Analysis tableAverage Nutrient Content, guide page 29
HA Hydrolyzed Protein Salmon Dry Dog Food3492Guaranteed Analysis tableAverage Nutrient Content, guide page 31
JM Joint Mobility Dry Dog Food3571Guaranteed Analysis tableAverage Nutrient Content, guide page 33
NC NeuroCare Dry Dog Food3732Guaranteed Analysis tableAverage Nutrient Content, guide page 35
NF Kidney Function Dry Dog Food3860Guaranteed Analysis tableAverage Nutrient Content, guide page 37
OM Metabolic Response & Joint Mobility Dry Dog Food3250Guaranteed Analysis tableAverage Nutrient Content, guide page 43
OM Overweight Management Dry Dog Food2918Guaranteed Analysis tableAverage Nutrient Content, guide page 39
OM Overweight Management Select Blend Chicken Flavor Dry Dog Food2941Guaranteed Analysis tableAverage Nutrient Content, guide page 41

Canned and wet pouches

Purina Pro Plan Veterinary Diets. Guarantees read 2026-09-04. Typical values from Purina Pro Plan Veterinary Diets 2026 Product Guide, read 2026-09-04.
Productkcal/kgGuaranteeTypical values
CC CardioCare Wet Dog Food1016Guaranteed Analysis tableAverage Nutrient Content, guide page 7
EN Gastroenteric Low Fat Wet Dog Food956Guaranteed Analysis tableAverage Nutrient Content, guide page 25
EN Gastroenteric Wet Dog Food1164Guaranteed Analysis tableAverage Nutrient Content, guide page 17
EN Savory Selects Gastroenteric with Chicken in Gravy Canine Formula (Canned)891Guaranteed Analysis tableAverage Nutrient Content, guide page 19
EN Savory Selects Gastroenteric with Lamb in Gravy Canine Formula (Canned)909Guaranteed Analysis tableAverage Nutrient Content, guide page 19
HA Hydrolyzed Protein Chicken Wet Dog Food905Guaranteed Analysis tableAverage Nutrient Content, guide page 29
NF Kidney Function Wet Dog Food1282Guaranteed Analysis tableAverage Nutrient Content, guide page 37
OM Overweight Management Wet Dog Food663Guaranteed Analysis tableAverage Nutrient Content, guide page 39
UR Urinary Ox/St Wet Dog Food1027Guaranteed Analysis tableAverage Nutrient Content, guide page 45

Fresh, cooked or refrigerated

Wynwood Dog Food Co. Guarantees read 2026-09-05. Both figures are printed on each product's own page.
Productkcal/kgGuaranteeTypical values
ALLERGY + SKIN1632Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
BEEF + POTATO1236.87Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
CARDIAC1319Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
CHICKEN + RICE1474.47Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
DIGESTIVE1448Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
LAMB + EGG1161.6Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
LOW FAT DIGESTIVE1039Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
TURKEY + SWEET POTATO976.81Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
VENISON + SQUASH1032.5Guaranteed Analysis basis toggleBasics, per 1,000 kcalsame page
WEIGHT + MOBILITY1069Guaranteed Analysis basis toggleBasics, 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.

ProductNutrientsWhat happened
HEPATICWynwood Dog Food Co.Crude fat, Crude fibre, Crude proteinproduct_role is 'supplement'
LOW FAT RENALWynwood Dog Food Co.Crude fat, Crude fibre, Crude proteinproduct_role is 'supplement'
RENALWynwood Dog Food Co.Crude fat, Crude fibre, Crude proteinproduct_role is 'supplement'
URINARYWynwood Dog Food Co.Crude fat, Crude fibre, Crude proteinproduct_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.

ProductNutrientsWhat happened
EL Elemental Dry Dog FoodPurina Pro Plan Veterinary DietsCrude fatthe label prints both a minimum and a maximum for this nutrient
EN Gastroenteric Low Fat Dry Dog FoodPurina Pro Plan Veterinary DietsCrude fatthe label prints both a minimum and a maximum for this nutrient
EN Gastroenteric Low Fat Wet Dog FoodPurina Pro Plan Veterinary DietsCrude fatthe label prints both a minimum and a maximum for this nutrient
OM Overweight Management Dry Dog FoodPurina Pro Plan Veterinary DietsCrude fatthe label prints both a minimum and a maximum for this nutrient
OM Overweight Management Select Blend Chicken Flavor Dry Dog FoodPurina Pro Plan Veterinary DietsCrude fatthe label prints both a minimum and a maximum for this nutrient
OM Overweight Management Wet Dog FoodPurina Pro Plan Veterinary DietsCrude fatthe 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.

ProductNutrientsWhat happened
EN Gastroenteric Naturals Wet Dog FoodPurina Pro Plan Veterinary DietsCrude fat, Crude fibre, Crude proteinthe 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.

  1. One row is one product and one nutrient, carrying both source URLs.
  2. Open any row, follow the two URLs, and read the two figures off the maker's own pages.
  3. Divide the typical value by the guarantee. That is the margin for that row.
  4. 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.

  1. 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.
  2. Product pages at https://wynwooddogfood.com, Guaranteed Analysis panels and published nutrient tables.
  3. Product pages at https://www.proplanvetdirect.com, Guaranteed Analysis panels and published nutrient tables.
  4. 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
  5. 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.