Skip to main content
Data Platform

The Hidden Costs of a Microsoft Fabric Migration Nobody Tells You About

The awkward conversation happens in month five, not month one. The platform works. The first three reports are live. Then the finance business partner circulates the actual run-rate against the approved business case, and the number is 30–50% over — not because the partner overran, but because six or seven cost lines were never in the case at all. I sell Fabric implementations. This names the costs my own proposals have to cover.

Amit Kumar Singh - Technology Consulting Partner at MyData Insights

Technology Consulting Partner · MyData Insights

14+ years in industrial data · Former Accenture & EY · India, GCC, SEA

17 August 2026 · 15 min read

The bottom line

The hidden costs of a Microsoft Fabric migration are the lines that appear after contract signature: parallel running of the legacy stack, capacity headroom for backfill, Silver-layer remodelling, semantic model rework for Direct Lake, data quality remediation, FinOps ownership, cross-region egress, Copilot consumption, Power BI licences below F64, internal subject-matter time, training, and stalled ownership decisions. The implementation quote is usually close to right; the total cost of getting from a working legacy stack to a decommissioned one is not — most of the missing money sits in the overlap period, the capacity consumed while migrating, and your own people's time. Commonly 30–50% on the first-year total. Each line has a contract clause that removes the argument later: name the decommission date with an evidence test, price a temporary SKU step-up for the migration window, and require a model-by-model Direct Lake conversion assessment before signature.

An argument against a half-built business case, not against Fabric

Nothing here is an argument against Fabric. It is an argument against a business case built only from the licence cost and the implementation fee. The pattern is consistent across mid-market manufacturing, FMCG, logistics and EPC estates: the implementation quote is usually close to right, but the total cost of getting from a working legacy stack to a decommissioned one is not.

Most of the missing money sits in the overlap period, in the capacity you consume while migrating rather than when steady, and in your own people's time. This is the layer on top of the base implementation cost and SKU sizing.

What are the hidden costs of a Microsoft Fabric migration?

The full register, with the operational reason each line appears and the clause that removes the argument later:

Cost lineWhy it appearsDe-risk clause
Parallel runningThe legacy stack cannot be switched off on go-live dayName the decommission date and evidence test; hold final payment against legacy shutdown
Capacity headroomBackfill runs on top of BAU; smoothing raises the next day's floorPrice a temporary SKU step-up with a named scale-down date
Silver-layer rebuildLegacy views encode logic nobody wrote downFix scope by dimension and fact count, not by "existing reports"
Semantic model reworkDirect Lake supports no calculated columns, tables, hierarchies or aggregationsRequire a model-by-model conversion assessment before signature
Data quality remediationJoining systems makes every mismatch visible at onceProfiling run in Discover; remediation as a priced option
FinOps ownershipCapacity Metrics keeps only 14 days of compute dataName the capacity owner in the RACI with a weekly review
Egress / cross-regionLakehouse in one region, consumers in anotherDecide capacity regions in architecture, not delivery
Copilot / AI consumptionMetered per 1,000 tokens against the same capacity as ETLPilot AI on a separate capacity; set a workspace CU ceiling
Power BI licences below F64Every viewer needs Pro/PPU below F64Model the licence line against the SKU in the business case
Internal SME timeThe people who know the OTIF rule run the businessName individuals and days per week in the SOW
Training / productivity dipAnalysts must learn notebooks and Delta tablesBudget an enablement block per role, not from contingency
Deferred decisionsIdle delivery capacity is billed either wayDecision log with named owners, dates and an escalation clock

Why does parallel running cost so much more than expected?

The legacy stack cannot be switched off on Fabric go-live day. Finance and operations need at least one full monthly close reconciled on both platforms before trusting the new one — that means paying for two data platforms, two sets of support, and two teams reconciling differences, typically for one to two quarters. The overlap is not a failure of planning; it is what a responsible cut-over looks like. What goes wrong is that the business case assumes a single switch-over date, so the second platform's cost sits nowhere.

Two things extend the overlap in practice: a reconciliation difference nobody can explain — a margin figure that differs by 0.4% because the legacy view silently excluded credit notes — and a downstream consumer nobody inventoried, like a spreadsheet a regional finance lead has refreshed every Monday for four years. The contract answer is to make the decommission date a deliverable with an evidence test, not an aspiration, and to hold a payment milestone against it.

Make the decommission date a deliverable with an evidence test and hold a payment milestone against it. That single clause changes the incentive on both sides.

How much extra capacity does a migration consume?

A migration consumes capacity twice: business-as-usual refreshes plus historical backfill and repeated reprocessing. Fabric smooths background operations over a 24-hour period, so a heavy overnight backfill raises the consumption floor into the following business day rather than clearing at midnight. Translate that into an operating day: the backfill of four years of production orders finishes at 05:00, the plant manager opens the OEE report at 06:30 and it takes 20 seconds longer to load, and by the following week a mid-morning refresh is rejected outright. The conclusion in the room is "Fabric is slow" rather than "we sized the capacity for steady state and ran a migration on it".

The practical answer is a separate capacity for migration work, or a temporary SKU step-up with a named scale-down date written into the plan. Both cost money; neither costs as much as a stalled adoption. Set capacity-level surge protection thresholds and workspace-level CU ceilings so the migration workspace cannot monopolise the capacity. Buying a bigger SKU to cover an inefficient Silver layer is the most expensive way to solve that problem.

Why does the Silver layer always cost more than quoted?

It is scoped as a lift-and-shift of existing views and turns out to be a remodelling job. Legacy warehouse views encode years of undocumented business logic — exclusions, overrides and hard-coded date ranges — that must be rediscovered, agreed with the business and rebuilt as conformed dimensions and facts rather than copied. In an ERP-heavy estate the symptom is familiar: eleven definitions of "net sales", each correct for the report it was built for. Moving them to Delta tables does not resolve them; it puts them side by side, where the disagreement becomes visible and someone has to decide.

That decision work is the real cost, and it is not an engineering cost. It is a series of half-hour conversations with the people who know why the exclusion exists — the demand planner, the credit controller, the plant scheduler. Scope this by artefact count rather than by report count. "Eight conformed dimensions and five fact tables" is a scope. "Migrate the existing reports" is a liability.

What does Direct Lake break in an existing Power BI model?

Direct Lake does not support calculated columns, calculated tables, user-defined hierarchies or user-defined aggregations on Direct Lake tables. Binary and GUID types are unsupported. Import-mode models rely on several of these. Every mature Power BI estate contains the same habits: a calculated column flagging a row as "returnable", a date table from auto date/time, a hierarchy built in the model, an aggregation table added when a visual got slow. Each has to be re-engineered — most often by pushing the logic upstream into the Silver or Gold Delta table, which is the correct place for it and also a change to the pipeline, not just the model.

Two further constraints: Direct Lake carries per-SKU guardrails (F2–F8 allows 300 million rows and a 10 GB model; F64 allows 1,500 million rows and 25 GB), and a Direct Lake model cannot be created in a workspace in a different region from the data source — a genuine constraint for a group operating capacities in the UAE and India. Direct Lake on SQL also falls back to DirectQuery on non-materialised views and SQL-based access control; a model that performs well in a demo and badly in production is usually one silently falling back. The de-risking clause is a model-by-model conversion assessment before signature. Import mode remains a legitimate answer — it is not a migration failure.

The costs your own organisation pays

Three of the largest lines never appear on any invoice. Internal subject-matter time — the people who can confirm why OTIF excludes intercompany transfers are the operations and finance leads running the business this quarter, and a migration needs perhaps two days a week of that attention across a 12–16 week programme. Where that time is not named in the SOW, the programme does not stop — it slows, and slow is billed. FinOps ownership — someone must watch consumption weekly and decide whether to optimise or scale, and the Capacity Metrics app retains only 14 days of compute data, so a spike from three weeks ago is not investigable.

Training and the productivity dip — analysts fluent in Power Query and Excel must learn notebooks, Delta table behaviour and semantic model discipline, and output falls for four to eight weeks before it rises. And the cost of decisions deferred — a migration that stalls for six weeks because nobody will decide who owns the definition of "active customer" is paying for delivery capacity, consumption and parallel running throughout. This is a sponsorship problem, not a technical one, and the most common way a data programme fails.

Where this breaks, and what this does not fix

A cost register does not make the costs go away. Naming parallel running honestly means the business case shows a higher number than the competing proposal that ignored it — and some buyers will pick the lower number. Fixed-scope contracts move risk, they do not remove it: a partner who fixes the price on an estate they have not profiled will either pad the number or manage the scope down when it hurts, so a short paid discovery before the fixed-price build is the honest structure.

Consumption is a moving target — Copilot rates are published today, but AI feature adoption is not forecastable from a pilot, so model a range and monitor weekly. Reservations reduce the rate, not the exposure — they commit you for one or three years, do not cover storage or networking, and pausing a reserved capacity may not lower cost at all. Some data quality problems are not fixable in the platform — if the plant enters downtime reasons as free text, no medallion layer creates a clean reason code retrospectively; you fix it forward from the day the master data changes, and history stays approximate. And none of this covers a bad architecture decision — putting the lakehouse in the wrong region is a rebuild, which belongs in week one of design, not a cost register.

What to do first

Five questions to answer this week, before the next proposal is signed:

  • What is the earliest date the legacy platform can actually be switched off, and what evidence would finance need — one reconciled close, or three?
  • What is your current capacity consumption at the 90th percentile, and how much headroom is left for backfill? The Capacity Metrics app answers this in ten minutes
  • How many semantic models contain calculated columns, calculated tables, hierarchies or aggregations? That count is your Direct Lake rework estimate
  • Who is named as the capacity owner, and what happens in the week they are on leave?
  • Which three business definitions are currently disputed between departments — and who has authority to settle each one?

If question five has no answer, fix that before signing anything. It is the cheapest problem on this list today and the most expensive in month four. We run Fabric migrations on a fixed-scope basis after a short paid discovery, because that is the only structure where naming these costs up front is in both parties' interest.

The implementation fee is usually accurate; the business case around it is where the money goes missing. Name the fourteen lines and the month-five conversation never happens. Book 30 minutes with Amit — no slides, no pitch deck, no obligation to proceed — a straight read on which of these lines apply to your estate and what they are worth.

Free Assessment

Where does your operation sit on the data maturity curve?

8 questions. 3 minutes. You get a scored breakdown across data infrastructure, analytics readiness, and automation potential — with a specific next step for your industry.

Data PlatformMicrosoft FabricMigrationCostDirect Lake

Your Data · Our Technology · Our Automation

Get practical insights every fortnight

Amit writes about Microsoft Fabric, Power BI, AI in operations, and digital transformation for manufacturing and supply chain leaders. Practitioner perspective - no fluff, no vendor spin.

No spam. Unsubscribe any time. Also on Substack.

FAQ

Common questions

How much more does a Microsoft Fabric migration cost than the implementation quote?

In the estates I have worked in, the lines missing from a typical business case — parallel running, migration capacity headroom, semantic model rework, data quality remediation and internal time — commonly add 30–50% to the first-year total. The implementation fee itself is usually accurate. The gap is in what surrounds it.

Why does Fabric capacity get throttled during a migration?

Because backfill runs on top of business-as-usual. Fabric smooths background operations over a 24-hour period, so overnight reprocessing raises the consumption floor into the next business day. Once accumulated overage passes 10 minutes, interactive jobs are delayed 20 seconds; past 60 minutes they are rejected; past 24 hours all requests are rejected.

Does Direct Lake support calculated columns?

No. Calculated columns and calculated tables that reference Direct Lake storage mode tables are not supported, and neither are user-defined hierarchies or user-defined aggregations on Direct Lake tables. Calculation groups, what-if parameters and field parameters are supported. Existing Import-mode logic generally has to move upstream into the Delta table.

Does Copilot in Microsoft Fabric cost extra?

Copilot consumes the same Fabric capacity as your other workloads, metered per 1,000 tokens: 100 CU seconds for input, 10 for cached input and 400 for output. Copilot operations are classified as background jobs and smoothed over 24 hours. Fabric Data Agent uses the same rates, and the queries it generates are billed separately.

Do I still pay for Power BI Pro licences after moving to Fabric?

It depends on the SKU. On F64 and above, users with a free licence and a workspace viewer role can view Power BI content. On F SKUs smaller than F64, every viewer still needs Pro, PPU or an individual trial. For a 300-user rollout, that licence line can exceed the capacity line — model it against the SKU before choosing.

Can I avoid parallel running costs by cutting over in one go?

Rarely, and it is usually a false economy. Finance and operations need at least one reconciled monthly close on both platforms before the legacy reports lose authority. The better lever is shortening the overlap: name the decommission date in the contract with an evidence test, and hold a payment milestone against it.

Continue Reading

Related Articles

Data Platform

Microsoft Fabric vs a Legacy BI Stack (SSIS + SSAS + Power BI): The Migration Case

The most common estate I walk into is not a mess. It is an on-premises SQL Server, a set of SSIS packages built between 2014 and 2019, one or two SSAS cubes, and Power BI bolted on the front. It runs. Finance closes on it. The reason I get called is a symptom — the person who wrote the packages left, the overnight batch now finishes at 07:20 and the plant meeting is at 07:30. "It is old" is not a business case.

16 min read

Data Platform

Microsoft Fabric vs SAP Datasphere: Which One Do You Actually Need

The SAP account team says the analytics answer is SAP Datasphere, because that is where the business semantics already live. Two weeks later the Microsoft team says Fabric, because that is where Power BI, the MES extracts and the 3PL feeds already live. Both are internally consistent, and neither mentions the other except to dismiss it. The IT Head is asked to pick, and picks badly — because the two products solve different halves of one problem.

16 min read

Data Platform

Microsoft Fabric Pricing Explained: Capacity Units, SKUs and Real Costs

The purchase request is one line: "Microsoft Fabric F64 capacity, annual." The finance director has signed off ERP per named user, storage per terabyte, maintenance as a percentage of licence value. None of those models apply here. The unit being sold is compute capacity — and nothing on the request says how many people it serves, how much data it holds, or what happens when the business uses more than it bought.

15 min read

Want to see how MDI solves this in your industry? Explore industry solutions

Is this the challenge you're facing?

Book a 30-minute call. We'll look at your specific operation and tell you what's achievable - plainly and without slides.