Problem
Four thousand people landed on the pricing page. A funnel says how many reached checkout. It does not say that eight hundred went to the docs first, or that the ones who did converted at three times the rate.
Solution
Draw the flow. Nodes are states, links are movements between them, and link width encodes volume. The eye follows the thick bands and the branching is visible rather than inferred.
The pattern’s ancestry is worth knowing because it explains the encoding. Sankey diagrams come from engineering, where they were used to show energy and material flows and where conservation held: what enters a node leaves it. That conservation is what makes width readable as quantity, and it is also what most product analytics violate, because people leave, sessions expire, and requests time out. A flow diagram whose bands do not conserve needs an explicit “exit” or “drop” destination, or the widths quietly stop adding up.
Where a funnel says how many survived each step, a Sankey says which route they took, and that difference matters exactly when the route varies. The interesting output is usually a path nobody designed: a loop back to search, a detour through help, a retry that succeeds.
Layout is the hard engineering problem. Node ordering within a column determines how many links cross, and crossings are what turn the diagram from legible to decorative. Good implementations minimise crossings and keep the ordering stable between renders, because a diagram that reshuffles on refresh cannot be learned.
Use when
The path branches, the branching is the question, and there are few enough distinct routes to draw. Attribution, user journeys, request routing, cost allocation, energy and material flow.
Don’t use when
The sequence is fixed, where a funnel is clearer and cheaper. Or when the paths are long-tailed: real user journeys have thousands of distinct routes, and a diagram of the top eight plus “other” is either a lie by omission or an unreadable hairball.
Trade-offs
Sankeys are the most impressive-looking chart in this collection and one of the least often necessary, which is a dangerous combination in a stakeholder review. Reading exact values off a band is near-impossible, so they answer “roughly where” and never “how many”. They need space, and shrunk into a dashboard panel they become texture. Crossing links degrade legibility fast. And truncating the long tail into “other” often hides precisely the surprising route the diagram was built to find.
Checklist
- Do the flows conserve, and if not, is there an explicit exit node?
- How many distinct paths exist, and what fraction is shown before “other”?
- Does “other” carry a count, so the viewer can size what is hidden?
- Are crossings minimised, and is node order stable between refreshes?
- Can the viewer get an exact number for a band?
- Is the direction of flow unambiguous?
- Does colour encode anything, or is it decoration?
- Is there a minimum band width below which a path is dropped, and is that stated?
- Would a funnel or a table answer this question with less machinery?
- Does the diagram still work at the panel size it will actually render at?
Compare
Amplitude and Mixpanel offer path analysis where the Sankey is generated from event streams and each node is clickable into the underlying users, which turns a picture into a starting point. Google Analytics has shipped several versions of a flow report over the years and each has struggled with the same long-tail problem, which is a useful demonstration that this is inherent rather than an implementation failure. Grafana has no core Sankey panel and relies on community plugins, so it appears on dashboards rarely and usually as a one-off. Datadog applies the encoding to service dependencies and request routing rather than to people, where conservation actually holds better and the node set is bounded.
Related
Funnel is the simpler pattern for a fixed sequence and usually the right answer. Service map shows the same relationships as topology rather than as volume. Stacked composition is the static part-to-whole version. Drill-down is what a node click owes the viewer. Cohort grid is where you go when the question turns from route to time.