---
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.
