Power BI · built with Claude Opus 5.5

SenMinh group report — Power BI, built with Claude

A decision-led Power BI report for a fictional group of seven international schools, on 100% synthetic data — built as code with Claude Code, and checked by script and by eye before every merge.

Access is by invitation. If Power BI asks you to sign in, ask me for access.

Client
SenMinh Education Group (fictional)
Data
100% synthetic, rebuilt from a fixed seed
Built with
Claude Code on Claude Opus 5.5
Scope
7 schools · 2 clusters · 3 school years
How the SenMinh Power BI report was built and verified I write the brief: the decision questions, the eight business scenarios and the KPI tree. Claude Code, on Claude Opus 5.5, writes the Python that generates three artefacts as code: the synthetic data, the semantic model in TMDL with 194 measures, and the report in PBIR with twelve pages. Four automated checks run on the output: data checks with zero failures, the PBIR JSON schema, a model load through the Tabular Object Model, and WCAG AA contrast. The report is then rendered in Power BI Desktop and I review the screenshots before a pull request is merged. A failed check or a review comment goes back to Claude Code; nothing merges until both pass. Brief · mine Decision questions Scenarios · KPI tree Generate Claude Code on Claude Opus 5.5 Artefacts as code Synthetic data Python · seed 42 Semantic model TMDL · 194 measures Report PBIR · 12 pages Automated checks Data checks · 0 fail PBIR JSON schema Model loads (TOM) Contrast · WCAG AA Review · mine Render in Desktop Screenshots reviewed Pull request Merge to main A failed check or a review comment goes back to Claude Code — nothing merges until both pass
The loop every change went through. Claude Code writes the code; the checks and I decide whether it merges. A failed check or a review comment goes back round, and nothing reaches main on a red check.

What this is, plainly

SenMinh Education Group does not exist. It is a fictional group of seven international schools — four in Vietnam, three in the UAE and Qatar — that I invented so I could build a report the way I would for a client, without exposing anyone's data. Every student, teacher, school and dollar in it is synthetic, produced by a Python script with a fixed seed, so the whole dataset can be rebuilt identically.

It is here for two reasons. It shows what a decision-led Power BI report looks like when every page can be shown in full, which in-house work never can. And it tests a question worth answering with evidence rather than opinion: can an AI coding assistant produce a report that holds up to enterprise standards, and what does it take to make it?

Built around decisions, not tables

The first version was organised the way most reports are: one page per group of tables. Every page was accurate and none of them answered anything. The rebuild starts from the decisions instead — ten pages in three tiers, strategic, diagnostic and action, each printing its business question at the top: Is the group healthy, and what needs attention right now? Is growth turning into profit and cash? Which students need an intervention before next year?

  • Visual titles state the conclusion, not the metric: "Riverside is full, Sunrise is not" rather than "Enrolment by school".
  • No number stands alone. Every KPI tile shows its change against the prior year and against target, driven by one calculation group instead of three copies of every measure.
  • Three clicks or fewer from the group view to an action: right-click any school to drill through to its School Profile or its Student Watchlist.
  • One semantic model for every audience — board, CFO, cluster directors, principals — with dynamic row-level security deciding who sees which schools.
  • Red is reserved for exceptions. Colour carries status, never decoration, and every text and background pair is checked for WCAG AA contrast.

What the report surfaces

Eight business stories were planted in the data on purpose, and the answer key was written before the report was built. The test of the report is whether it surfaces them without being led there. Because the stories were planted, that shows the report can surface a known answer — not that it would find an unknown one. On real data, the second part is what agreeing definitions and measuring a baseline are for.

Some of what it shows for the 2025–26 school year — every figure synthetic:

  • The headline: revenue grew 9.2% to $68.8M, but operating margin slipped 0.6 points to 13.4%. Growth is not yet turning into profit.
  • Riverside is 100% full. 130 qualified families were turned away for lack of seats — about $3M of revenue forgone in a year. Expansion money belongs there.
  • Sunrise expanded and did not fill: 77.9% utilisation and a 6.6% operating margin against a 22% plan, with part of its enrolment bought through promotions.
  • Gulf Academy shows the domino effect. Staff satisfaction of 3.00 came before 40.8% staff turnover; the next year NPS fell from 40 to 7 and retention to 85.5%. Staff satisfaction was the early warning.
  • Green Valley collects 90.5% of what it bills, the weakest in the group — a credit-control problem before it is a pricing one.

How Claude built it

Nothing in the report was built by dragging visuals onto a canvas. Claude Code, running on Claude Opus 5.5, wrote Python that generates the whole project as text files Power BI reads directly: the semantic model as TMDL and the report as PBIR. Rebuilding the report is a script run, and every change is a reviewable diff in Git.

  • Data: a scenario-driven generator in which tables are linked by cause and effect — staff satisfaction drives turnover, turnover drives teaching quality, teaching quality drives parent satisfaction and retention. A validator reconciles the tables against each other and checks every planted story, and must report zero failures before new data is committed.
  • Semantic model: 35 tables, 44 relationships on surrogate keys, 194 measures in display folders, a Time Comparison calculation group, and dynamic row-level security at group, cluster and school level.
  • Report: 10 pages plus 2 tooltip pages on the EthanCorp design system, with Lucide icons, a Reset filters bookmark and alt text on every visual.
  • Verification: the PBIR is validated against Microsoft's published JSON schema, the model is loaded through the Tabular Object Model, contrast is computed for every text and background pair, and Power BI Desktop is opened, refreshed and captured page by page for review.
  • Process: feature branches and pull requests, 37 commits between 21 August and 7 October 2026. The traps met along the way are packaged as a reusable skill, so the next report starts with them already known.

What I decided, what Claude did

I set the decision questions, the eight scenarios, the KPI tree and the design system, and reviewed every page. Claude Code, on Claude Opus 5.5, wrote the data generator, the DAX, the TMDL and PBIR generators and the verification tools, and rendered and screenshotted each page for my review.

That split is the point. The assistant is fast and thorough at the code; it does not know which question a CFO needs answered on Monday. A report built by an assistant with no brief is a tidy report about the wrong thing. And PBIR has traps that a model walks straight into — an integer property that needs an L suffix, a tooltip that silently inherits the page's year filter. Each one met on this project is now written down, and the checks exist so the next one is caught before a reader finds it.

Constraints

  • Synthetic data is cleaner than real data. There are no late corrections, no duplicate students across systems, no source that changes its export format overnight. That is where real projects spend their time, and this one does not exercise it.
  • The report has not yet been tested with viewers who did not know the planted answers. Until it has, the claim is that the answers can be found, not that people find them.
  • Row-level security was tested by impersonating roles in Power BI Desktop, not with real accounts in the Power BI Service.
  • The published copy on the Power BI Service opens only for people I have given access to.
  • Driving the model through Microsoft's Power BI modelling MCP server needs an interactive sign-in, so unattended runs fall back to writing TMDL directly.

Inside the report

Every page, as rendered.

Captured in Power BI Desktop for the 2025–26 school year, all clusters. Every name and number is synthetic. Select an image to open it at full size.

Report cover on the brand gradient: 'Group performance report' for SenMinh Education Group, marked as a fictional client with 100% synthetic data, with nine page tiles, each showing its business question.
The cover. Nine pages, each named by the question it answers, with the client and the data status stated on the first screen.
Group Pulse page: a headline callout on revenue and margin, six KPI tiles with change against prior year and target, a colour-coded school league table, the KPIs furthest behind plan, and four tiles looking ahead to 2026–27.
Group Pulse, for the CEO and board. The headline is a sentence, not a chart: revenue up 9.2%, margin down 0.6 points. The league table colours each school against its own plan.
Growth and Admissions page: enrolment bridge, enrolled and empty seats by school, admissions funnel, a channel economics table, reasons applications were lost, the 2026–27 intake forecast and a callout on families turned away.
Growth and Admissions. "Riverside is full, Sunrise is not" is the visual's title because it is the conclusion. Referrals convert at 33% with no media spend.
Retention and Student Outcomes page: retention against target by school, exit reasons by cluster, an exit-rate heatmap by school and grade, attendance before leaving, exit rate by attendance band and by club membership, and leading indicators.
Retention. Relocation explains 68.4% of leavers in the Middle East cluster, and attendance falls in the weeks before a student leaves — an early warning a school can act on.
Financial Health page: a P&L waterfall from revenue to operating profit, a revenue bridge against last year, unit economics by school, revenue against plan, growth against margin, discounts by school and payment timeliness.
Financial Health, for the CFO. Where each revenue dollar goes, what changed since last year, and which school relies on promotions to grow.
People and Teaching Quality page: the domino-effect table for Gulf Academy over three years, staff satisfaction against turnover by school, turnover by contract type, reasons staff leave, career moves and the cost of turnover.
People. The domino table follows one school from staff satisfaction to turnover, teaching quality, parents, retention and margin, year by year.
School Profile drillthrough for Gulf Academy, 2025–26: a written summary, six KPI tiles, every KPI against plan, a three-year trend, reasons students left and the admissions funnel.
School Profile, reached by right-clicking any school. One school on one page, opening with a written summary of its strongest result and its biggest gap.
Student Watchlist drillthrough marked 'Restricted · personal data': students by risk band, a back-test of exit rate by risk band, and high-risk students listed with the reasons each was flagged. Every name is generated.
Student Watchlist, for principals. Every name here was generated by the Faker library; no real student appears. The "Restricted · personal data" marking shows how the page would be handled on real data.
Campaign and Channel Detail page: a campaign table with budget, spend, leads, cost per lead and acquisition cost, the monthly admissions calendar, cost per lead by paid channel, and paid leads with no campaign attribution.
Campaigns. Spend against budget per campaign, the October–March admissions peak, and the 299 paid-channel leads that could not be attributed to a campaign — stated rather than hidden.

Outcome

The measured result.

10 + 2 report pages and tooltip pages
194 DAX measures, each defined once
35 tables in one semantic model
44 relationships on surrogate keys
8 planted business stories surfaced
24/24 text and background pairs pass WCAG AA

Lessons

What I would tell the next team.

  • Start from the decision, not the data. The first version of this report had every table and answered nothing; the rebuild has fewer visuals, and every one of them has a conclusion for a title.
  • Report as code is what makes an assistant useful in Power BI. A text file is something an assistant can write, a script can check and a reviewer can diff. A canvas is none of those.
  • Automate the checks you would otherwise take on trust. The schema, the model load and the contrast check catch what a confident model gets wrong; the screenshot review catches what no script can, which is whether the page makes sense.
Dat Tran, founder of EthanCorp

Dat TranEnterprise Data & AI Analytics Architect — the person behind EthanCorp.

All case studies

Questions

Common questions about the SenMinh report.

Is this real client data?

No. SenMinh Education Group is fictional, and every name and number in the report is synthetic, generated by a script with a fixed seed. The report's own footer says so on every page.

Can I open the report?

It is published on the Power BI Service, and access is by invitation. If you would like to explore it, ask through the contact page and I will share it with you.

Could EthanCorp build this on our data?

Yes — that is the service this demonstrates. On real data the work usually starts with a fixed-scope review such as the KPI Definition Audit, because agreeing definitions and mapping sources is where real projects spend their time, and where synthetic data cannot help.

Does using Claude mean our data goes to an AI provider?

In this project the assistant only ever saw synthetic data. On a client project, what an assistant is allowed to see is your decision, made before any work starts — and building against schemas and sample data, without the assistant reading production records, is one option.

Have a data, analytics or automation problem that should not need another workaround?

Tell me what is breaking and what you have already tried. If EthanCorp is not the right fit, I will say so and point you somewhere better.

Response time
Within two business days
Based in
Ho Chi Minh City, Vietnam — working across Asia and remote