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.
Sales and gross margin increased. I used three bridges to measure the contributions of volume, product mix, realised price and cost to sales, gross margin dollars and the margin rate. Each effect is broken down by product. A separate Excel calculation matches the Python results to the cent.
Each step answers one question: what would have happened if only this had changed? Each factor is measured with the previous ones already applied, so they add up exactly to the change and nothing is counted twice.
Apply total unit growth at 2023 prices and product mix. This measures the sales increase from selling more units before accounting for changes in which products sold.
volume = (units25 ÷ units23 − 1) × revenue23
Hold total units fixed and change each product's share, valued at 2023 prices. A shift towards lower-priced products reduces sales. A shift towards higher-priced products increases sales.
mix = Σ (share25 − share23) × (price23 − avg price23) × units25
Multiply each product's change in average net price by its 2025 units. Split the effect into list price and discount. These averages also change with country and channel mix, so they do not establish a local price increase.
price = Σ (price25 − price23) × own qty25
list + discount = price
Last, unit costs move to 2025, 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
price: the same term as the sales bridge
volume = (units25 ÷ units23 − 1) × GM23, on base gross margin
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 portfolio's. Every line was rebuilt in Excel from the raw rows and matched to the engine to the cent.
The sales bridge measures the contributions of volume, product mix and realised price. The gross margin bridge adds the effect of changing unit costs.
The product breakdown identifies which products contributed most to each effect and where to investigate first.
The portfolio margin rate rose 0.45 percentage points. RoastTrail's falling share contributed to that increase, even as its own revenue and gross margin declined.
The limits.
The positive realised-price contribution of +3.55pp was almost entirely offset by the unit-cost contribution of -3.54pp. These are accounting effects at the stated aggregation level, not estimates of a causal pricing response.
The headline uses annual product averages. Its price effect is $300k, compared with $264k at product and country level and $309k at product and channel level. The difference reflects the level of detail used. Local pricing decisions require comparisons within the same market and channel.
The bridge separates the accounting effects but cannot establish why demand changed or what would have happened without a price change. It also cannot identify customers switching channels. Possible explanations require further evidence.
Start with the question. If your export cannot support the study you have in mind, you will know on the first call, and in writing within two days.