← Back to Case Studies
GovTech / Performance management

Adaa: a KPI platform that has stayed in production for six years

Dubai Land Department, Dubai Corporation for Ambulance Services, Awqaf Dubai·2020 to present
AngularTypeScriptRxJS.NETC#ASP.NET Core Web APIEntity Framework CoreSQL ServerT-SQLHangfireIISAzure DevOps

The Problem

A government entity needs one objective set at the top of the organization to mean something specific for one employee at the bottom, without anyone seeing data outside their own part of the hierarchy.

Constraints

  • Arabic and English, right-to-left and left-to-right, across every module rather than as a translation layer added at the end.
  • Deployment onto government-managed IIS infrastructure, with SSL binding and DNS coordinated with each client's own infrastructure team.
  • Built by one developer, so the design had to be something a single person could hold in their head and still extend years later.
  • Three organizations with different structures on the same codebase, so hierarchy depth and shape had to be data, not assumptions baked into the schema.
  • Continuous production from the first release onward: every schema change had to land under a live system with real planning cycles running on it.

My Role

Sole developer from the empty repository in 2020, and still the owner today. I designed the SQL Server schema, built the .NET service layer and the Angular front end, ran the IIS deployments, and have handled every release and hotfix since. The platform moved with me from DataCell to Digitme.

What I built

An Angular front end over an ASP.NET Core Web API, with Entity Framework Core and tuned T-SQL against SQL Server, deployed to IIS through Azure DevOps pipelines. The centre of the system is the hierarchy: organization, org unit, team, and individual employee, with KPIs cascading down it and every query scoped to the caller's position in it. Scope can be delegated from one user to another. Role-based access control sits above that scoping as a separate concern, so answering whether a request is allowed means resolving the action and the data scope together. Background pipelines run on Hangfire, and the dashboard reads go through stored procedures tuned for the purpose.

Decisions and trade-offs

Scope and permission kept as two separate mechanisms

Data scoping answers whose records a request may touch. Role-based access control answers what the request may do. They are resolved separately and combined at the point of authorization.

Folding them into one concept is simpler on day one and unworkable by the time delegation arrives, because a delegated user needs someone else's scope with their own permissions. Keeping them apart made delegation an extension of an existing idea rather than a rewrite.

Dashboard reads pushed into tuned stored procedures

The heavy aggregate reads behind the dashboards are stored procedures written and tuned for those shapes, rather than ORM-generated queries.

Entity Framework Core is the right tool for the transactional side and the wrong one for aggregates that walk the whole hierarchy. The trade-off is real: query logic now lives in two places, and a schema change has to be applied to both.

Recalculation moved out of the request and onto Hangfire

Work that fans out across the hierarchy runs as background jobs rather than inside the request that triggered it.

A single edit near the top of the hierarchy can touch a large subtree. Doing that inline makes one user's save everyone else's timeout. The cost is that the system is eventually consistent in places, and the interface has to be honest about that rather than pretend a figure is already final.

Hierarchy shape treated as data, not schema

The depth and shape of an organization's structure is configuration held in the data, so a second and third entity could be onboarded without forking the codebase.

The alternative, modelling one client's org chart directly, would have been faster to ship in 2020 and would have cost a fork per entity afterwards. Three entities now run on one codebase.

In the build

  • A hierarchical KPI cascade that carries objectives from organization level down to the individual employee.
  • Data scoping at four levels, organization, org unit, team, and employee, with delegation between users.
  • Role-based access control layered over the scoping rather than merged into it.
  • Background job pipelines on Hangfire for work that should not happen inside a request.
  • SQL Server query and stored procedure tuning for the dashboard-heavy screens.
  • Bilingual Arabic and English interfaces, RTL and LTR, in every module.

Outcome

  • Shipped to production in 2020 and in continuous production ever since, through six years of releases and hotfixes.
  • Running at three government entities on one codebase: Dubai Land Department, Dubai Corporation for Ambulance Services, and Awqaf Dubai.
  • Still owned by me across a change of employer, from DataCell to Digitme.
  • The model carried into Planoris, the successor platform, bringing the total to five government entities across two platforms.
  • The team around it grew from two engineers to seven. I onboarded the developers who joined, on a codebase I had written solo.

© 2026 Mohamad Merhi