Tool-belt series · Microsoft Fabric · Plan (Fabric IQ)
Every step, in order, in plain English — what you click, what it actually does, and why it exists. No assumed knowledge. If you've felt scattered every time you opened Plan, that's because the docs describe forty features and never tell you the four that come first. This does.
Plan is a spreadsheet that's plugged in at both ends — it reads real numbers out of your Power BI model, lets people type new numbers on top, and saves those into a real database.
That's it. Everything else on this page is detail hanging off that sentence. When you get lost later, come back and re-read it — nine times out of ten your confusion is "which end am I on right now, the reading end or the writing end?"
Read it top to bottom, once, without touching Fabric. Then go again with Fabric open in another window and do each step for real. Every step has the same four parts: in plain English (what this thing is), do this (the literal clicks), how you know it worked, and when it goes wrong.
Tick boxes as you go — progress saves in this browser, on this device. Sections 1–8 are in strict order and each one genuinely needs the one before it. Skipping is the thing that makes Plan feel chaotic.
Somewhere in your organisation there is a budget spreadsheet. Someone exports actuals from Power BI into it, a dozen people type next year's numbers into it, it gets emailed around, versions multiply, and eventually a hero re-keys the final numbers into something official. Plan is Microsoft deleting that spreadsheet and putting the same job inside Fabric, where the actuals already live.
Microsoft calls Plan an "EPM & CPM solution". Ignore the acronyms. Enterprise / Corporate Performance Management just means budgeting, forecasting and target-setting — the numbers about the future, as opposed to reporting, which is numbers about the past.
Power BI has always been a read-only tool. You could look at last quarter, but you could not type next quarter into it. Plan is the write-enabled half that was always missing.
Why this is a bigger deal than it sounds
| The old way | What went wrong | What Plan does instead |
|---|---|---|
| Export actuals to Excel, budget in Excel | The moment you export, your numbers stop matching the report. Nobody can tell which file is current. | The sheet reads the model live. Same measures, same definitions, no export. |
| A separate planning tool (Anaplan, Pigment, TM1…) | Second platform, second licence, second security model, and a data pipeline between them that breaks. | Same workspace, same permissions, same capacity as the rest of Fabric. |
| Power Apps + Dataverse for write-back | You're now a software team. Someone has to own an app forever. | No-code grid. A finance person builds it themselves. |
Where Plan sits in Fabric
Plan is an item in the Fabric IQ workload — Microsoft's grouping for the "shared business meaning" layer, alongside semantic models, ontology, graph and data agents. You don't need to understand Fabric IQ to use Plan. All you need from that sentence is: Plan is designed to sit on top of a semantic model, not on top of raw tables. That single fact explains almost every prerequisite in the next section.
Tick when true
Open the Plan docs and you're immediately hit with Planning sheets, PowerTable, Intelligence and Infobridge, all presented as equals. They are not equals. One of them is the product; the other three are things you'll want in month three. Here is the honest ranking.
| Part | What it really is | Do you need it now? |
|---|---|---|
| Planning sheet | The budgeting grid. Rows and columns of numbers, some read from your model, some typed by humans, some calculated. This is Plan. | Yes. This whole page is about this one. |
| PowerTable sheet | A data-entry table over a database table — more like a managed list or a form than a budget. For maintaining reference data at scale. | No. Later, when you need to maintain data rather than plan it. |
| Intelligence sheet | Reporting and variance analysis inside Plan — plan vs actual, charts, financial-report layouts. | No. You can just use a Power BI report at first. |
| Infobridge | The data-plumbing layer: pull from several sources, merge, append, pivot, group, and map data between sheets. | No. Only when one semantic model stops being enough. |
Every one of those four has its own toolbar, its own menus and its own docs section. If you wander between them while learning, nothing accumulates — you learn a quarter of four tools instead of all of one.
So here is the rule for the next two weeks: if the docs page you're reading doesn't say "planning sheet", close it.
Tick when true
Do not skip this to "just have a look". Plan fails quietly — empty dropdowns, greyed-out buttons, a sheet that loads with no data — and every one of those symptoms traces back to something in this list. Ten minutes here saves days of confusion.
Plan doesn't read your semantic model the polite way a report does. It talks to it through the XMLA endpoint — the "back door" into a model that external tools use — and it renders itself using embed tokens, the same machinery that puts a Power BI report inside someone else's website.
Both of those are switched off in a lot of tenants and both need real capacity. That's why the requirements look heavier than "it's just a spreadsheet".
A. Tenant settings — someone with Fabric admin has to do these
Admin portal → Tenant settings. Three switches:
B. Capacity — what you're running on
C. Permissions — the one people get wrong
Do this now
Almost everyone's first attempt goes: create the Plan, create the sheet, click Add to attach data… and the dropdown is empty. Nothing is broken. The connection simply doesn't exist yet, because you have to build it somewhere else first, before you create a plan at all.
A connection is a saved, named, reusable "here is how to reach that model, and here is who to sign in as". It lives at the tenant level in Manage connections and gateways — the same place gateways and data source credentials live — not inside your plan.
Why separate? Because a budget gets used by twenty people who don't individually have back-door access to the model. You create one connection, you share it, and everyone borrows it. That's also why you must be a workspace Member or Admin to make one: you're handing out access.
Do this — create the connection
Fabric toolbar → Settings (gear) → Manage connections and gateways → New
Plan — FY27 Sales Model.Do this — share it with the humans who'll use the plan
next to the connection name → … → Manage users → search person → set access → Share
Access levels are User, User with resharing, and Owner. For a colleague who just needs to type budget numbers, User is right. You can do this later, but doing it now saves a confused Teams message on launch day.
… → Settings → Gateway and cloud connections — and swap it off the default SSO connection onto a new one you create there, then Apply. If your first-ever plan can sit on an Import model, do that and save yourself the detour.Tick as you go
This is the easy one. Two clicks and a name.
your workspace → New item → Plan → type a name → Create
A moment after you create the Plan, a Fabric SQL database appears in your workspace that you did not ask for. Do not delete it. Do not rename it. Do not "tidy it up".
That database stores your plan's metadata — the definition of your sheets, rows, formulas and layout. It is part of the Plan item, in the same way a semantic model quietly sits behind a report.
Note what it is not: it is not where your budget numbers get written. That's a different database you'll choose yourself in Step 8. Two databases, two jobs. Mixing these up is a classic week-two confusion.
FY27 Sales Plan, not Sheet1.Tick as you go
Open the new Plan item. It offers to get data from a semantic model or from Excel, and to build a sheet from it — or to start with an empty sheet and connect it afterwards. Take the empty sheet. Doing the two things separately makes it much clearer which half is which, and that clarity is the whole point right now.
in the Plan item → Planning → name the sheet → Create
then, in the new sheet → Add → Select a Connection → pick your connection → choose the semantic model → Add
You just did two separate things that feel like one. First you made an empty grid. Then you told that grid where its numbers come from.
The grid is yours — your layout, your rows, your formulas. The model is not yours; it's shared, governed, and read-only from here. Plan never writes back into your semantic model. Keeping that boundary clear in your head is most of the battle.
Tick as you go
Now you shape the grid. This is the part that decides whether your plan is pleasant or painful for the next six months, and it takes about five minutes to get right.
A planning sheet is a pivot table you're allowed to type into. Exactly like a pivot table, it has two jobs to fill:
Row dimensions — what you're planning. Product, department, cost centre, account, region. These stack into a hierarchy you can expand and collapse: Category → Sub-category → Product.
Column dimensions — almost always when. Months, quarters, years. Sometimes also which version: Actual, Budget, Forecast.
the anatomy of every planning sheet you will ever build
Tick as you go
Everything so far has been reading. Now you add a row that isn't in the semantic model at all and type into it. This is the point of the entire product, and it's worth pausing on when it works.
A data input row is an empty row you bolt onto the grid so a human can type. Nothing feeds it. It exists because the model doesn't have the thing you need.
Two examples that make it click: your P&L model has revenue and expenses but no shares outstanding, so you can't compute EPS. Or you launched a product last week that has no history, so it appears nowhere in the model — but it definitely needs a budget.
The model can't answer those. A person can. That's a data input row.
Do this — two ways, same result
select a row → Planning → Insert Row → Data Input → Number
or: hover a row → row gripper → Insert → Data Input
The row gripper is the little handle that appears when you hover over a row — the same idea as the drag handle on an Excel row. Using the gripper opens a side pane of row properties, which is where the useful settings live. Insert Row is greyed out if no row is selected — that's the most common "the button doesn't work" moment, and it isn't a bug.
The properties that actually matter
| Setting | What it means, plainly | What to pick first time |
|---|---|---|
| Row type | Number (a human types) or Formula (it calculates). You can switch a row between the two whenever you like. | Number. |
| Insert As | Single Row adds one row here. Templated adds the same row at every level of the hierarchy — add "New product line" once, get it under every region. | Single Row. Templated is the power move once you trust it. |
| Scaling factor | Whether typing "5" means 5, 5 thousand, or 5 million. Defaults to Auto. | Set it explicitly if people will type in thousands. Ambiguity here causes real errors. |
| Include in total | Does this row roll up into its parent? On by default. | Leave on — unless it's a memo line like headcount that shouldn't be added to money. |
| Distribute parent value to children | Type a number at the parent level and it spreads down to the children automatically. | Brilliant for top-down budgeting. Try it once and you'll see why. |
| Default value | What the row starts as: a Static number, or copied from another Row (e.g. "start at last year's actuals"). | Sourcing from last year's row is the single biggest time-saver here. |
| Allow Input | Edit mode = only editors can type. Read mode = viewers can type too. | Read mode is what you want when twenty people submit budgets without editing the sheet's design. |
Tick as you go
You have actuals from the model and budget numbers typed by humans. Now you want Gross margin, Variance, Growth % — rows that are computed from other rows. That's a formula row.
The formula engine is Excel-like: logical and mathematical functions, autocomplete, syntax help, multi-line editing. If you can write an Excel formula you can write these.
The shift: in Excel you reference cells (=B4-B7). Here you reference rows (= Revenue - Cost of sales), and the formula applies across every column automatically. You write it once and it computes for all twelve months. Once that lands, formula rows stop feeling strange.
Do this
select the row below where you want it → Planning → Insert Row → Formula
Tick as you go
In Excel, "what if?" means Save As — Budget v4 PESSIMISTIC FINAL.xlsx, and then nobody can tell which file is real. Scenarios are the fix: alternative versions that live inside the sheet and cannot damage the plan underneath.
Base is your committed plan. It's the reference point everything is measured against.
A scenario is a transparent sheet laid over Base. You scribble on the overlay; Base is untouched underneath. Delete the overlay and nothing is lost.
Two rules people get wrong: every scenario sits on Base, never on another scenario — "Best case" and "Cost cuts" are siblings, not a stack. And simulations never alter Base or the source data, so you genuinely cannot break anything in here.
why you cannot break anything with a scenario
Do this
Model → Scenario → name it → select the series to simulate → Create
"Series" just means which measures this scenario is allowed to move. Pick Sales, and the scenario can flex sales; everything else stays put. Then drag the slider on a cell, or type a value directly. Dependent measures recalculate live — change a leaf value and every parent total and calculated measure above it updates instantly. Hit Save. Add more scenarios with the + at the bottom.
The four buttons worth knowing on day one
| Button | What it does | Why you'll want it |
|---|---|---|
| Compare Scenario | Side-by-side of two scenarios with a Δ column showing the difference. | This is what you actually present. Pick Compare, With, and which measures. |
| Show variance | Shows the gap between scenario and Base inline. Slider settings controls the colours — Increase is good is on by default (up = green). | Turn Increase is good off for cost rows, or your savings will glow red. |
| Distribution | Spread one value across many cells: copy to all rows, copy until the last column, or copy with trend so it follows the existing shape. | Beats typing twelve months by hand. Reset value undoes it. |
| Bulk Edit | Pick a measure, pick row and column dimensions, set a value or a percentage, Apply. | "Cut all European marketing by 8%" in one action. |
Tick as you go
Until now your budget lives inside the Plan item. Useful, but sealed off. Writeback copies those numbers into a real Fabric SQL database table — where a pipeline can read them, a semantic model can model them, and a Power BI report can put budget next to actuals.
Writeback is Save As, into a database table. You choose the database and the table name, and Plan creates and fills the table for you. No DBA, no schema designed in advance — it builds the structure at runtime from your sheet.
Remember Step 2: this is a different database from the one Fabric auto-created for the Plan's metadata. That one holds the definition of your sheet. This one holds your numbers.
Do this — create the destination
Writeback → Add Destination
Choose the shape: Long vs Wide
Writeback → Settings → Writeback Type
| Type | What the table looks like | Pick this when |
|---|---|---|
| Long | One row per measure per combination — key-value pairs. Tall and narrow. Columns like Measure, Value. | Default choice. Add a new measure later and the table shape doesn't change — it just gets more rows. |
| Wide | One column per measure. Short and fat. Looks like the sheet. | You want to eyeball it in SQL, or a downstream tool expects fixed columns. |
| Long with Changes | Long, but only the values that changed. | Big sheets, frequent saves, or you want an audit trail of edits. |
| Wide with Changes | Wide, only changed values. | Same reason, wide shape. |
The other Settings tabs: Data (which measures and dimensions take part), Destinations (where it goes), Advanced (system-level behaviour), General (the core options).
Do it, then check it
Writeback → Writeback → wait for the confirmation → open the database and look at the table
Actually open the destination database and look at the rows. Don't trust the toast message — look at the data. Writeback → Logs shows every run with milestones, payload size and duration; click a writeback ID for the detail. When someone asks "did the budget save?", that log is your answer.
Tick as you go
Every word that made a docs page feel harder than it is, translated into something you'd actually say to a colleague. Bookmark this bit — it's the part you'll come back to.
The words in the product
| They say | They mean |
|---|---|
| Plan (the item) | The workbook. Holds up to 25 sheets. |
| Planning sheet | One budget grid. A pivot table you can type into. |
| Row dimension | What you're planning, down the left. Product, department, account. |
| Column dimension | Nearly always time, across the top. Months, quarters, years. |
| Series | A measure that a scenario is allowed to move. |
| Native measure | A number that comes from the semantic model. Real, stored, simulatable. |
| Calculated measure | A number derived from other numbers. Holds no value of its own, so it can't be simulated directly. |
| Data input row | An empty row a human types into. The whole point of Plan. |
| Formula row | A row that calculates from other rows. Excel formulas, row references. |
| Templated row | The same row repeated at every level of the hierarchy. |
| Row gripper | The little handle on hover. Right-click equivalent for rows. |
| Base | The committed plan. The reference point. |
| Scenario | A what-if overlay on Base. Can't damage Base. |
| Copy to base | Promote a scenario's simulated values into the real plan. |
| Writeback | Save the numbers into a real SQL table. |
| Long / Wide | Tall key-value table / one column per measure. |
| Infobridge | The plumbing: merge, append, pivot, group across sources. Ignore at first. |
| PowerTable | Data-entry table over a database table. Not a budget grid. |
| Intelligence sheet | Reporting and variance analysis inside Plan. |
The words around the product
| They say | They mean |
|---|---|
| EPM / CPM | Budgeting and forecasting. Numbers about the future. |
| Fabric IQ | Microsoft's grouping for the "shared business meaning" layer — semantic models, ontology, graph, agents, and Plan. |
| XMLA endpoint | The back door into a semantic model that external tools use. Plan needs it open. |
| Embed token | The mechanism that renders Power BI content inside another app. Plan renders itself this way. |
| Semantic model | Your Power BI model — tables, relationships, measures. Plan reads it and never writes to it. |
| Shareable cloud connection | A saved "how to reach that model and who to sign in as", created once and shared. |
| DMTS connection | The internal name for that connection. You'll only meet it in an error message. |
| RLS | Row-level security — who is allowed to see which rows. |
| Direct Lake | A semantic model reading Delta files straight from OneLake. Works with Plan, but needs extra connection setup. |
Plan's failures are quiet: empty lists, greyed buttons, blank cells. Almost none of them are bugs. Find your symptom on the left.
| What you see | What's actually wrong | Fix |
|---|---|---|
| Connection dropdown is empty when adding data | No connection of type Power BI Semantic Model exists, or it wasn't shared with you | Step 1. Check the connection type is exactly right, and that it's shared to your account. |
| Sheet loads but every cell is blank | XMLA endpoint off, or capacity doesn't support it | Step 0 — tenant setting and capacity XMLA setting must both be on. |
| Can't create the Plan item at all | You're a Contributor; embed-token items need Member or Admin | Get your workspace role raised. Contributor also can't create or share connections. |
| Everything is greyed out and you're on Power BI Pro | Pro and PPU aren't supported for XMLA + embed-token scenarios | You need an F SKU or P1–P5. No workaround. |
| Insert Row is greyed out | No row is selected | Click a row first. That's genuinely all it is. |
| Create stays greyed in the formula pane | The formula isn't valid yet | Open the Maximized Formula View for the real error message. |
| A plan that worked yesterday won't open | Someone renamed the workspace | Don't rename workspaces containing Plan items. Ever. |
| Plan lost its data source | Someone renamed the semantic model | Same rule. Renaming breaks the connection. |
| Writeback fails with a structure mismatch | You changed dimensions after the table was created | Drop and re-create the destination table, then write back again. |
| Writeback fails on a big sheet | Over 1.2 million cells in one operation | Split across sheets. The cap is per operation. |
| "DMTS connection is deleted or not found" on a PowerTable sheet | The connection was deleted; the recovery screen doesn't appear | Create a new PowerTable sheet using Existing Table and configure the same table again. |
| Users see rows they shouldn't | RLS gaps: PowerTable queries run as the connection's identity, not the user's; Blend (From Sheets) doesn't apply RLS at all | Don't rely on database-level RLS through these paths. And set Bind for cross filter/RLS on inserted rows. |
| Can't insert a data input column | The semantic model contains unsupported Unicode characters | Clean the offending names in the model. |
| Nothing works and you're a guest in this tenant | Entra B2B accounts aren't supported | Use an account native to the tenant. |
| Plan items unavailable across the whole tenant | The tenant or workspace uses private links | Not supported. This one is architectural, not a setting. |
Ceilings worth memorising
| Limit | Number |
|---|---|
| Sheets per Plan item | 25 |
| Visuals per Plan item | 50 |
| Cells per writeback operation | 1.2 million |
| Cells per Infobridge query | 1.2 million (~5 million across five sheets) |
| Rows per bulk data input from Excel/CSV | 1 million |
Reading this page teaches you the vocabulary. Building one tiny plan end to end is what makes it stick — and the small version takes an afternoon, not a quarter. Pick something you genuinely care about but nobody depends on yet: next year's travel budget, headcount for one team, revenue for one product line.
The afternoon project