Migrating financial reports: the new report first shows the same number
Case studySenior developer for your team
For a fintech company we are rebuilding financial reports as their own screens. We work in their repo with their developers. The rule: the new number must match the old one first.
Czech fintechClient
How it started: the reports were only embedded from an older tool · Duration: since July 2026
Overview
A Czech fintech company does financial reporting for a group of companies. The P&L, balance sheet, cash flow and management overview were embedded from an older reporting tool. The company wanted them as its own screens in its own app.
We work in their repository and in their process. Their team owns the data model. We build the screens on top of it.
The challenge
A finance person does not trust a new report that shows a different number than the old one. Not even when the new number is "more correct". To them it is just one more number that needs explaining.
Worse is a number that is wrong and nobody sees it. That is exactly what happened.
The moment: the report was wrong and did not crash
For the large companies in the group, the report showed wrong totals. No error, no warning. The data API has a row limit, and for the large companies it silently cut the data off.
Our first fix made loading faster. It did not solve the problem. The client's developer caught it, not us.
We fixed it another way. The report asks month by month and joins the results. The yearly view matches the old report. Since then we check totals against the source for every report.
The rules that came out of it
- The new report first calculates like the old one. Even the parts we would calculate differently today. Improvements come only once the numbers match.
- Shared metrics belong in the data model, not on the screen. Otherwise each screen calculates them its own way, and the finance person sees three numbers. Where a deadline made us calculate on the screen, we logged it as debt with an owner.
- A comment stays with the number it belongs to. The controller writes why revenue dropped. Then accounting reposts, and the number changes. So a commented report freezes the values together with the comment.
- Each company shows which day its data is from. One company closed its books yesterday, another last week. The consolidated report must not hide that.
What still does not match
For companies with intercompany transactions there is still a small gap against the old report. The cause is in the data model, and the client's data team is working on it. Until it matches, we do not consider the report for these companies done.
What changed
The P&L, balance sheet and cash flow run on the new data model without the old embedded reports. The company has its reports in its own app, in its own code, with its own team that understands them.
For a CTO one thing matters: the external developer worked in their repo and through their review. No black box the team would have to take over later.
What we delivered
- Financial reports in their own app
- Total checks against the source
- Comments with frozen numbers
- Data date for each company


