All case studies
Healthcare 2024 — Present

Building Admissions 360 — A Behavioral Health Analytics Platform on Microsoft Fabric

Designed and led the implementation of an enterprise admissions analytics platform on Microsoft Fabric and Power BI, replacing a fragmented reporting estate with a unified semantic layer serving departments across the admissions journey.

Client Behavioral health network (US)
Role Senior BI Architect
Industry Healthcare
Period 2024 — Present
Key Outcomes
01

Single semantic model serving 8+ department audiences with page-level access governed by Entra ID security groups

02

Reduced executive report distribution from manual weekly process to automated PDF flow with bookmark-driven navigation

03

Built automated KPI validation harness in Fabric Notebooks (SemPy) catching measure drift before it reached executive dashboards

04

Cut new dashboard development time from ~2 weeks to ~2 days by standardizing on shared semantic model and reusable visual components

The brief

The client is a national behavioral health organization with operations spanning admissions, clinical care, billing, and authorization workflows. The analytics environment we inherited was the product of years of organic growth — Power BI reports built per-department against direct database connections, multiple definitions of core metrics like “active admissions” and “authorization turnaround,” and a quarterly business review that consumed roughly two weeks of analyst time to assemble each cycle.

The mandate was straightforward to state and considerably harder to execute: build a unified analytics platform on Microsoft Fabric that could serve as the single reporting surface for the admissions journey, with governance, security, and operational automation appropriate to a healthcare context.

The architecture

We made four foundational decisions in the first six weeks that shaped everything that followed.

One lakehouse, one semantic model. Rather than building a Fabric workspace per business domain, we landed all admissions-relevant data in a single Bronze/Silver/Gold lakehouse architecture, with a Gold layer specifically shaped to feed a single shared semantic model. The model became the contract — every report consumed it via Direct Lake, no exceptions, no per-report datasets.

Audience-driven app distribution, not RLS. The data sensitivity profile here didn’t actually require row-level security — the partitioning was by department viewing rights, not by patient record visibility. We modeled this with Power BI app audiences mapped to Entra ID security groups, with page-level visibility configured per audience. This avoided the maintenance overhead of dynamic RLS while still enforcing strict access boundaries.

Automated executive distribution. Senior leadership wanted Friday-morning PDFs of the weekly Admissions 360 report in their inbox. We built this as a Power Automate flow that exports the Power BI report to PDF, hands it to a Fabric Notebook that uses PyMuPDF to inject a navigable table of contents and bookmarks, stages the result in SharePoint, and distributes via a service-account mailbox. What used to be a Tuesday-afternoon ritual for an analyst became a scheduled flow.

KPI validation as code. The most important infrastructure investment we made — and the one that pays off quietly week after week — was a SemPy-based validation harness running in Fabric Notebooks. It executes every Gold-layer KPI, compares against a known-good reconciliation against source systems, and posts a Teams alert if any measure drifts beyond tolerance. We caught three production-affecting measure regressions in the first quarter. None of them reached an executive dashboard.

What worked

The semantic-model-as-product discipline paid for itself within the first six weeks. By the time we were building the Authorization 360 dashboard — the second product in the platform — we were able to reuse approximately 60% of the dimensional model and roughly half the measures from Admissions 360. The second product shipped in roughly half the time of the first.

Direct Lake performance was, frankly, better than I expected. Fact tables in the 30–80M row range serve interactive Power BI experiences without the import-mode refresh choreography we would have needed in a non-Fabric environment.

The audience model has been almost suspiciously low-maintenance. New department onboarding is now a 30-minute exercise rather than a week of report variant cloning.

What didn’t, the first time

The first attempt at the Power Automate distribution flow tried to pass the rendered PDF as a base64 string between actions and immediately hit Power Automate’s payload size limits on reports above a few pages. We refactored to a SharePoint-staged pattern — write the PDF, hand a path reference to subsequent actions, read it back when needed — which both fixed the size issue and made the flow easier to debug.

We also initially attempted to enforce RLS via the semantic model on the off chance the access requirements would tighten later. This added complexity without commensurate value and was reverted in favor of the audience-driven approach. A useful reminder: do not pre-build security infrastructure for hypothetical requirements.

Where it goes from there

The platform now hosts two products in production (Admissions 360, Authorization 360) and three more in active development. The roadmap is to bring all admissions-journey reporting under the single semantic model, retire the legacy report estate, and use the freed analyst capacity to build the second-tier analytics — cohort analysis, predictive admissions forecasting, payer-mix optimization — that the client could not previously afford to staff.

The deeper lesson, which I’ve written about in the journal, is that the dashboards were never the product. The semantic model was. Once we started treating the model as the deliverable, every other decision became easier.


Technology Stack
Microsoft FabricPower BIOneLakeDirect LakeDAXSemPyPower AutomateSharePointEntra IDT-SQL