The problem
The sustainability team owned the emissions number for a large multi-site business — and lived inside a monthly spreadsheet cycle to produce it. Data landed late, reconciliation was manual, and by the time the number was ready, the month it described was already history. Anyone who wanted to ask a real question — 'what changed at Site 4 last quarter?' — had to wait for the next cycle.
What we designed
The dashboard leads with the answers the team was already being asked: top emission sources, scope breakdown, and month-over-month deltas. Below that, a monthly stacked contribution chart makes trends visible at a glance. Per-site and date-range filters let the team pivot the same live data instead of waiting on a fresh export.
Design-wise, the goal was calm density — a lot of numbers on screen, nothing shouting. Deltas are colour-coded but small; the chart carries the load, and the tables are there for anyone who wants to drill in.
What we built
- Top sources view with delta indicators against the prior period.
- Scope 1 / Scope 2 breakdown with monthly stacked contribution chart.
- Top contributors table with per-site drilldown.
- Per-site and date-range filters wired to live data, not monthly exports.
- Shared design system reused by the team's Data Hub and Targets modules.
Stack and infrastructure
React and Recharts on the client for the analytics surfaces, Postgres as the warehouse for cleaned emissions data, and a Python ETL pipeline handling the messy reality of pulling from source systems that never quite agree with each other. Everything reproducible and versioned.
Outcome
Reporting turnaround dropped from weeks to minutes. Anyone on the sustainability team can answer a question live, in a meeting, without emailing the data lead. The design system we built for the dashboard was reused across the Data Hub and Targets modules — so the whole internal suite feels like one product, not three.
