← rooo.pro

Built a management dashboard in a day — putting the business on my phone with Power BI's free license

2026-06-11 / Vol 13 / draft at the time of publishing

In Vol 12 I wrote that the monthly close became a "form" on the second run. This issue is the other work log from the same week: I built a management dashboard in one day (2026-06-10). In the morning there was nothing; by night the business numbers were on my phone.


The motivation: the numbers aren't there when I want to see them

What I wanted was simple: see the business numbers on my phone. The monthly close has become a routine, but its output lives inside the accounting software, and looking at it means sitting down at a PC. When I wonder "how is this month going?" while out and about, there's no answer. And while I'm at it, I also want to log inventory and purchases on the spot. Things I plan to enter "after I get home" mostly evaporate.

One more condition: zero additional cost. I already pay for Microsoft 365, so everything has to fit inside that. No paid BI plan.

What one day produced

I split the system into 4 roles:

RoleToolWhat it does
DataPowerShell scriptsParse the accounting software's (Yayoi) exports directly into CSV, with built-in validation against known values
ViewingPower BI free license + mobile appPublished to My Workspace → 4 pages viewable on the phone
Input12 Microsoft ListsLedgers for inventory, purchases, time logs, expense memos, etc. Created in bulk via REST API
TasksGoogle ToDoOne-off tasks live here. Lists stay pure data ledgers — no task management mixed in

The part I cared about most is the data. The script parses the accounting software's exports straight into CSV, and I baked in validation against known values: a handful of past confirmed figures are embedded in the script, and if the parsed result doesn't match them, the script stops with an error. Every re-run gets checked against "numbers whose answer I already know" — the same safety-net thinking I wrote about in Vol 11, burned directly into the pipeline.

For the input side, I didn't click the 12 Microsoft Lists together in the UI — they were created in bulk via the REST API, with column types, choices, defaults, and required flags all pushed in from code. Building 12 lists by hand would have eaten the whole day on its own.

The model is 100% managed as code

The Power BI model (table definitions, measures, relationships) is stored in TMDL, a text format, and the whole report is saved as a PBIP project. In other words, it's all just text files. About 40 measures, 4 pages (Past / Now / Sales / Future), 29 visuals plus mobile layouts — every bit of it diffable as code.

Build it by stacking mouse clicks in a GUI and you later lose track of what changed and how — and an AI can't help you either. With text, changes can be reviewed, breakage can be rolled back, and collaboration with an AI actually works. That's probably the single biggest reason this fit into one day.

The snags (two of them, honestly)

Snag 1: the PBIP wouldn't even open. Power BI Desktop kept throwing "Method not found" errors and the project wouldn't load. Digging in, the cause wasn't Power BI at all — it was an old library (Newtonsoft.Json) that the PC maker's (Dell) support tool had installed into the system-wide shared area (the GAC). Recent Power BI builds use newer APIs, so when the old copy loads first, they collide. Updating the shared library fixed it. This is the kind of failure a web search almost never surfaces; without an AI to dig through the error with me, I doubt I'd have escaped it within the day.

Snag 2: cloud auto-refresh on the free license. Getting the cloud side to reload data automatically requires a thing called a gateway when the source is local files. The workaround I tried got my parameterized path flagged as a "dynamic data source," which blocks refresh entirely. I could have kept fighting, but instead I settled on a low-tech routine: refresh in Desktop once a month and manually re-publish. Weighing one few-minute manual step per month against rounds of credential trial-and-error, the manual step won. Automation isn't the goal; seeing the numbers is.

"Building out a dashboard" was on my do-not-do list

Let me be honest. This site's operating policy explicitly says: "no building out KPI dashboards." Launch-day me wrote that line to stop myself from escaping into number-fiddling instead of writing. And now I've gone and built one, thoroughly.

I can construct excuses. That rule was a guard against fiddling with dashboards to avoid writing, whereas this is a tool for running the whole business, and so on. But the real story is probably just this: need beat policy. The moment the monthly close became a routine and the numbers started stacking up automatically every month, "no place to look at them" became the biggest bottleneck. A month ago, when I wrote the rule, that wasn't true.

When the situation changes, the policy gets updated. The third of this site's three principles is "the courage to contradict your past self," so the contradiction itself goes into an article — this one.

The lesson: with BI tools, "building" isn't the main event

The biggest surprise of the day was where the time went. Arranging visuals was a small fraction of it. Most of the day went into deciding which files are the canonical source of the numbers, and how to verify them.

Once the canonical source and the pipeline are settled, charts can be swapped around endlessly afterwards. Do it the other way — start from the looks while the data story is fuzzy — and you end up with a dashboard that makes you wonder "wait, is this number even right?" every time you open it.

The payoff of built-in validation is, honestly, mostly psychological: when a number doesn't match, I can say with certainty that something real is off somewhere. The dashboard itself is above suspicion. Removing just one layer of doubt makes the habit of checking the numbers daily far easier to keep.

By night, all 4 pages were showing in the Power BI app on my phone. From idea to production in one day. For a one-person business already paying for Microsoft 365, I suspect this setup is quite reproducible.