Four countries. Four ERPs. One number.
A packaging group operating in Croatia, Slovenia, Bosnia and Herzegovina and Serbia, and the single reporting layer that lets a group figure mean the same thing in all of them.
Consolidation is not a reporting problem. It is an agreement about what words mean.
First commit December 2017, most recent this week. Four ERP systems, four countries, five legal entities.
The situation
Every country was right. That was the problem.
Bomark grew across four countries, and each business picked the ERP that suited it, years before anyone needed a consolidated figure. None of those choices was a mistake, and none of them was going to be undone.
What was missing was agreement. Four systems held four versions of a customer, an item and a sale, and nothing said which version the group should believe.
So a group number was a person, a spreadsheet and a week, produced once a month and out of date the moment it was finished.
The work was never really about moving data. It was about deciding what the words mean, writing that decision down as a mapping, and then defending it every time a source system changed underneath.
Four countries, four ERPs, one number.
Bomark run packaging businesses across Croatia, Slovenia, Bosnia and Herzegovina and Serbia. Five legal entities, four different ERP systems, and a group that needed one set of figures out of all of it. This is what that took, and what it still costs to keep honest.
Four ERP systems into one Azure SQL database, with Power BI Embedded over it, a customer-facing trade portal, and an assistant layer reading the same services.
Four ERPs that had never been asked to agree.
Each country had chosen its own ERP for its own good reasons, years before anyone wanted a group figure. Different field names, different product codes, different ideas of what a customer record is. Group reporting meant somebody reconciling four exports by hand.
The mapping is the product, not the pipeline.
All four systems sync one-way into a single Azure SQL database. The engineering that matters is not the transport, it is deciding what a customer, an item and a sale mean when four systems disagree, and then holding that decision still while the source systems keep changing.
Two countries read live. One syncs daily. We show that.
Slovenia and Serbia are read live from their own ERP, so they are as fresh as the source. Bosnia syncs once a day. A platform that hid that difference would be easier to sell and worse to rely on, so every answer carries the time it was true as of.
Their customers read the same database their staff do.
A packaging customer signs in and sees their own contract pricing, their own stock visibility and their own documents, enforced in the data layer rather than in the screen. It is the same database behind the group reports, so a price a customer sees and a price finance reports are the same number.
Nine years in, we added a way to ask instead of click.
Since July 2026 staff can ask the same consolidated database in plain words, through the assistants they already use. Around 34 read-only tools, Microsoft sign-in, scoped so each person sees only the companies they belong to, and every call logged against the real user. It reads the same services the dashboards do, so the assistant and the report cannot disagree.
We committed the first code in December 2017.
This platform has been in continuous development for coming up on nine years, across 7,200 commits, and it received code this week. Countries have been added to it, ERPs behind it have changed, and it has never been rebuilt.
What this case does not claim
No percentage, because none has been published.
The checkable facts here are structural: how many entities, how many ERP systems, which sources are live and which are daily, and when the first code was written. The figures inside the drawings illustrate the mechanic and are not this customer's data. For the operator's own account of what changed, ask during a scoping call.