Weighing Food Raw vs Cooked: Why Your Macros Are Wrong
Using raw database entries for cooked meals can undercount protein by 35% or triple your carbs. Here is how yield factors skew your tracking.
Using raw database entries for cooked meals can undercount protein by 35% or triple your carbs. Here is how yield factors skew your tracking.
Weigh a chicken breast raw, and you get a number. Grill it, weigh it again, and you get a smaller number. The protein did not leave; the water did. The packet on the food shows the raw number because that is what regulation requires. The tracker in your pocket, if it is a generic one, probably shows the raw number too. What you ate on the plate is neither.
The gap between raw and cooked is one of the most common quiet errors in athlete nutrition tracking. This piece walks through how it happens, why the direction of the error depends on the food, and how KEXBI handles it in the food database. The previous article in this series introduced the depth per ingredient. This one is about the first of the eight dimensions: the two macro states.
Standard athlete practice is to weigh food on a kitchen scale. You put the plate on the scale after cooking, you record what it weighs, you enter that into a tracker. The tracker looks up the food and returns macros. The problem is that the tracker's macro numbers are almost always on a raw basis (that is the USDA SR Legacy convention [1]), and the plate is cooked.
For a lean protein like chicken breast, this errs in one direction: you under-count protein because cooked meat is denser per gram. For a dry grain like rice, it errs in the other direction: you over-count carbs because cooked rice is heavier per gram than dry. Both errors compound across a day. On a cut, they close the door on hitting the day's target macros without meaning to.
The number that describes what cooking does to a food is the yield factor. It is the ratio of cooked mass to raw mass. Chicken breast has a yield factor of about 0.75: 100 g raw becomes about 75 g cooked. White rice has a yield factor of about 2.85: 100 g dry becomes about 285 g cooked. Yield factors for KEXBI are sourced from USDA Agricultural Handbook 102, updated by Bognár's yield tables [2]. Where a food has multiple standard cooking methods with different yields, each method carries its own factor.
Raw · 100 g · 120 kcal · 23 g protein
Cooked · 75 g · same macros
Cooked per 100 g · 160 kcal · 31 g protein
Dry · 100 g · 365 kcal · 80 g carbs
Cooked · 285 g · same macros
Cooked per 100 g · 128 kcal · 28 g carbs
The macros do not disappear. They redistribute. When water leaves the meat, the protein per gram of the remaining cooked meat rises. When water enters the rice, the carbs per gram of the cooked rice fall. Recording 100 g cooked rice against the dry entry in a tracker triple-counts the carbs by roughly the yield factor. Recording 100 g cooked chicken against the raw entry undercounts the protein by the same shape of error, in the other direction.
Yield is not the only variable. Cooking method changes macros too, sometimes considerably. Grilled chicken breast drops a little fat as the drippings run off. Boiled chicken keeps its lean profile intact. Pan-fried in oil picks up whatever fat lands in the pan and stays with the meat. Deep-fried is a different food altogether, carrying a breading of flour and a fat coating from the oil bath.
KEXBI stores a macrosCookedByMethod block on every protein where the delta matters, covering nine standard methods: boiled, steamed, grilled, baked, roasted, pan-fried, deep-fried, microwaved, pressure-cooked. Air-fried is added where the difference matters. Each method carries its own full macro line for the cooked food.
| Method | Kcal / 100 g cooked | Protein g | Fat g | Note |
|---|---|---|---|---|
| Boiled | 150 | 30.0 | 1.4 | Fastest gastric clearance; the standard pre-workout method |
| Steamed | 155 | 30.5 | 1.5 | Same profile as boiled with slight moisture retention |
| Grilled | 160 | 31.0 | 1.7 | Anchor-slot default; a little drip loss |
| Baked | 165 | 31.2 | 2.0 | Anchor slot; retained juice |
| Roasted | 170 | 31.0 | 2.5 | Higher-heat, moderate rendering |
| Pan-fried in oil | 220 | 30.5 | 10.0 | Oil absorbs; check pre-workout fat cap |
| Deep-fried, breaded | 300 | 27.5 | 17.0 | New food; breading adds carbs, oil bath adds fat |
The Meal Architect uses this table implicitly. A pre-workout meal at T minus 60 pulls boiled or steamed: fast gastric clearance and a low fat total. An anchor slot pulls grilled or baked: taste, and the T minus 3 hour clearance window absorbs the extra fat. A recovery meal one to two hours post-training preserves lean-protein selection: pan-fried is off the routing table when a lean protein target is tight. Method is not a garnish choice. It is a routing decision.
Regulation requires food packaging to list macros on a defined basis. For raw meat, that basis is uncooked. For dry pasta and rice, that basis is dry. For canned tuna in water, that basis is drained weight. For frozen berries, that basis is as-purchased. Four different conventions on four adjacent shelves in the same supermarket.
The consumer app that logged the food does not usually flag the convention. A generic tracker looking up "rice" often returns a mixed bag: some entries dry, some entries cooked, most contributed by users who did not write down which basis they weighed. That is how the same 100 g of cooked rice can come back as 130 kcal in one entry and 365 kcal in another, three-fold apart, both nominally correct at different conventions.
The consequence for the athlete is that the number on the app is only as reliable as the convention the user picked. If they weighed cooked and looked up a dry entry by accident, the day is over-counted by triple. If they weighed raw and looked up a cooked entry, the day is under-counted.
The KEXBI food database stores every food on a raw or dry basis, following the USDA SR Legacy convention. Every food carries a macroState field: raw, cooked, dry, ready_to_eat, as_purchased, or n_a. Every food that can be cooked carries a yieldFactor and, where relevant, a macrosCookedByMethod overlay.
When the user records a portion, the app takes the weight in the state the user weighed it (cooked, if that is where the scale sat). The engine converts under the hood to the storage basis and back, without asking the user to hold both numbers. The shopping list runs the same conversion in reverse: a meal plan calling for 200 g cooked rice generates a 70 g dry entry on the list, matching what the user needs to buy.
The raw-vs-cooked problem is a small daily error compounded into a large weekly one. Under-counted protein on a lean-mass cut, over-counted carbs on the same day, and no clear signal to the athlete that anything is off. The generic tracker returns a number. The number is on the wrong basis. The athlete records what the scale said and moves on.
The engineering answer is not to ask the user to do the conversion themselves. It is to store the food on one fixed basis, hold the yield factor and per-method transforms alongside, and materialise the correct weight at record time. That is what KEXBI does. Every food. Every method. Every meal.
The 0.75 yield factor for skinless chicken breast and the 2.85 factor for white long-grain rice are USDA Handbook 102 values (Bognár 2002). Per-method macro values in Fig 1 are illustrative and derived from USDA SR Legacy plus USDA Nutrient Retention Factors Release 6; production values in KEXBI carry the same source provenance in the dataSources field of each food document. The nine cooking methods listed are the KEXBI implementation set; air-fried is added per food where the retention profile differs meaningfully from oven-baked.