JJC SystemsBook a Consultation
Microsoft Fabric · Advanced

Building a service-line profitability model in Microsoft Fabric

Join clinical volume, cost and payer data on one governed foundation — with an allocation model your clinical directors will actually accept.

Who this is for

Two summaries, because two audiences read this

If you own the outcome

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

  1. Confirm the allocation reconciliation residual is zero for a closed period.
  2. Reproduce a service line's margin for a period finance has already signed off.
  3. Trace one published figure back through gold, silver and bronze to the source record.
  4. Confirm a service-line user sees only their own rows, and an executive sees everything.
  5. 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.

Request a consultation See our Microsoft Fabric page We reply to every message within one business day.
Get In Touch

Tell us what you're trying to fix

Describe the situation in your own words.

Please enter your first name.
Please enter your last name.
Please enter a valid email address.
Please enter your company name.
Please choose an option.
Please add a short description.

We reply to every message within one business day.