Built once. Used at scale.
Trusted by the people who decide.
Power BI Consulting on Microsoft Fabric Direct Lake
MDI builds Power BI on Microsoft Fabric Direct Lake. Governed semantic models per domain, Power BI Copilot, Row-Level Security at the model layer, deployment pipelines — for mid-market manufacturers, FMCG and supply chain. First production semantic model in 6 weeks.
The Problem
Patterns we see in every engagement
Most Power BI projects do not fail at the dashboard. They fail at the gateway. They fail at the semantic model that nobody owns. They fail when the refresh times out at 2am and the morning leadership review goes back to spreadsheets. These are the patterns we close.
Import models that have outgrown the refresh window.
Your fact table crossed 50 million rows. The overnight refresh now takes 4 hours. Wednesday morning's report is yesterday's data because the refresh failed at 6am. Operations stops trusting the dashboard and goes back to ERP exports. Direct Lake on Fabric removes the refresh entirely — same data, zero hydration cost.
27 versions of YTD because everyone built their own measure.
Three plant managers, three different OEE definitions, three different YTD calculations. The leadership review argues about whose number is right. Governed semantic models with calculation groups end this — one measure, named for the business term, owned by a person.
Copilot enabled on a workspace nobody cleaned up first.
Power BI Copilot now works in production for plant-manager-grade questions. It also reflects back whatever mess sits in the semantic model. Garbage measures lead to confident wrong answers. We clean the model before we enable Copilot — not after.
Tableau or Qlik estate that needs to move to Power BI.
Your enterprise standard shifted. The Tableau renewal is up. The migration to Power BI looks straightforward until you start mapping 400 dashboards across teams, RLS rules, and embedded reports. We have moved several estates — we know which patterns transfer cleanly and which need rebuilding.
What we build
What we build for Power BI buyers
Six engagement shapes. Each one named for a real outcome an Operations Director or CFO would describe.
Direct Lake migration from Import
Replaces
The 4-hour overnight refresh window that breaks twice a month and makes morning standups argue about whose number is right.
- Audit existing Import models for unsupported DAX patterns before migration commits
- Rebuild semantic models on Delta Parquet in OneLake — no refresh, no hydration penalty
- Parallel run new vs old for 2 weeks before cutover so business has confidence in the new number
- Fabric F-SKU capacity sized to actual workload — not guessed at procurement time
Refresh window removed. Query latency within 10–15% of Import. Capacity bill typically drops 20–35%.
Enterprise semantic model build per domain
Replaces
27 user-built models with conflicting OEE / OTIF / Fill Rate definitions that nobody can reconcile in a leadership review.
- One governed semantic model per business domain — Manufacturing, Supply Chain, Customer, Finance
- Measures named for the business term, not the source column. RLS at model layer, not bolted on per report
- Calculation groups for time intelligence — stop maintaining 27 versions of YTD vs PYTD
- Owned by a named person on your team — not orphaned the day the contractor leaves
One model. One number. Leadership reviews stop arguing about whose calculation is right.
Power BI Copilot enablement (done properly)
Replaces
The analyst inbox queue — plant managers emailing because they could not find OEE on Line 3 yesterday and the dashboard timed out anyway.
- Harden the semantic model first — Copilot reflects garbage measures back as confident wrong answers
- Document every measure with synonyms and example questions so Copilot maps natural language to your business terms
- Scope Copilot to governed workspaces — block it from running over un-curated departmental models
- Train plant managers, supply chain leads and CFO on what Copilot is good at and what it is not
Plant managers ask questions in plain English at the morning huddle. Analyst inbox queue shrinks 40–60%.
Row-Level Security for multi-plant and multi-region
Replaces
Per-report RLS hacks that break every time someone publishes a new copy of the dashboard.
- RLS at the semantic model layer — every report inherits without per-report configuration
- Plant-level, region-level, customer-account-level security models
- Dynamic RLS via Entra ID — joiner-mover-leaver handled automatically through user attributes
- Audited regularly so security drift is visible, not silent
One model, every report secured. New report inherits the rules. No more spreadsheet-based access matrices.
Deployment pipelines: Dev → Test → Prod
Replaces
The Power BI workspace where the report that is correct lives on someone's laptop and the production version has been broken since the Tuesday update.
- Power BI Deployment Pipelines with Git integration for semantic models and reports
- Branch-per-feature workflow so a broken measure does not take production down
- Automated checks on data quality and measure performance before promotion to production
- Audit trail of who changed what and when — visible in seconds, not searched through Teams chats
Production stability returns. Changes are deliberate, reviewable, and revertible.
Performance tuning for slow Power BI
Replaces
The 40-second visual that everyone has accepted as 'how Power BI works' but really represents four bad DAX measures and a missing aggregation table.
- Performance audit with DAX Studio and Tabular Editor — name the actual bottleneck, not the symptom
- DAX measure refactoring — we have taken 40-second visuals to 1.2 seconds by rewriting four measures
- Aggregation tables and composite models where Direct Query is the right shape
- Capacity load analysis — sometimes the answer is workload distribution, not more SKU
Slow reports become usable. We have taken 4-hour refreshes to 12 minutes by fixing the model, not the gateway.
How we work
From audit to first governed model in 6 weeks
Discover → Prototype → Deploy → Expand. Same shape for every Power BI engagement. First production-grade domain in 6 weeks, not 6 months.
01
Discover — audit the Power BI estate
We pull 90 days of usage logs from Power BI's own activity API. The 20 reports driving 80% of views, the orphans nobody opens, the gateways that fail. We score every semantic model for governance, naming, and ownership. The output is a ranked list — what to rebuild first, what to archive, what to leave.
02
Prototype — one production semantic model on Direct Lake
Two weeks to build the chosen domain on Direct Lake with two production-grade reports. Parallel run against the existing Import model. We prove the latency, the capacity cost, and the migration effort with real data — not slides.
03
Deploy — domain by domain, owner by owner
Move the domain over. Deployment pipelines, RLS, ownership, Copilot enablement. Train the named model owner. The retainer or sprint engagement continues domain by domain — Manufacturing, then Supply Chain, then Customer, then Finance.
Technology stack
Semantic Modelling
Authoring & UX
Governance
AI & Copilot
Platform
Source Systems
Common questions
What buyers ask us
We have 400 Power BI reports already. Where do we start?
Usage data. Power BI tracks every view via the activity API. We pull 90 days of usage logs, find the 20 reports that drive 80% of the views, and rebuild those on the new governed model first. The other 380 either get archived or auto-converted. We have done this with Power BI estates of 50, 400 and 1,200 reports — the 80/20 pattern holds every time.
Our Power BI sits on SQL Server / Oracle / on-prem. Do we have to move to Fabric?
No. Power BI works with everything. We assess whether the move is worth the migration cost. For some mid-market clients the answer is stay on SQL Server and add a semantic model layer. For others — high data volume, multiple source systems, real-time requirements — Fabric pays back in 9–12 months. We tell you which one you are during Discover.
What about Tableau, Looker, Qlik?
We migrate them. We have moved estates from each. Honest framing: Tableau is better at exploratory data analysis. Power BI is better at governed, scaled, embedded BI. If your buyer is an analyst Tableau may win. If your buyer is an Operations Director or a CFO, Power BI usually wins. We will not promise that migration is fun — but we have run it enough times to know the patterns.
How much does it cost?
We price Power BI work the same way as our Fabric engagements: a fixed fee on a fixed scope, confirmed after a 30-minute diagnostic — never open-ended time and materials. The commitment we make upfront is the timeline. The Foundation build — governed semantic model, Direct Lake, and core dashboards — delivers first value in 6 weeks and production at 8. If you want to prove one governed dashboard first, the 2-week Starter Sprint is a fixed-scope entry point. Power BI Pro and Fabric capacity are separate Microsoft licences (capacity from an F2 SKU, about USD 262/month).
Can we start in 2 weeks?
For Discover, usually yes. For Prototype, depends on data access readiness on your side — connector credentials, RLS scope, source-system access for our team. We send a Discover prep checklist on day one of the engagement so the gap closes fast.
What is a governed Power BI semantic model and why does it matter for manufacturers?
A governed Power BI semantic model is a single, owned data model where each measure — OEE, OTIF, fill rate — is defined once, named for the business term, and secured at the model layer. It matters because without it, teams build conflicting versions of the same metric and leadership reviews argue about whose number is right. On Microsoft Fabric the model reads Delta tables in OneLake, so every report inherits the same definitions.
How do I build a single Power BI semantic model for manufacturing operations?
Model one business domain at a time — Manufacturing first — with measures named for the business term, row-level security at the model layer, and calculation groups for time intelligence. Build it on Direct Lake over OneLake so it reads live Delta tables with no refresh. Assign a named owner on your team so it stays maintained after go-live; we deliver the first production domain model in a 2-week Prototype.
How do I stop multiple teams from building conflicting OEE or OTIF definitions in Power BI?
Replace user-built models with one governed semantic model per domain, where OEE and OTIF are each defined once and owned by a named person. Calculation groups handle the time-intelligence variants, so there are not 27 versions of YTD. When every report reads the same model, the leadership review stops debating whose number is correct.
What are DAX calculation groups and how do they eliminate duplicate YTD measures?
Calculation groups let you define time-intelligence logic — YTD, PYTD, MAT — once and apply it across every measure, instead of writing a separate measure for each combination. A model with 27 hand-built YTD variants collapses to one calculation group. It cuts maintenance and removes the inconsistencies that come from copy-pasted DAX.
How do I assign ownership to a Power BI semantic model so it does not become orphaned?
Name one person on your team as the model owner before go-live, and hand over with documentation and training so they can extend it. Deployment pipelines and Git integration make changes reviewable, so ownership does not depend on tribal knowledge. The common failure is a model built by a contractor that nobody owns the day they leave — we build to prevent that.
What is Power BI Direct Lake mode and how does it differ from Import mode?
Direct Lake reads Delta tables in OneLake directly with no data copy, so the report reflects new data as it lands and there is no refresh to schedule or fail. Import loads a separate copy into the model, so the report is only as fresh as the last refresh and large models can take hours or time out. Direct Lake needs the data in OneLake Delta format; Import works with any source. For large operational models, Direct Lake removes the refresh window while keeping query latency within 10-15% of Import.
How do I migrate a Power BI Import model to Direct Lake on Microsoft Fabric?
Audit the existing Import model for unsupported DAX patterns, rebuild the semantic model on Delta Parquet in OneLake, and parallel-run new against old for two weeks before cutover. The refresh window disappears and capacity cost typically drops 20-35%. We size the Fabric F-SKU to actual workload rather than guessing at procurement time.
How do I fix a Power BI refresh that takes 4 hours and breaks twice a month?
Move the model from Import to Direct Lake so there is no refresh to run — the report reads live Delta tables in OneLake. Where Import must stay, we fix the real bottleneck: bad DAX, missing aggregation tables, or an oversized model. We have taken 4-hour refreshes to 12 minutes by fixing the model, not the gateway.
How do I speed up slow Power BI visuals with DAX optimisation and aggregation tables?
Profile the report with DAX Studio and Tabular Editor to name the real bottleneck, then refactor the offending measures and add aggregation tables where Direct Query is the right shape. Most slow reports are four bad measures, not how Power BI works — we have taken 40-second visuals to 1.2 seconds by rewriting them. Capacity load analysis often shows the fix is workload distribution, not more SKU.
How do I reduce Power BI capacity costs when moving from Import to Direct Lake?
Direct Lake removes the data-hydration cost of Import — there is no refresh consuming capacity — so the same workload runs on a smaller Fabric F-SKU. Clients typically see the capacity bill drop 20-35% after migration. We size the capacity to measured workload using Fabric Capacity Metrics, not a procurement guess.
How do I implement row-level security in Power BI for multi-plant manufacturers?
Implement row-level security at the semantic model layer so every report inherits plant-level, region-level, or customer-level rules without per-report configuration. One model, every report secured, new reports inherit automatically. This replaces the per-report RLS hacks that break each time someone publishes a copy.
How do I set up dynamic RLS in Power BI using Entra ID for a manufacturing company?
Dynamic RLS maps the signed-in user to their data using Entra ID attributes, so a plant manager sees only their plant without a separate role per person. Joiner-mover-leaver changes are handled through user attributes, not manual role edits. It scales to multi-plant, multi-region estates without a spreadsheet access matrix.
How do I build Power BI deployment pipelines with Dev, Test, and Prod environments?
Power BI Deployment Pipelines with Git integration give you Dev, Test, and Prod stages for semantic models and reports, with a branch-per-feature workflow. Automated checks on data quality and measure performance run before promotion to production. You get an audit trail of who changed what, visible in seconds rather than searched through Teams.
How do I prevent a bad Power BI update from breaking the production dashboard?
Use Deployment Pipelines and Git so changes are promoted Dev to Test to Prod rather than edited live, and a broken measure stays in a branch instead of taking production down. Automated performance and data-quality checks gate promotion. Every change is reviewable and revertible, so production stability stops depending on luck.
How do I enable Power BI Copilot for plant managers and operations teams?
Harden the semantic model first, document every measure with synonyms and example questions, then scope Copilot to the governed workspace so it cannot run over un-curated models. Train plant managers and operations leads on what Copilot answers well and what it does not. Done this way, managers ask questions in plain English at the morning huddle.
What needs to be done to the semantic model before Power BI Copilot can be used reliably?
Copilot reflects whatever sits in the semantic model, so garbage measures become confident wrong answers. Before enabling it, we clean and name every measure, add synonyms and example questions, and remove orphaned or duplicate measures. Copilot is enabled only after the model is governed — not before.
How does Power BI Copilot answer questions about OEE, OTIF, or fill rate in plain English?
Copilot maps a natural-language question to the measures in your governed semantic model, so "what was OEE on Line 3 yesterday" resolves to the one defined OEE measure. Accuracy depends on the model being documented with synonyms so business terms map correctly. Because it reads the governed model, the answer matches the dashboards.
How do I reduce the analyst inbox queue using Power BI Copilot for operations teams?
When plant managers and supply-chain leads can ask Copilot directly against a governed model, the ad-hoc requests that fill the analyst inbox drop sharply — typically 40-60%. The analysts move from answering "where is OEE on Line 3" to building new models. The prerequisite is a hardened, documented semantic model.
What KPIs should an FMCG operations dashboard include in Power BI?
An FMCG operations dashboard in Power BI should carry fill rate, OTIF, forecast accuracy, inventory turns, days inventory outstanding, and case-fill by SKU and region. Build them on one governed semantic model so the same fill-rate number appears everywhere. On Direct Lake the dashboard reflects live ERP data rather than an overnight extract.
How do I build a real-time logistics dashboard in Power BI with live ERP data?
Land ERP, WMS, and TMS data in OneLake — via Mirroring or Azure Data Factory — and build the dashboard in Power BI on Direct Lake so it reflects shipments as they move. Track OTIF, dwell time, and cost-to-serve against one governed model. Fabric Activator can raise an alert when a shipment breaches its window.
How do I build an OEE dashboard in Power BI connected to live MES data?
Stream MES and machine data into OneLake through Fabric Eventstream, model availability, performance, and quality in the gold layer, and read it in Power BI with Direct Lake. The OEE dashboard updates as the line runs, so a drop shows within minutes. One governed OEE measure means every plant reports it the same way.
How do I track inventory turns and fill rate in a Power BI dashboard for FMCG?
Model inventory turns, days inventory outstanding, and fill rate once in a governed semantic model over OneLake, then surface them in Power BI on Direct Lake. Because the measures are defined once, planning and finance read the same numbers. Live data means the stock position reflects today, not last night's extract.
How do I track project performance in Power BI for EPC and construction companies?
For EPC, build a Power BI model that tracks earned value, cost-to-complete, schedule variance, and committed vs actual cost by project and work package. Connect ERP and project systems into OneLake so the numbers reconcile to finance. One governed model gives the project director and the CFO the same figures.
What does an executive dashboard for a supply chain director look like in Power BI?
A supply-chain-director dashboard leads with OTIF, fill rate, forecast accuracy, inventory cover, and cost-to-serve — the few numbers that drive the weekly decision — with drill-through to plant and SKU detail. Build it on one governed semantic model so the headline numbers reconcile to the operational reports beneath. On Direct Lake it reflects live data, so the review runs on current numbers.
How do I build a DIFOT dashboard in Power BI for a logistics company?
Build a DIFOT (Delivered In Full, On Time) dashboard in Power BI on a governed model fed by ERP, WMS, and TMS data in OneLake. Track DIFOT by customer, lane, and carrier with drill-through to the failed deliveries behind the number. Direct Lake keeps it current, and Fabric Activator can flag a customer trending below target.
How do I migrate from Tableau to Power BI for manufacturing analytics?
We map the Tableau estate — workbooks, data sources, RLS rules, embedded reports — identify which patterns transfer cleanly, and rebuild the rest on a governed Power BI semantic model. Honest framing: Tableau is stronger for exploratory analysis; Power BI is stronger for governed, scaled, embedded BI for operations leaders. We have moved several estates and know which patterns rebuild versus convert.
How do I migrate a Qlik estate to Power BI?
We migrate Qlik apps by rebuilding the data model as a governed Power BI semantic model rather than porting Qlik script line by line. Usage logs identify the apps that matter, so effort goes to the 20% that drive most views. The result is one governed model with RLS and deployment pipelines, not a like-for-like copy of the Qlik mess.
How do I identify which Power BI reports are actually used before migrating or rebuilding?
Power BI's activity API logs every view. We pull 90 days of usage data, find the 20% of reports that drive 80% of views, and rebuild those first — the rest are archived or auto-converted. The 80/20 pattern has held across estates of 50, 400, and 1,200 reports.
How do Power BI usage logs help prioritise a semantic model rebuild?
Usage logs turn a rebuild from guesswork into a ranked list: which reports drive views, which are orphaned, which semantic models are worth governing first. You rebuild the high-value 20% on the new model and stop spending effort on reports nobody opens. It is how we sequence a migration so business value lands first.
Ready to move
Book a 30-minute Power BI diagnostic
30 minutes with Amit. No slides. No pitch deck. No obligation to proceed. Most operations leaders leave the call with three things they had not considered.