Data platform · Finance · 2026 · in production

Portfolio reporting

Around 40 sites, one P&L that tells the truth.

A live financial reporting platform for a portfolio of around 40 operating sites: an Azure SQL dimensional model, scheduled pipelines and Power BI. I own it. The interesting part is what production data does when nobody is looking.

PROPERTYINCOMEGP%
Property 07482,11031.3%
Property 12356,88030.8%
Property 19401,22099.7% 14.3%
Property 23275,64031.4%
anonymised · demo figures
~40
sites reporting their P&L on it
8,112
wage rows re-attributed, same day
10h → 2m
extract redesigned, runs daily
$0.00
variance across three site-weeks

What is worth knowing

01

The 99.7% gross margin

Eight actively invoicing sites were reporting near-100% gross margins. The cause was upstream: payroll feeds that had died independently, and a key-resolution fallback that quietly parked wages against retired sites. Traced through Azure Data Factory and fixed the same day, with every row count matching the prediction. One site moved from a fake ~100% to a real 14.3%.

02

Knowing what not to fix

A 10,793-row unmapped location was deliberately left untouched pending human confirmation. A wrong relink at that scale would be worse than the bug.

03

The report is a by-product

A ten-hour extract was redesigned to about two minutes and now runs on a schedule. Nobody builds the weekly report any more; it is what the pipeline leaves behind.

Client and property names withheld. The numbers are real.

Next case studyThe Second BrainA company's context in one place, and an agent that earns what it may do.
Contact

Say hello. I'm happy at Project2100, so this isn't a job hunt. But if you're building something interesting, I'd like to hear about it.

josh.botha@outlook.com · I read every email

botha.solutions/work/reporting.md
---
title: "Portfolio reporting · Josh Botha"
description: "Around 40 sites, one P&L that tells the truth. A live financial reporting platform for a portfolio of around 40 operating sites: an Azure SQL dimensional model, scheduled pipelines and Power BI. I own it. The interesting part is what production data does when nobody is looking."
url: https://www.botha.solutions/work/reporting
updated: 2026-10-05
generated: true
---

> Markdown twin of https://www.botha.solutions/work/reporting
>
> Built from the same data as the page at build time, so the facts match. Navigation, animation and the island's visuals are left out.

# Portfolio reporting

Data platform · Finance · 2026 · in production

**Around 40 sites, one P&L that tells the truth.**

A live financial reporting platform for a portfolio of around 40 operating sites: an Azure SQL dimensional model, scheduled pipelines and Power BI. I own it. The interesting part is what production data does when nobody is looking.

- ~40: sites reporting their P&L on it
- 8,112: wage rows re-attributed, same day
- 10h → 2m: extract redesigned, runs daily
- $0.00: variance across three site-weeks

Stack: Azure SQL, Azure Data Factory, Power BI, Stored procedures, Python

**The 99.7% gross margin.** Eight actively invoicing sites were reporting near-100% gross margins. The cause was upstream: payroll feeds that had died independently, and a key-resolution fallback that quietly parked wages against retired sites. Traced through Azure Data Factory and fixed the same day, with every row count matching the prediction. One site moved from a fake ~100% to a real 14.3%.

**Knowing what not to fix.** A 10,793-row unmapped location was deliberately left untouched pending human confirmation. A wrong relink at that scale would be worse than the bug.

**The report is a by-product.** A ten-hour extract was redesigned to about two minutes and now runs on a schedule. Nobody builds the weekly report any more; it is what the pipeline leaves behind.

_Client and property names withheld. The numbers are real._

Case study: https://www.botha.solutions/work/reporting

## For agents

```json
{
  "contact": {
    "type": "email",
    "address": "josh.botha@outlook.com",
    "note": "Josh is happy at Project2100 and not job hunting, but reads every email"
  },
  "profiles": {
    "linkedin": "https://www.linkedin.com/in/josh-botha-88139b368",
    "github": "https://github.com/josh-botha"
  },
  "cv": "https://www.botha.solutions/about",
  "play": {
    "url": "https://www.botha.solutions/play",
    "note": "the same content as a walkable three.js island; needs WebGL"
  },
  "index": "https://www.botha.solutions/llms.txt"
}
```

## Limits

The same caveats close every page, so a quote lifted from one keeps them.

- **Product sketches on this site use demo data** and say so where they appear. The headline numbers in case studies (for example 8,112 wage rows, ~40 sites, TestFlight build 43) are real production figures; client and property names are withheld.
- **Website images are captures** of the live sites taken on 4 Oct 2026, not live frames.
- **Pip is scripted.** The site's guide is a keyword router with no model behind it and makes no network calls.
- **Model status means exactly what it says.** "Ships in production" and "Daily driver" describe work Josh has shipped; "Know where it fits" means he knows the model's strengths, not that he has deployed it.
- The Second Brain is partly built: three of seventeen increments are shipped; the rest is design and is labelled as design.
- The site carries no testimonials, client logos, pricing or certifications beyond the courses listed on the CV.