What actually moves out of the project metadata?
MicroStrategy separates schema objects from application objects. Schema objects — attributes, facts, hierarchies, transformations and the logical tables behind them — describe your warehouse to the SQL Engine, which assembles a query at run time by choosing tables and joins for you. Application objects — metrics, filters, prompts, templates, reports, documents and dossiers — consume that description. Power BI splits the same responsibility differently: a semantic model holds tables, relationships and DAX measures, and reports visualise it. The migration is therefore a model rebuild with a known map, not a file conversion.
The practical consequence is where ambiguity gets resolved. MicroStrategy can map one fact to several tables at different levels and pick the cheapest at query time; a tabular model has no equivalent rescue, so the grain has to be right in the table or the measure is wrong everywhere it is used. That is a relocation of the decision rather than a drawback, and it is the reason we read the schema before quoting the reports.
Estates differ mostly in how much of the logic sits in the metadata versus the warehouse. A project fed by a well-formed dimensional warehouse translates quickly, because the star is already there and the schema objects mostly describe it. A project that grew by accretion — attributes defined on operational tables, facts with expressions, custom SQL in freeform reports — needs the extra step of deciding what belongs in the warehouse, what belongs in Power Query, and what belongs in a measure.
How do MicroStrategy objects map to Power BI?
This is the working map the plan is built from. It is deliberately unglamorous: the value of a migration map is that nothing surprising appears in week three, and that every line has an owner who agreed to it.
MicroStrategy objects and their Power BI equivalents
| MicroStrategy object |
Power BI equivalent |
What changes in practice |
| Attribute with ID and description forms |
Dimension table with a key column and descriptive columns |
Forms become ordinary columns; sort-by-column replaces the display-form setting |
| Attribute relationships and lookup tables |
One flattened dimension table per business entity |
The normalised snowflake collapses; join chains stop being resolved at query time |
| User hierarchy / system hierarchy |
Model hierarchy on a dimension table |
Levels survive; the drill path is rebuilt on the visual rather than declared in metadata |
| Fact mapped to several fact tables |
One fact table at one grain, sourced by a single query |
Table selection stops happening at run time and becomes a modelling decision |
| Aggregate tables and partition mapping |
A base-grain fact, or user-defined aggregations in the model |
The performance trick becomes explicit and testable instead of implicit |
| Simple metric on a fact |
A named DAX measure using SUM or a base aggregation |
Definitions move from the metadata into readable, version-controlled expressions |
| Level Metric with target, grouping and filtering |
CALCULATE with REMOVEFILTERS, ALLEXCEPT or VALUES |
Dimensionality settings become filter context you can read, test and reuse |
| Compound and smart metric |
A measure written to evaluate at the intended grain |
Aggregate-then-divide versus divide-then-aggregate becomes an explicit choice |
| Transformation (last year, prior period) |
Time-intelligence DAX over a marked date table |
Fiscal calendars and 4-4-5 periods are declared once in the date dimension |
| Consolidation |
Grouping column on a dimension, or a calculation group |
Ad-hoc element groupings become maintained data instead of report-local logic |
| Custom group with banding |
Banding column, or a disconnected band table with a measure |
Band definitions become visible in the model and stop drifting between reports |
| Filter object reused across reports |
Report filter, a boolean model column, or a calculation-group item |
Shared filters are rebuilt once and referenced, not copied per report |
| Prompt (attribute element, value, object) |
Slicer, field parameter, or what-if parameter |
Users change the view themselves instead of re-answering a prompt each run |
| Security filter on a user or group |
Row-level security role with a DAX filter |
Row rules move onto the model and are verified with the View as role feature |
| Connection mapping to a database user |
Gateway data source plus row-level security |
Database-level impersonation becomes a model-level rule you can test |
| Object and folder ACLs |
Workspace roles and app audiences |
Who sees which content becomes a permissions question, not a modelling one |
| Grid or grid-graph report |
Report page with matrix, table and chart visuals |
Each report stops carrying its own definition and reads from one governed model |
| Dossier with chapters and pages |
Power BI report with pages, bookmarks and sync slicers |
Navigation is rebuilt rather than translated; filter panels become slicers |
| Report Services Document and bursting |
Paginated report in Power BI Report Builder, plus subscriptions |
Layout and per-recipient delivery are preserved rather than approximated |
| Intelligent Cube |
Import-mode semantic model with scheduled refresh |
An in-memory cube people published to becomes the shared model itself |
| Freeform SQL or Query Builder report |
Power Query native query, or a view in the warehouse |
Hand-written SQL is reviewed and usually promoted into the warehouse |
| VLDB properties |
No direct equivalent; storage mode and query folding settings |
SQL-generation tuning is replaced by modelling and refresh design |
| Platform usage statistics |
Workspace usage metrics |
Adoption data keeps informing which reports survive the next phase |
Three lines in that table carry most of the risk, and all three are modelling lines rather than reporting ones: attribute chains, facts mapped to several tables, and Level Metrics. They are why we design against Microsoft's star schema guidance (opens in new tab) rather than importing the logical layer as it stands — our own Power BI star schema guide walks the same shape with worked examples. The measure work that follows is the Power BI data modeling and DAX half of the job, and Microsoft's Power BI migration guidance (opens in new tab) follows the same sequence: assess and prioritise the estate before rebuilding any of it.
Why does the snowflake schema have to be flattened?
MicroStrategy rewards normalisation. An attribute chain stored across separate lookup tables is exactly what the engine expects, and it resolves the joins for you at query time, so a deep snowflake costs the report author nothing. Power BI evaluates relationships inside the model, and long chains cost you twice: the engine traverses more relationships per query, and every measure that needs to reach across the chain gets harder to write and easier to get wrong.
Flattening is therefore not cosmetic tidying, it is the step that makes the DAX simple. One dimension table per business entity, with the whole attribute chain as columns and a hierarchy declared over them, is what the rest of the model is designed against.
The same product hierarchy, before and after the rebuild
| Consideration |
MicroStrategy lookup-table schema |
Power BI star schema |
| Where the chain lives |
A lookup table per attribute level, joined by the engine |
One dimension table holding every level as a column |
| Who resolves the joins |
The SQL Engine, at query time, from attribute relationships |
The model, once, through declared relationships |
| Cost of an extra level |
Low: another lookup table and a relationship in the metadata |
Paid at design time by widening the dimension, not per query |
| Effect on measure logic |
Metric dimensionality settings handle the level |
Filter context is explicit in DAX and reads the same everywhere |
| Effect on report authors |
Attributes are picked from a browsable hierarchy |
Columns and hierarchies sit in one table with display folders |
| Failure mode |
A missing relationship produces a surprising join path |
An ambiguous or inactive relationship produces a wrong or blank total |
| What we do about it |
Collapse each chain into one conformed dimension, keep the surrogate keys, and reconcile row counts against the original lookup tables before any report is rebuilt |
How do Level Metrics become DAX?
Level Metrics are the part of a MicroStrategy estate that most often surprises a migration team, because the behaviour is invisible on the report. A metric's dimensionality — its target, its grouping, and whether it filters standardly, absolutely, or ignores the filter altogether — changes what the number means without changing how it looks in a grid.
In Power BI that behaviour has to be written down. A metric fixed at the year level becomes a measure that removes the lower date filters; a percent-of-parent becomes a division by the same measure evaluated with the child attribute removed from context; a metric that ignored the report filter becomes one that removes that filter explicitly. The building block is the CALCULATE function (opens in new tab), and the discipline is naming: one measure per intent, documented, reconciled against its MicroStrategy original on the same filters and period before anyone signs it off.
Transformations get the same treatment against a marked date table, using standard DAX time-intelligence functions (opens in new tab). If your fiscal calendar is not a calendar year, or you run 4-4-5 periods, that surfaces here as a design decision instead of an assumption buried in the metadata.
How do reports, dossiers and documents get rebuilt?
Start by classifying, not rebuilding. A MicroStrategy project accumulates: the same grid report saved by four people, a dossier nobody has opened in a year, and a handful of documents that month-end genuinely depends on. Usage statistics and the metadata itself make that call evidence-based rather than political, and it routinely removes more work than the rebuild adds.
Surviving content splits cleanly. Anything a person explores becomes an interactive report on the shared model, with prompts rebuilt as slicers and field parameters so the filtering habits survive. Anything a person prints, files, or sends to a customer — the Report Services Documents side of the estate — becomes a paginated report (opens in new tab) in Power BI Report Builder, which gives exact page-layout control and prints every row across as many pages as it takes. Paginated reports depend on the capacity your workspace runs on, so confirm the licensing against Microsoft's current documentation before committing to a design.
Subscriptions and bursting need a decision rather than a translation. Per-recipient delivery maps onto Power BI subscriptions and a paginated-report delivery process, but not one for one, so we agree the delivery design with the recipients early instead of discovering it at cutover.
How is security rebuilt?
MicroStrategy usually enforces two different things that get discussed as one. Security filters, sometimes reinforced by connection mapping at the database, restrict which rows a user sees; object and folder ACLs restrict which content they can open at all. Those separate cleanly in Power BI, and keeping them separate is what makes the rebuild testable.
Row rules become row-level security (opens in new tab) roles on the semantic model. In most estates the security filter's attribute qualification becomes a security table — user, then the cost centres, regions or entities they may see — and the DAX filter matches the signed-in user against it, which keeps the rule in data rather than in code. Object visibility becomes workspace roles and app audiences. We document the mapping from your existing user groups so the security review at cutover is a comparison, not an investigation.
What does the first phase cost?
We scope the first phase as a departmental slice: one project schema area and the 20 to 50 reports and dossiers that depend on it. That is small enough to quote as a fixed scope at the Growth ($4,600) or Power ($8,000) block price point depending on how much modelling the area needs, and large enough to prove the model, the metrics and the security rules on real month-end data. Work after the first phase runs on prepaid Flex hours that never expire — Starter ($2,500), Growth ($4,600) or Power ($8,000), with hourly work from $100/hour — so the next project area is a scoped task, not a new negotiation.
Cost tracks the shape of the schema far more than the number of reports. A single-fact area feeding thirty grid reports is a much smaller job than three facts, a set of Level Metrics, deep attribute chains, and a security filter per business unit. You get an estimate in hours per deliverable, approve only what you want built, and unused hours stay banked. If you are also building the licensing case, our Power BI cost and pricing guide covers Microsoft's published licence tiers so the comparison uses their numbers rather than ours. See Flex pricing.
How long does it take?
Individual reports typically ship within 3–5 business days of approval once the model is standing, and a phased migration is a sequence of those tasks rather than one project ending in a big-bang cutover. The model is the front-loaded piece: it is worth building and reconciling before the report queue starts, because every report after it gets cheaper.
Running MicroStrategy alongside Power BI for one full reporting cycle is worth the overlap. Users compare both outputs on live data, differences get explained rather than argued about, and the project area is switched off only once its replacement has been through a real month-end.
Who this is for
Finance, operations and IT teams carrying a MicroStrategy project they can no longer maintain comfortably: a schema only one person understands, a renewal that has stopped looking like value, prompt-driven reports nobody can self-serve, or a knowledge gap left by whoever built the metrics. It is a poor fit for anyone wanting a like-for-like screen copy with no modelling decisions made — that buys a more expensive version of the problem you already have.