Methodology
How nutrition data is sourced, normalized, and verified.

This page documents the thought process and rules behind everything on Compare Cat Foods. If you’re simply wanting an idea of what this website does and why, please see the About section.
Dry-matter basis (DMB)
Unlike human food labels that publish nutrient data by weight, cat food labels list nutrients as percentages. As if matters needed to be confused even more, the data is published in what is referred to as the as-fed state — aka percentages that include water. Rather than a can of food saying it contains 20 grams of protein, it will instead say it is X% protein, Y% water, and so on.
As you can imagine, this makes it quite hard to understand just how much protein or phosphorus or any other nutrient your cat is actually eating. Imagine this scenario: I add 20 grams of pure protein into a bowl. It is now 100% protein. But what if I add 80 grams of water? It is now only 20% protein, but nutritionally it remains entirely the same.
This ambiguity and confusion can cause a real headache if your cat has special dietary needs. Restricting your cat’s intake of phosphorus or any other nutrient becomes tricky when you do not know how much water is being included when a food says it is only “1% phosphorus” or “20% protein”.
To remove this ambiguity, every product on this site is shown on a dry-matter basis (DMB) — what the food contains after water is removed.
The conversion formula is:
DMB% = as_fed_pct ÷ (100 − moisture_pct) × 100
When a manufacturer publishes food data in a DMB format, we record those values directly and they are presented unchanged. Such data is tagged and referred to as Manufacturer-published. When a manufacturer publishes only as-fed or guaranteed-analysis values, we record the numbers exactly as printed and convert them to DMB for display. A converted figure is tagged Calculated with an asterisk * — the underlying inputs are still the manufacturer’s; the conversion is ours.
Regrettably, most manufacturers do not publish their own DMB values. Worse yet, most barely publish anything more than protein, fat, fiber, and moisture.
Source hierarchy
Nearly all nutrition data comes directly from manufacturer websites and packaging. Retailers and review sites are not used because their nutrition data can be stale or wrong. Within a manufacturer’s own published material, we rank sources in this order:
- Manufacturer nutrient profiles — the formal, lab-analyzed nutrient breakdown a manufacturer prepares for a product, often averaged across production runs (usually giving both as-fed and dry-matter figures). Some brands publish this as a downloadable PDF while others publish the same kind of data as a dedicated web page. Regardless, it is the most authoritative source. When a brand uses a dedicated PDF or web page that is separate from the product page, our database will link to it.
- Manufacturer product pages — the marketing page for a product, which usually shows only a guaranteed-analysis panel (minimum and maximum guarantees). Used when a brand publishes no full nutrient profile, or for a value the profile doesn’t list.
- Manufacturer packaging / label — used when the value isn’t available in either of the above.
When a value appears in more than one of these places and the numbers disagree, the nutrient profile is used.
We also don’t mix documents within a single group of nutrients. Some brands publish a lab-grade analysis listing the individual fatty acids, plus a separate guaranteed-analysis panel listing an omega minimum. The lab analysis is the better document, so it is the one we read for that whole group — and if it doesn’t state a total, we leave the total blank rather than borrowing a regulatory minimum from the other panel to fill the gap. Mixing the two would put a floor and a typical value side by side and invite you to read them as the same kind of number. Across different nutrients a food can still mix the two; we mark each guaranteed figure min or max. Where a guaranteed analysis is the only place a figure appears, it is simply the published value and we use it.
When the need arises, we may also reach out to a manufacturer via email to get product information. If this happens, the email correspondence will be published and cited in the manufacturer sources section of a product’s datasheet. It will be considered the final word that settles any disagreements in the manufacturer’s own published data. Personal names and contact information will be redacted, but the manufacturer’s wording will be otherwise unchanged.
Minimum, maximum and typical values
Not every number a manufacturer prints means the same thing. The guaranteed analysis on a can or bag lists each nutrient as a guarantee, such as “Crude Protein (min) 11%” or “Crude Fiber (max) 1%”. A minimum promises the food contains at least that much, and a maximum promises it contains no more. A food can contain more protein than its minimum, or less fiber than its maximum, and still keep its promise. A nutrient profile is a different kind of document. It reports what the food typically contains, usually averaged across production runs, and manufacturers call it a typical analysis or average nutrient content.
So you can tell them apart, guaranteed figures carry a small tag:
- guaranteed minimum, A guaranteed minimum. The food contains at least this much.
- guaranteed maximum, A guaranteed maximum. The food contains no more than this.
A value without a tag is a typical (average) figure. It isn’t a guarantee, and it can run a little higher or lower from batch to batch. A line under each food’s nutrients says so: “Nutrient values are typical (average) unless marked min or max.”
We take each kind from the same manufacturer document as the value, exactly as that document prints it. Pet food labeling rules (AAFCO’s) have manufacturers print protein and fat as minimums and fiber and moisture as maximums, but we never fill in a kind from that convention. If the document doesn’t say what kind of number a value is, we leave it unclassified.
We are classifying values food by food as we go back through every manufacturer’s documents. Until every nutrient value on a food is classified, its line doesn’t call anything typical: it explains min and max and says the unmarked values haven’t been classified yet. Lists of many foods, such as the food list and brand pages, show the tags but never call a value typical; open a food to see its line.
A guarantee is a promise about the figure the manufacturer printed. A guaranteed minimum of 11% protein as fed, in a food with a maximum of 78% moisture, works out to 50% on a dry-matter basis. But the food may be drier than its maximum moisture, and at 75% moisture the same 11% is only 44% of the dry matter. So when we convert a guaranteed figure to another basis, we mark it “from min” or “from max” instead of “min” or “max”. It carries the asterisk like every value we calculate, and it is an estimate, not a guarantee. When a manufacturer prints both a minimum and a maximum for protein or fat, the value shows as a range marked min–max.
Calories are neither kind. A calorie statement is the manufacturer’s own estimate of the energy a cat can use from the food, usually calculated rather than measured, so calorie figures carry no tag.
Tags don’t change how foods are filtered or sorted; those use the number alone. When you compare foods, read the tags along with the numbers: a guaranteed minimum of 45% protein and a typical 45% protein are different statements about the food.
Implied-value back-calculation
There are sometimes cases where the nutrient profile PDF does not supply a particular value directly, but the value is mathematically attainable by what the PDF does choose to print. The clearest example is moisture. A PDF that publishes both the as-fed and DMB data for protein, fat, ash, and so on is using some moisture value to convert one to the other… and we can recover that information via a formula:
moisture_pct = 100 − (as_fed_value ÷ dmb_value) × 100
When the data all originates from the manufacturer, this isn’t tantamount to inventing data… it’s simply calculating back a value that is a mathematical certainty given their own published data.
In situations where (1) the PDF value is mathematically certain and (2) the manufacturer supplies an as-fed or guaranteed analysis “bare minimum” or “maximum” value, we will always defer to the back-calculated data from the PDF. If we were to accept the PDF’s DMB values but mix in non-lab-tested, bare-minimum “guaranteed analysis” values when we didn’t need to, it would create internal contradictions worse than the act of back-calculation itself.
Back-calculation is allowed only when all of these hold:
- The authoritative PDF is the source for related fields on the same product.
- The unpublished value can be recovered as a simple algebraic function of fields the PDF does publish.
- Multiple independent input pairs yield the same result within rounding tolerance.
The calculated result will be tagged Calculated with an asterisk.
Where back-calculation isn’t safe — aka, when insufficient data exists to allow for back-calculation — the value stays empty / null. We do not substitute values from the product page when the page disagrees significantly with the PDF’s internal math.
Incredibly rare, but related case: sometimes a manufacturer does publish a dry-matter value, but it is mathematically impossible given the as-fed value on the same page (typically a decimal-place typo in the DMB column — e.g. 1.18% printed where the as-fed math yields 0.118%). In these cases we override the published DMB with the back-calculated value from the internally-consistent as-fed reading. This only happens when the manufacturer’s own arithmetic disagrees with itself, and the corrected value is always tagged Calculated.
Phosphorus per 100 kcal
For cats with kidney concerns, the percentage of phosphorus in a food isn’t the most useful number. A cat eats to meet its calorie needs, so what actually matters is how much phosphorus comes along with each calorie. Two foods can show the same phosphorus percentage yet deliver very different amounts of phosphorus per calorie if one is more calorie-dense than the other. For this reason the veterinary convention — and the figure you can sort and filter by on this site — is phosphorus expressed as milligrams per 100 kcal.
When a manufacturer publishes this figure directly (some nutrient profiles do), we use it as-is and tag it Manufacturer-published. When they don’t, we calculate it from the food’s phosphorus and calorie density — using the printed as-fed percentage directly when that is what the manufacturer publishes, or converting from dry matter via moisture first:
as_fed_P_pct = dmb_P_pct × (100 − moisture_pct) ÷ 100 P_mg_per_100kcal = as_fed_P_pct × 1,000,000 ÷ kcal_per_kg
The first line converts the dry-matter phosphorus shown elsewhere on the site back to its as-fed percentage (the reverse of the dry-matter conversion). The constant 1,000,000 in the second line does two jobs at once: it turns that percentage into the milligrams of phosphorus contained in one kilogram of food, and it rescales the food’s calories from a full kilogram down to a single 100-kcal portion. A value we calculate this way is tagged Calculated with an asterisk *.
Phosphorus came first, but the same arithmetic now covers calcium, magnesium, sodium, and potassium as well — and it is exactly the math behind the site-wide Per 100 kcal view described in the next section.
One food, three bases: DMB, per 100 kcal, as fed
Every expanded food listing — and every product page — carries a small switch above the nutrient table: DMB %, Per 100 kcal, and As fed. Nothing about the food changes when you switch; the same nutrients are simply expressed three different ways.
Dry-matter basis is the default view, and it is what every filter, sort, and comparison on the site runs on — it is the only basis on which wet and dry foods compare fairly. Behind the scenes, each value is recorded in the form its manufacturer actually publishes: dry-matter when a formal nutrient profile prints it, as-fed when the manufacturer prints only as-fed figures, usually a guaranteed analysis, and per 100 kcal when a veterinary product guide publishes its nutrition on an energy basis. That recorded number is the one we personally review against the source, digit for digit. Whichever view you pick, anything the manufacturer didn’t publish in that exact form is calculated on the spot from the recorded value, the food’s moisture, and its calorie density (kcal/kg).
For a food whose values are recorded on a dry-matter basis, the as-fed view reverses the dry-matter conversion:
as_fed_pct = dmb_pct × (100 − moisture_pct) ÷ 100
The per-100 kcal view takes that as-fed figure one step further and asks how much of the nutrient rides along with a 100-kcal portion of the food:
mg_per_100kcal = as_fed_pct × 1,000,000 ÷ kcal_per_kg g_per_100kcal = as_fed_pct × 1,000 ÷ kcal_per_kg
The only difference between those two lines is the unit: milligrams for minerals, amino acids, and other trace-scale nutrients; grams for protein, fat, and the other large ones.
For a food whose manufacturer published only as-fed figures, the As fed view works the other way around: it simply shows the recorded printed numbers themselves — no conversion, no asterisk — and it is the dry-matter view that is calculated on the spot.
The rule is the same in every view: wherever a figure exists in the exact form a view shows — the mineral tables on certain nutrient profiles, the product guides that accompany veterinary diets, a printed guaranteed analysis — we show it exactly as published, and it appears without an asterisk. Every other number is calculated on the spot as described above and carries the Calculated asterisk *.
Both alternate views depend on the food’s moisture, and the per-100 kcal view additionally depends on its calorie density. When the manufacturer doesn’t publish one of those, the switched value shows “—” instead — the same no-guessing rule that governs everything else here.
Calories per can work the same way. Some manufacturers publish only a food’s calorie density — calories per kilogram — without stating calories for the can or pouch itself. In that case the per-serving number we show is computed from that density and the package’s weight, and it carries the same Calculated asterisk *. When the manufacturer prints a per-serving calorie figure, we show that figure exactly as published.
One exception: vitamin E and vitamin C are published per kilogram, and manufacturers are not consistent enough about whether that means per kilogram of food or of dry matter for us to convert older records safely. Those keep their per-kilogram form in every view, and the toggle simply doesn’t apply to them. Where we have the manufacturer’s printed as-fed figure on record, it converts like any other value.
Omega-3 and Omega-6
Most manufacturers publish “Omega-3” and “Omega-6” as a single total in their guaranteed analysis. A smaller number break them down into individual fatty acids instead:
- Omega-6: Linoleic Acid, Arachidonic Acid
- Omega-3: alpha-Linolenic Acid (ALA), EPA, DHA
We show the total only when the manufacturer publishes a total. When a label lists only the components, the Omega-3 or Omega-6 row is left blank and the individual fatty acids are listed underneath it. We do not add the components up.
That may look like a missed opportunity, so it is worth saying why. An omega total is an open-ended group, and cat food labels never break out all of it — so adding up the listed parts gives a floor, not a total. On products where a manufacturer publishes both a real total and a partial breakdown, the parts routinely come to a fraction of the published figure: one food lists a 0.043% component against a published 1.277% total. A number built that way would understate the food, and no manufacturer ever printed it. A blank cell is the honest answer, and it means the same thing here as everywhere else on this site — not stated by the manufacturer.
For the same reason, a single published figure is never used to fill two different fields. Some labels print only “Linoleic Acid” and others only “Omega-6 Fatty Acids”; linoleic acid is one omega-6 fatty acid, not the whole group, so whichever one the label doesn’t print stays blank.
EPA+DHA is the one subtotal we do calculate. Marine omega-3s (EPA and DHA) have meaningfully different clinical relevance than plant-source omega-3 (ALA), so we track them separately. When a manufacturer prints a combined EPA+DHA figure we show it as published. When it prints EPA and DHA on their own lines, we add those two together and mark the result with an asterisk. That addition is safe in a way an omega total isn’t: EPA+DHA is a named pair of exactly two things, so if both are printed the sum is the whole quantity, with nothing left out. When only one of the two is published we show that one on its own line and no combined figure — half a pair is not a subtotal. Most products don’t publish EPA or DHA at all, so the field is blank for the majority of the catalog.
No default or assumed values
When a manufacturer doesn’t publish a nutritional value, we leave it blank. We do not fill in:
- Sister-product values from the same brand line
- Brand-line averages
- Industry-typical defaults (“most kibble has ~10% moisture”)
- etc.
A blank cell means “not stated by the manufacturer” — not “zero”.
Cross-locale data
We only use data from the country where a product is sold. The same recipe often has different formulations in different markets, so we do not mix and match values to complete a set.
Given that I am an American, the catalog is North America focused. “We” are an incredibly small team of one and it’s unfortunately not feasible for us to collect information for all locales. While some non-North American items may be added from time to time, it is not something that is being prioritized.
What’s included
- Complete & balanced primary diets — wet and dry.
- Retail and prescription / veterinary diets.
What’s excluded
- Treats or other supplemental food such as bone broths, toppers, etc.
- Variety packs that mix flavors with averaged nutritional values.
- Discontinued products — when a manufacturer stops making a food, we take it off our food list, comparisons and search as soon as we confirm it. Its page stays up, marked Discontinued, with the nutrition and ingredients we last recorded and links to similar foods that are still made. We don’t show prices or store links for discontinued foods.
- Raw, freeze-dried, air-dried, and dehydrated foods — excluded based on FDA, CDC, WSAVA, and AVMA guidance. Some brands use “Raw” as a marketing term for products that are actually cooked or baked — those are still included. The exclusion also covers kibble that contains a freeze-dried raw component — raw pieces mixed into the bag or a raw coating applied after cooking.
Reviewed listings
I’ve personally hand checked every listing on the website against the manufacturer’s published data, and every new item is reviewed the same way before it’s added to the site.
Every product carries an Added Date, which signifies when the product’s data was first imported into our database, and a Last Checked date, which is the most recent time we checked the listing against the manufacturer for any discontinuations, reformulations, or other changes or discrepancies.
Please know that it is our goal to not only review every item once, but to review it again and again over time — just to make sure nothing changes. When something has changed, we update the listing to match: a reformulated recipe gets its updated nutrition and ingredients, and a discontinued food comes off our food list (see Discontinued products above).
Please note that our reviews do not convey nor suggest nor imply any sort of warranty or guarantee — we’re simply trying to make the website the best resource that it can be. Always double check the information for yourself and consult a vet for any pet medical matters.
Pricing
Where pricing appears, it comes from one of two places. For brands that sell directly from their own website, we show the maker’s own regular price — their list price, not a temporary sale price. For brands sold only through stores, we show a price estimate for that exact product and package size, based on what the major national retailers we track are advertising — the middle figure when several list it, or a single store’s price when only one does. Estimates are also steadied across our last few price checks — the middle of recent readings rather than any single day’s price — so a one-off sale doesn’t swing them. Together, these are the Typical Price the foods page shows by default.
Separately, where a food is carried by a retailer we partner with, you may also see a direct link to buy it there by name — currently Chewy and Amazon. Unlike the anonymous estimate, that one is a real listing pulled straight from that store, with its own price. If you use it to buy, we may earn a small commission at no extra cost to you (see our Affiliate Disclaimer); it never affects which foods appear here or how they are ranked.
The foods page has a Pricing control in the filters with four choices. Typical Price, the default, is the estimate described above. Best Price is the lowest current price among everything we track for a food — including a partner store’s own price, labeled with the store’s name when that’s what you’re seeing. Choosing Chewy shows Chewy’s own price wherever Chewy carries a food; where it doesn’t, the usual price estimate stands in, labeled so you can tell the difference. Amazon works the same way with Amazon’s own price. Whichever you pick, the price figures — and the sorting and cost filters built on them — follow it.
Chewy prices are refreshed automatically every day and Amazon prices twice a day; each product shows the date — and, for Amazon, the time — they were last checked. Product prices and availability are accurate as of the date/time indicated and are subject to change. Price estimates are re-checked periodically rather than daily. Either way, treat a price as a snapshot rather than a quote — the store you shop at may charge more or less on any given day, and sales come and go.
The cost-per-100-kcal figure is computed from that price and the product’s published calorie content, so you can compare what it actually costs to feed each food — a large bag of kibble and a small can are hard to compare any other way. Where a product’s price or calorie content isn’t available, the cost columns simply stay blank rather than showing a guess.
If a manufacturer objects
Every number on this site is from the manufacturer’s own published data. Links to said sources are cited on each item. This website does not engage in, or have any interest in, adding reviews, rankings, or commentary of our own. Given this, it’s my hope that manufacturers have very little to object to. That said, I’d like to outline the two request types a manufacturer could make and how we’d respond.
- A correction: if the data is wrong or out of date, we will happily amend it. We welcome any brand to reach out to us should we get something wrong, if a reformulation occurs, etc. A request for correction will need to be accompanied by either:
- Publicly available data from their website that we can cite to, or
- Confirmation via email that we can publish and cite to (as described in the Source hierarchy section)
- Pressure: a request to remove or alter information that is accurate and cited will be denied. If a manufacturer is unhappy with the numbers, the remedy is to change the data they publish on their website or the product itself. As of the time of writing, no manufacturer has ever attempted this.