← All projects

Flagship · Commercial warehouse

TheLook — commercial reporting layer

Two source systems reconciled onto one country-month grain, with 35 automated checks deciding what is allowed to reach a dashboard.

DuckDBSQLPythonPower BIReconciliationForecasting
2.42Msource events
35automated checks
674columns catalogued
1command to rebuild
My role
Independent analyst · Sole contributor
Period
2026 · Approximately 1 month
Engagement
Self-directed case study; completed individually

Business objective: Build a commercial reporting layer that answers whether the business will land the number, and prove every figure in it.

My ownership: I completed this project independently from end to end: framed the question, prepared and validated the data, performed the analysis, built the reporting output, and wrote the recommendations and limitations.

A commercial team has to answer one question every month: are we going to land the number, and if not, which market is the problem? Answering it needs two things the transactional data does not contain on its own — a plan to compare against, and confidence that the comparison is like for like.

The plans arrive as regional submissions in five currencies. The transactions arrive as seven files and 2.42 million events. Nothing joins them.

The answer

Two source systems reconciled onto one country-month grain, rebuilt from seven source files by a single command. 35 checks across three gates decide what reaches a dashboard, a reconciliation statement balances at every stage, and a price-volume-mix bridge resolves to the cent. The forecast was held back until it had been audited — the audit found two defects in my own code, and the rebuilt model reaches 8.0% MAPE across 192 rolling-origin folds.

  • A layered warehouse. raw → stg → core → mart, ten SQL modules run in dependency order, rebuilt from the seven source CSVs by a single command. 680,862 sessions rebuilt from raw events; a conformed star schema; net sales, profit and margin defined once in core and never redefined downstream.
  • A second source, harmonised. Regional plan submissions converted at a fixed budget FX rate and mapped onto a committed country master. The source carried 15 spellings for 13 markets — a genuine master-data defect, resolved with a seed file and a gate that catches the sixteenth.
  • Checks that stop a build. 35 checks across three gates, with a stated rule for what blocks and what quarantines and warns. Blocking failures raise QualityGateFailed and the pipeline stops rather than publishing.
  • A reconciliation statement. Not a log — a statement a reviewer can audit without reading any code: 292 plan rows submitted, 5 quarantined, 287 accepted, money tying at every stage, with the expectation printed beside each row.
  • A price-volume-mix bridge. Three-way decomposition across three comparisons, with a residual that must be zero. It is, to the cent.

What the evidence says

What it found.

01

A sign error the dashboard did not show

Belgium's plan variance looked unremarkable on the dashboard. The reconciliation statement caught it, because a statement that has to balance catches things an eye scanning a chart does not.

02

Concentration depends on who you count

Gini of 0.58 across all customers who placed an order. But 17% of them contributed zero net revenue — everything they bought was cancelled or returned. Excluding them: 0.49. I state which population I used, because a concentration figure without one is meaningless.

03

Two defects in my own forecasting code

Seven checks specified before any were run. The backtest scored every model one month ahead and the forecast then ran the winner eight months ahead — and over six folds the two serious candidates split them three-three. A coin flip that happened to land right. Rebuilt to 24 origins × 8 steps = 192 folds; the selected model reaches 8.0% MAPE.

04

Two hypotheses I expected to confirm, rejected

I thought exponentiating a mean of logs would bias Holt-Winters low — measured bias was +0.6%. I thought MAPE's asymmetry might be choosing the model for the wrong reason — four metrics rank them identically. Both are published as rejected. A review that confirms everything it suspected is not a review.

What it looks like

The output, not a description of it.

Plan and Commercial - the page the role is about
Plan and Commercial - the page the role is aboutPlan versus actual by market, the price-volume-mix bridge, and the variance that drives the monthly commercial review. Page 8 of 8.
The executive page
The executive pageEvery figure on it is traceable to the mart that produced it, and the mart to the SQL file and line that builds it.
Price-volume-mix, reconciling to the cent
Price-volume-mix, reconciling to the centA revenue change split three ways — price, volume and mix — with a residual that has to be zero. It is.
The model comparison, after the audit
The model comparison, after the auditScored across all eight steps of the horizon over 24 rolling origins, not one month ahead. The earlier version scored one step and ran eight.
  • The plan is constructed. TheLook ships no budget data, so the planning file is generated from a published deterministic rule. Every number derived from plan-versus-actual inherits that.
  • The forecast MAPE is optimistic. Synthetic growth is far smoother than real demand — no promotional spikes, no stockouts, no competitor doing something in week three.
  • Net margin is flat at 51.8% every month. That is a property of how the dataset was generated, not a commercial finding, and it is named as such wherever margin appears.
  • There is no price variation in the source, so no elasticity work is possible here. That is why the pricing project uses different data.
  • The return-propensity model failed — AUC 0.50, a coin flip. The recommendation is better outcome logging, not a different algorithm. The notebook is still in the repository.