Net sales grew 9.2% in two years. Three bridges split that into volume, mix, list price, discount and cost, product by product, and the factors add up to the cent.
This one runs on a generated file, not a real extract, and every dollar below is the generator's rather than a business result. It is here to show the method: the walk order, the drills, and the reconciliation. The arithmetic is the deliverable, not the findings.
Margin moved, and everyone in the room had a theory. A bridge replaces the theories with named causes: what volume did, what the blend of products did, what list prices earned, what discounts gave back, what cost took. I ran that walk three times, on sales, on margin dollars and on the margin rate, split every factor down to the product, then rebuilt the whole thing by hand in a plain Excel workbook. The engine and the workbook agree to the cent.
Each factor answers one question: what would have happened if only this had changed? The steps form a chain, every factor is measured with everything before it already moved, so they sum exactly to the change and nothing is counted twice.
Let total units grow, everything else held at 2023: same prices, same blend. One number for the whole book, the money earned just by selling more units, before looking at which products those units were.
volume = (units25 ÷ units23 − 1) × revenue23
Same total units, but the blend shifts, still valued at 2023 prices. Products taking share count their gap to the average, so a cheap line growing drags mix down even while its own units rise.
mix = Σ (share25 − share23) × (price23 − avg price23) × units25
With units and blend in place, each product's own price moves to its 2025 level, on its 2025 units. Split into list, the shelf move, and discount, the part given back. List plus discount equals price to the cent.
price = Σ (price25 − price23) × own qty25
list + discount = price
Last, unit costs move to 2025, again on 2025 units, with a minus sign. The sales bridge stops before this bar; the margin bridge ends on it.
cost = −Σ (unit cost25 − unit cost23) × own qty25
volume = (units25 ÷ units23 − 1) × revenue23
mix = Σ (share25 − share23) × (price23 − avg price23) × units25
price = Σ (price25 − price23) × own qty25
list + discount = price, per product and in total
volume + mix + price = revenue25 − revenue23
volume and price: the same terms as the sales bridge
mix = Σ (share25 − share23) × (margin23 − avg margin23) × units25
cost = −Σ (unit cost25 − unit cost23) × own qty25
volume + mix + price + cost = GM25 − GM23
weight = product revenue ÷ book revenue, each year
mix pp = Σ (share25 − share23) × (own margin%23 − book margin%23)
price pp = Σ share25 × (cost23 ÷ price23 − cost23 ÷ price25) × 100
cost pp = Σ share25 × (cost23 − cost25) ÷ price25 × 100
mix + price + cost = rate25 − rate23 (no volume bar)
The suffixes 23 and 25 mean the 2023 and the 2025 value. "Share" is a product's share of total units, or of revenue on the rate bridge. "Own qty25" is that product's own 2025 units; "units25" is the whole book's. Every line was rebuilt in Excel from the raw rows and matched to the engine to the cent.
One decomposition, two questions. On sales: was the growth earned by price or bought by volume? On margin: how much of the price gain survived the cost inflation that came with it?
A factor total is where the argument starts, not where it ends. Each bar splits into the products that carry it, and the two big bars turn out to have opposite shapes.
The margin percentage rose 0.45 points. The product that did most to lift it is the same product that cost the most money. Both readings are correct, and only the dollar reading tells you what the business earned.
Stated here rather than left to be found.
In this file unit cost tracks unit price at a correlation of 0.87 to 0.92 within each product, which is the signature of cost being derived from price rather than measured. So the price and cost bars cancel in the rate bridge, and no margin-rate movement here can be attributed to pricing. On a real file that question is open, and it belongs to the pricing study.
Product by year is the headline. Product by channel, or by channel and country, gives a different mix number, and all of them are honest. The study states which cut it used and shows the others. It does not pretend there is one true mix number.
It says what moved, exactly and to the cent. It does not say why, and it cannot say what would have happened otherwise. The why is the pricing and promotion studies, which is the point of running them together.
The naive per-product mix split sums perfectly and misstates half the signs. Nothing in the arithmetic warns you, because the errors cancel by construction. The lesson generalises: a decomposition that adds up has proved its consistency, and a split that adds up has only proved that it adds up. It can still put the wrong sign on half the products.
The biggest contributor to the rate improvement and the biggest destroyer of revenue were the same product. Any KPI that averages a ratio will sometimes reward shrinking the denominator, so a rate target without a dollar floor is an instruction to kill cheap volume, whether anyone meant it or not.
Mix at product level and mix at product-by-channel level are different numbers, and both are correct. Two analysts can fight for a week over a disagreement that is entirely a grain choice neither wrote down. Printing the grain on the page costs one line and ends the fight before it starts.
The engine's tests all passed while the per-product signs were wrong, because the tests checked the totals. Rebuilding the bridge in a spreadsheet, where every intermediate number is visible, is slower than a test and catches a different class of error. The workbook is not an extra. It is how the numbers get checked.
Start with the question, not a proposal. If your export cannot support the study you had in mind, that is worth knowing in twenty minutes.