Interactive demo
A multi-branch distributor buys another branch, and the new entity arrives with its own aging, its own vendor habits, and its own close. Company totals absorb the damage and look fine. This demo is the control tower a controller would want instead: working capital, receivables and payables aging, three-way match exceptions, and close status, per entity, with the acquired branch converging to company norms in plain sight. Built on the KPI definitions a controller would recognize: DSO and DPO on average balances, point-in-time aging, and a close that ends at sign-off, not at a date.
Prefer the written version? Read the close and AR package write-up on the blog.
Synthetic data. Seeded generator, no real company.
Company totals for the latest month. They look fine, and that is the problem: totals average away the one entity that needs attention. Filter to the acquired branch to see what the roll-up hides.
A seeded numpy script generates line-level open AR and AP items for each branch and month, then computes every aggregate from those items: aging buckets from days past due, DSO and DPO from average balances over the period, match outcomes from a tolerance-based three-way match. The acquired branch is engineered to onboard with weak receivables discipline and off-PO spend, then converge as standardization lands, because that trajectory is what a finance-integration dashboard exists to make visible. The result is exported to a static JSON that this page reads at build time and renders with the hand-rolled, dependency-free SVG charts this site uses everywhere, so the charts are in the HTML before any script runs. In a real deployment the same shapes come from the ERP and subledger extracts, computed upstream on a schedule, not in the browser or in the BI tool. Everything here is synthetic and models no real company, vendor, or customer.
View the raw data that drives this page.
If month end is a spreadsheet and an email thread, or an acquisition just handed you a second set of books, this is exactly the kind of problem I like to take end to end.