← Back to the Knowledge Kitchen DE
Post · Power BI visual · Controlling

Sankey meets the IBCS waterfall

Why the pair only gets really good when it is dynamic. The waterfall explains how much: steps, signs, variance, anchors. The Sankey explains where to: flow, shares, structure. In the P&L visual both sit on the same data binding, and one click in the toolbar switches the story.

At month-end close there are almost always two questions. First: how far are we above or below plan, and where does it come from? One slide later: and where does the money actually go? The first is what the waterfall is for; for the second I long needed a side calculation in Excel. Version 1.6 gave the P&L visual a Sankey, version 1.7 the switches that bring both views together. Played through with the demo P&L of the Daten-WG brewery (fictitious figures, January to September 2026). The screenshots show the German demo data.

1 binding
two stories. Waterfall and Sankey read the same account dimension, the same measures, the same sign logic. No second visual, no second layout, nothing to reconcile between the two.

Up front: the export limit

As long as the visual is not certified through AppSource, the Power BI service leaves it out of PDF and PowerPoint exports and subscription e-mails. For the board pack you need a second route today: PDF export from Power BI Desktop, or a screenshot.

How much: the waterfall

Income statement of the Daten-WG brewery as a table with variance waterfall (template T04B): columns PL and AC, next to them an integrated ΔPL waterfall and ΔPL percentage pins. Draught beer to restaurants plus 596, alcohol-free plus 273, bottled beer to retail minus 158, cost of materials plus 298, energy minus 112, operating result 451 TEUR above plan.
Table with variance waterfall (template T04B): AC against plan with ΔPL waterfall and ΔPL% pins, Jan–Sep 2026 in TEUR (labelled kEUR on the unit switch — the same unit). Above it the toolbar with the five views.

After nine months the brewery's operating result stands at 2,047 TEUR, 451 above plan (+28%). The table with variance waterfall (template T04B) shows how it gets there: draught beer to restaurants +596 (the hot summer, comment ①), alcohol-free +273, against that bottled beer to retail −158 and merchandise −20. On the cost side, materials eat 298 of it, mostly malt and packaging. Energy is 112 below plan; the gas contract was renegotiated as of January (②; the 15% in the comment is against prior year). Every step has a sign, every subtotal anchors, and the scale is the same for all rows.

Reading guide

AC = actual, PL = plan, PY = prior year, FC = forecast. Teal means favourable for the result, red unfavourable: that is why lower energy cost (−112) is teal and more malt (+164) is red. pp are percentage points (gross margin −0.7 pp). _September or _Sep means cumulative to September (YTD). All amounts in TEUR.

Where to: the Sankey

The same income statement as a Sankey: four revenue channels flow in grey into revenue of 18,746 TEUR, the profit strand runs in teal via gross profit, EBITDA and operating result to net income of 1,246 TEUR, the cost blocks branch off in red to the lower right.
Sankey view: the same binding, one click in the toolbar. Band and bar height proportional to actuals, in brackets the share of revenue. Teal and red are family colours here (profit strand, costs), not a judgement, even though the legend still says “favourable/unfavourable Δ”.

Same numbers, a different question. Of 18,746 TEUR revenue, 43% comes from draught beer and 41% from bottled beer. Two thirds remain as gross profit, personnel alone takes 28% of revenue, 10.9% remains as operating result. The financial result is an expense here (−268 interest) and flows out in the Sankey; 6.6% remains as net income. You do not see that in the variance waterfall, because it shows variances, not shares. A structure waterfall on actuals or a “% of revenue” column shows shares too; the Sankey shows them as a flow.

About the colours, honestly: without ⚡, teal and red in the Sankey are family colours, profit strand and costs, not a judgement. Red on personnel (+0.8% against plan) means “cost block”, not “problem”. The legend in the picture still says “favourable/unfavourable Δ” here; switching it per view is on the backlog. With ⚡ the colours mean favourable and unfavourable, with a mark they show the marked part.

A click on a node opens the detail tile of that row with monthly columns and scenarios (docs).

When the Sankey does not fit. In a loss year with negative flows, because a Sankey knows no signs. With very many small accounts. For pure variance analysis. On small tiles and in print. And one limit of the metaphor: an accrual-based P&L is not a cash flow, depreciation flows nowhere. “Where does the money go” is meant figuratively.

Only the dynamics make it valuable

Two static pictures would be nice, nothing more. It gets interesting with three switches from version 1.7.

⚡ Only exceptions. The threshold sits in the toolbar: |Δ%| ≥ 5% against plan. The Sankey then keeps colour only on the streams that cross the threshold, now in the colour of their variance. For the brewery that is 7 of 16 accounts (draught beer, alcohol-free and energy favourable, merchandise, malt, packaging and income taxes unfavourable) plus four totals; the rest turns grey.

Sankey with the Only exceptions switch on, threshold 5 percent against plan: draught beer, alcohol-free and energy in teal, merchandise, malt, packaging and income taxes in red, plus the totals cost of materials, EBITDA, operating result and net income in colour, all other streams grey. Bottled beer to retail stays grey.
⚡ 5% against PL in the Sankey: 7 of 16 accounts plus the totals cost of materials, EBITDA, operating result and net income have colour. Bottled beer to retail is −2.0%, below the threshold, and stays grey as a single account although it is the largest negative revenue step in absolute terms.

In the variance waterfall, “hide” folds the quiet steps of each section together: 8 of the 16 account steps merge into “other” or into their total, and the cascade stays closed.

Variance waterfall with Only exceptions in hide mode: hops and yeast are folded into other (2), personnel, logistics and marketing into other (3) at plus 51, depreciation and interest appear only as their totals. The footer reports 8 steps below the threshold.
⚡ hide in the variance waterfall: “other (2)” in materials, “other (3)” in operating expenses, depreciation and interest only as totals. The footer keeps count, also in PDF export from Desktop and in print.

A caveat: “other” nets. In “other (3)”, 37 TEUR saved on marketing offset 88 TEUR of extra cost in personnel and logistics, leaving an inconspicuous +51. So I set both thresholds, say 5% or 100 TEUR (then bottled beer at −158 has colour too), and check grouped steps in the tooltip. And the threshold sorts, it does not judge: income taxes (+33%) mechanically follow the higher result, and malt (+7%) is hardly “unfavourable” without volume adjustment when more beer was sold.

Cross-highlight. When a reader marks part of the data in another visual, the Sankey shows the marked part within the grey whole. The demo has no channel column, so here it is the month: a click on “July” in a column chart.

Sankey with a mark from another visual: the full year in grey, July as coloured inner bands. Revenue 2,820 of 18,746, EBITDA 819 of 3,174, operating result 691 of 2,047, net income 463 of 1,246 TEUR.
Mark “July”: at every node “marked of total”, colour shows the marked part. All other views behave as filtered; only the Sankey shows the part within the whole.

July brings 15% of revenue (2,820 of 18,746 TEUR) but 34% of the operating result (691 of 2,047). My reading: the fixed-cost leverage of a strong summer month. The picture shows the proportion, not the cause. With a channel or region column the same works: click “Export”, and the Sankey shows the export share at every level.

View, Δ reference, ⚡ threshold, root and fold state are saved by Power BI bookmarks. One bookmark “Exceptions against plan” and one “Structure” cover the whole closing meeting.

Stocks and flows: the cash flow

Cash flow bridge (template T05B) for September and cumulative to September: opening cash 600, operating cash flow 1,373, investing cash flow minus 715, financing cash flow minus 760, closing cash 498 TEUR against 440 in the prior year. Stocks anchor on the zero line, flows float.
Cash flow bridge (template T05B): opening balance → flows → closing balance as PY and AC cascades, month and cumulative to September, in TEUR (labelled kEUR in the picture — the same unit). A separate demo data set, not reconciled with the P&L above.

Since 1.7 the visual knows stocks. A stock row is not summed over the months but shown as the balance at the reporting date. In the cash flow bridge (template T05B) the opening and closing balances anchor on the zero line and the flows float in between: 600 TEUR at the start of the year, +1,373 from operations, −715 for investments, −760 for loan repayment and dividend, 498 at the end of September (prior year 440).

Put honestly: the cash flow demo is a separate data set and not reconciled with the P&L above. Net income there is 923 instead of 1,246, depreciation 495 instead of 1,127. In a real model both come from the same accounts, and that is exactly what to check when building it. The Sankey can draw the same flow with stocks as grey anchors, but for cash it was hard to read. That is why there is no Sankey picture here.

Why this is a real alternative in controlling

From the point of view of someone presenting the month-end close:

BeforeNow
Waterfall in the report, Sankey in a second visual or toolOne visual, switched in the toolbar
Important variances marked by conditional formatting per visual or by hand⚡ with a threshold across all views, saved as a bookmark
Segment question: new page or filter, the big picture is goneCross-highlight: the part within the grey whole
Cash flow bridge rebuilt in ExcelCash flow bridge (T05B) from the account dimension, stocks anchor

What to know beforehand

The Sankey deliberately sits outside the IBCS notation; the visual's footer says so in this view. For plan-actual comparisons and variance analysis, table and waterfall remain the tools; if you only want to allow IBCS forms, switch the Sankey off in the format pane. The waterfall is IBCS-inspired, not certified. For export, see above. Accessibility: in high contrast the Sankey uses patterns (profit filled, costs outlined or hatched, inflows dashed), and ⚡ sets things apart with dashes instead of grey. Red/teal was chosen for red-green colour blindness; in greyscale print the distinction gets lost in pale bands.

If you want to try it: the quick start gets you to a first P&L in two minutes, and the documentation of the views describes the Sankey in detail.

Version 1.7.1.0 · .pbiviz

Switch it yourself

The quick start links the current .pbiviz and shows the first steps. The brewery demo data is in the repository.

All figures are real renderings of the visual 1.7.0.0 with the demo data of the fictitious Daten-WG brewery, captured in the visual's test harness. Questions and counterexamples: Michael Tenner · michael.tenner84@gmail.com · Issues: github.com/losveratos/powerbi-kitchen-/issues
Source code, changelog and demo data: pnlByDatenWG in the repository.
Waterfall and tables are IBCS-inspired (notation based on the IBCS® Standards by the IBCS Association, CC BY-SA 4.0, ibcs.com); the Sankey is a deliberate addition outside the IBCS notation. IBCS® is a trademark of the IBCS Association. This visual is not certified by or affiliated with the IBCS Association.