The annual allocation argument is not an arithmetic problem, it is a participation problem. This guide covers the model build and, more importantly, the sequence that gets clinical leadership to sign up to the drivers before anything is engineered.
If you have to build it
Lakehouse and medallion design in OneLake, ingestion from EHR and finance sources, allocation logic, semantic model design with row-level security, and Direct Lake configuration for reporting without a refresh window.
Why it matters
The problem this solves
Shared costs — theatres, imaging, pathology, overhead — have to be attributed somehow, and every method disadvantages somebody. There is no neutral answer, which is precisely why the model has to be agreed rather than imposed.
A defensible allocation that clinical leadership signed up to is worth more than a technically superior one they dispute every year.
Before you start
Prerequisites
Check these before beginning. Most stalled implementations stall on one of them.
Licensing
A Fabric capacity. F64 or above if you intend to use Copilot experiences against the semantic model.
Roles
Fabric administrator, a data engineer, and a finance owner who can approve the allocation basis.
Governance
A decision about who owns metric definitions. Without a named owner this becomes a permanent negotiation.
Agreement
Allocation drivers agreed with clinical and finance leadership jointly, in writing, before engineering starts.
How it works
The concepts worth understanding first
Configuration is straightforward once these are clear. Skipping them is why most first attempts produce something that works and cannot be maintained.
OneLake removes the extract problem
Clinical volume, cost and payer data land in one logical lake in open table format, and every workload reads the same copy. The value is not speed; it is that a published figure can be traced back to source rather than to an analyst's monthly process.
Medallion layering keeps the allocation auditable
Bronze holds source data as received. Silver holds cleaned, conformed entities. Gold holds the allocated, business-ready model. Keeping the allocation logic in a defined layer means it can be inspected and changed without touching ingestion.
Direct Lake removes the refresh window
Power BI reads Delta tables in OneLake directly, without an import step. For reporting that clinical directors check weekly, removing the refresh lag matters more than query speed.
Configuration
Step by step
Settings shown are the ones that matter, not every field on the form. Values are starting points to validate against your own environment.
01
Agree the drivers before you build anything
Run a workshop with clinical and finance leadership together. Work through each shared cost pool and agree the driver — theatre minutes, imaging studies, bed days, weighted activity.
Write down the reasoning, not just the driver. When somebody questions it in eighteen months, the reasoning is what settles it.
Output
A signed allocation schedule listing every cost pool and its driver
Owner
A named individual accountable for the definitions
Review cycle
Annual, with a defined change process
02
Ingest into bronze without transforming
Land EHR extracts, general ledger detail, payer contract data and cost centre mappings exactly as received. Use shortcuts to reference data already in a lake rather than copying it.
Resist the temptation to clean during ingestion. Bronze exists so you can prove what the source said.
EHR
Encounter, procedure and diagnosis extracts, incremental where possible
Finance
GL detail at cost centre and account, plus the cost centre hierarchy
Payer
Contract terms and expected reimbursement
Method
Shortcuts where the source is already in a lake; pipelines otherwise
03
Conform entities in silver
This is where most of the effort goes. Encounter identifiers, provider identifiers, cost centre codes and service-line mappings all need reconciling across sources that were never designed to agree.
Build a service-line dimension explicitly rather than deriving it in report logic. It is the axis everything reports on and it must be stable.
Grain
One row per encounter for the fact table
Dimensions
Service line, provider, facility, payer, period
Mapping
Cost centre to service line held as a maintained table, not hard-coded
04
Apply allocation in gold
Direct costs attach to the encounter. Shared pools allocate by the agreed driver. Keep each allocation step as a separate, named transformation so the chain is inspectable.
Produce an allocation reconciliation output: total cost in, total allocated out, and the residual. If the residual is not zero, something is wrong and you want to know before anyone sees a margin figure.
05
Build the semantic model with security designed in
Use Direct Lake on OneLake for compatibility with OneLake security and better modelling features. Name tables and columns in business terms — this matters more now that Copilot may reason over the model.
Apply row-level security so a service line sees its own performance, and design it before publishing rather than after the registrar or compliance officer raises it.
Storage mode
Direct Lake on OneLake
Naming
Business-friendly; the model is now an interface for AI as well as people
Relationships
Defined explicitly — ambiguous models produce confidently wrong Copilot answers
Row-level security
By service line, sourced from a governed entitlement table
Verify it worked
Confirm the allocation reconciliation residual is zero for a closed period.
Reproduce a service line's margin for a period finance has already signed off.
Trace one published figure back through gold, silver and bronze to the source record.
Confirm a service-line user sees only their own rows, and an executive sees everything.
Check capacity consumption during a full refresh cycle and confirm it sits inside your planned envelope.
Best practice
What we do on every engagement of this type
Agree drivers with clinical and finance leadership before any engineering
Keep bronze untransformed so you can always prove what the source said
Hold the cost-centre-to-service-line mapping as maintained data, not code
Produce an allocation reconciliation and check the residual every run
Name tables and columns in business terms — Copilot reads them too
Monitor capacity consumption from the first workload, not after the first invoice
Pitfalls
What catches most first attempts
Every one of these is avoidable, and every one of them is common enough that we check for it by default.
!Building before the drivers are agreed
A technically excellent model with a disputed allocation is a model nobody uses. The workshop is the project's critical path, not a preliminary.
!Deriving the service line in report logic
It will diverge between reports within months. Build the dimension once, in the model, and let everything inherit it.
!Ignoring capacity cost until the invoice
Consumption-based compute behaves differently from licensed software. An inefficient notebook or an over-refreshed model is expensive in a way a fixed licence never was.
!Adding row-level security after publishing
Retrofitting an access model onto a published semantic layer is disruptive and it always happens at the worst possible moment.
Completion checklist
Allocation drivers agreed and signed by clinical and finance leadership
Bronze ingestion landing sources untransformed with lineage intact
Service-line dimension built once and used everywhere
Allocation reconciliation producing a zero residual
Semantic model on Direct Lake with row-level security and business naming
Capacity monitoring and alerting configured
Want a second pair of eyes?
We will build the model for one service line against your own data and walk your clinical and finance leads through the result together, before anything wider is committed.