← Lab

Governed BI starter

When a number means different things to different people, meetings turn into arguments about the data. This demo shows the fix: define each number once, report only from those definitions, and check the data before anyone sees it. Everything here is made up.

Loading the demo…

One question, three answers

“What was revenue in June 2025?” Same company, same month, same data. Without a shared definition, each of these is a reasonable answer.

The shared model

Each measure has one plain-language definition, one owner and one piece of SQL. Reports read these, so a change is made in one place and everyone gets it.

The report, built only from certified measures

Showing June 2025. Every figure below is one of the measures above.

Net revenue by month

View the chart as a table

By region

Checks that run before the report refreshes

A report that looks right but is quietly wrong is worse than no report. These tests run on the data first, and a failure stops the refresh.

    How it works

    1. A small, made-up schema. Customers, products, regions and order lines, joined in one shared view so every measure starts from the same rows. It is not based on any real company’s database.
    2. The model is a plain file. Each measure is a name, a definition, an owner and a SQL query. A Python script runs those exact queries on seeded, made-up data and writes the results, so the SQL you can open above is the SQL that produced the numbers.
    3. Checks gate the report. Regions must add up to the company total, no row may be lost in a join, dates must run in order, and every measure must have a value.
    4. The page only reads the results. Plain HTML, CSS and JavaScript. Nothing is calculated in the browser except formatting.

    The same idea carries over to any BI tool. In a real engagement the model points at your system’s actual data, and the definitions are agreed with the people who own each number before anything is built. The source code is public on GitHub.

    Tired of arguing about whose number is right?

    Tell me which figures people disagree on.

    Start a conversation