Method · 5 min read

How to build a revenue bridge that reconciles

A revenue bridge is only worth showing if the bars add up to the gap. Here is how to get there from a plain sales export, and where most attempts quietly go wrong.

What a revenue bridge is

A revenue bridge (or sales bridge) walks from the revenue of a baseline period to the revenue of the current period, one explanation at a time. It is drawn as a waterfall: two full bars for the two periods, and floating bars in between for each effect that pushed revenue up or down.

The bars are not a ranking, and not a decomposition of the total. They are a decomposition of the change. That distinction matters when you frame the axis: bar heights compare movements, not the size of the business.

Revenue bridge · 2025-H1 → 2025-H2

€325.58k €340.59k +€15.01k
✓ Reconciled to the cent
€330.00k€340.00k€350.00k€360.00kAxis starts at €322.93k, not zero: heights compare changes, not totals.€325.58k2025-H1+€26.13kGross priceeffect−€17.26kDiscount effect+€9.82kVolume effect+€0.62kCategory mix+€4.10kWithin-categorymix+€9.66kNew products−€18.07kDiscontinued€340.59k2025-H2NET +€15.01kFAVORABLEUNFAVORABLEREFERENCE LEVELOPENING LEVEL
The sample data set, read with everything its file allows: gross revenue splits price into list price and discount, and product categories split the mix in two. Nine bars, the same total as the five-effect version.

The four columns you need

Four columns are enough, and any export from a decent system already has them.

Column What it holds What goes wrong without it
Period A label: 2026-05, FY25, Q3. Never a guessed date. Nothing to compare.
Product A stable identifier, one row per product and period. Price and mix collapse into a single average.
Quantity Units sold. Negative values are returns, and are kept. No volume effect, and no unit price.
Net revenue The amount actually invoiced for those units. No bridge at all.

Two rules about the file itself cause more trouble than the arithmetic ever does. First, one row per product and period: if the same product appears twice in the same period, the rows have to be summed before anything is computed, or the average price is wrong. Second, the numbers must be read in the file's own convention, semicolons and decimal commas included, because a European export read as an American one is off by a factor of a thousand and still looks plausible.

Building it, step by step

  1. Classify every product. Sold in both periods: continuing. Only in the current one: new. Only in the baseline: discontinued. This step decides everything that follows, and it is the step spreadsheets skip.
  2. Price, on continuing products only. For each one, the change in average price times the quantity sold in the current period.
  3. Volume, on continuing products. The change in total units, valued at the baseline average price across those products.
  4. Mix, on continuing products. What is left of the quantity movement once uniform growth is removed, valued at the distance between each product's baseline price and the baseline average.
  5. New and discontinued. The current revenue of new products, and minus the baseline revenue of discontinued ones.
  6. Test it. Add the five effects. The result must equal the observed change, to the cent. If it does not, do not present the chart.

Round nothing along the way. Rounding belongs to the last step, the display. A bridge that only reconciles at two decimals is a bridge that does not reconcile.

Gross price and discount

If your export carries gross revenue as well as net, the price effect splits in two: a gross price effect, which is what your list prices did, and a discount effect, which is what your commercial policy did. The two add up exactly to the price effect, so nothing about the total changes.

This is usually the most uncomfortable pair of bars in the chart. On the sample data above, list prices added 26,129 while discounting gave back 17,256: a price increase that was, in large part, funded away. A single price bar of 8,873 would have hidden that entirely.

Build yours

Skip the template, keep the data

Drop your export, map four columns, read the bridge. Drill-down from total to group to product, top movers, Excel and image exports. It all runs inside your browser: nothing is uploaded, which you can check in the Network panel while you work.

Calculate PVM bridge

Reading it to a committee

The bridge earns its keep in the room, not in the file. Four habits make the difference.

And when the bars do not add up, say that too. A named gap is a data problem someone can fix this week. A silent one becomes a number nobody trusts for a year.