CASE STUDY 03 — TOOLING & PROCESS DESIGN

Reporting
Lifecycle
Management Suite

How I cut a 500-report estate in half — and built the tooling to make sure it never bloated again.

Large UK Retail Group
Solo — Design & Build
Internal Product & Tooling
Flask, Python
01The Problem

500 reports. Nobody knew what half of them were for.

The analytics team was sitting on an estate of around 500 reports — a years-long accumulation of work that had never been systematically reviewed. Some had no active users. Some were near-duplicates with different names. Some measured the same KPIs under different titles, sent to overlapping audiences on overlapping schedules.

For analysts, it meant maintaining reports nobody read. For managers, it meant navigating a cluttered landscape with no clear picture of what existed, who owned it, or whether it was still needed. There was no single place to see the full picture — and no process to keep it clean.

The problem wasn't just the reports. It was that there was no system to manage their lifecycle — creation, ownership, or retirement.

My manager spotted this as a problem worth solving. I was asked to take it on — and given space to define what the solution looked like.

02My Role

From diagnosis to wireframes to working product — solo.

I started by doing the audit myself — pulling usage data and talking to people across the team to understand what was actually being used, what was duplicated, and what could safely go. That investigation surfaced the 53% figure: more than half the estate was obsolete.

Then I proposed a solution with wireframes. Not just a decommissioning exercise — but a suite of two tools to make the entire reporting lifecycle visible and manageable going forward. The team had been thinking about Microsoft PowerApps. I introduced Flask, and made the case for building it properly.

01

Audit

Analysed usage data and interviewed the team to identify unused, duplicate, and redundant reports

02

Wireframe

Designed both portals in Powerpoint — showing how they'd look, how they'd function, and how they'd connect

03

Build

Developed the suite in Flask — a deliberate choice over PowerApps that introduced the team to a more scalable approach

04

Decommission

Retired 250+ obsolete reports. Estate reduced from ~500 to under 250.

03What I Built

Two portals. One system for the full lifecycle.

The suite consisted of two tools, used by both analysts and managers — giving everyone a shared view of the reporting estate for the first time.

PORTAL 01

Report Status Manager

A centralised registry of every report in the estate. For each report: what it covers, who owns it, how long it's been running, and which KPIs it tracks. Analysts and managers could finally see the full picture — and make informed decisions about what to keep, consolidate, or retire.

PORTAL 02

Self-Serve Scheduling Portal

A tool for report creators to schedule automated sends — weekly, monthly, or at any defined frequency — without manual intervention each cycle. Replaced an ad-hoc, request-based process with something repeatable and self-managed.

TECH DECISION

Flask over PowerApps

The team was planning to build this in Microsoft PowerApps. I proposed Flask instead — more flexible, more scalable, and a meaningful capability upgrade for the team. They hadn't used it before. Getting buy-in meant showing it in wireframes first, then delivering the proof in the build.

PROCESS DECISION

Wireframe before build

Before writing a line of code, I designed both portals in Powerpoint — laying out how they'd function and how users would move through them. This got the team aligned on what we were building before any technical work began.

04Impact

Half the reports gone. The rest finally visible.

The immediate result was a cleaner estate — less clutter for analysts maintaining reports, less confusion for managers and users navigating them. But the more durable impact was the system: for the first time, the team had tooling to manage their reporting lifecycle proactively, not reactively.

53% Of the report estate decommissioned — ~250 obsolete reports retired
2 Portals built and shipped — Status Manager and Scheduling Portal
Flask Introduced to the team as a capability — displacing a planned PowerApps build

The team hadn't considered Flask before. Delivering something they could see — first in Powerpoint, then in working code — is what made the case.

05Learnings

What I took away

  • A system problem needs a system solution. Decommissioning 250 reports without building something to manage lifecycle going forward would just have delayed the same problem.
  • Wireframes are a persuasion tool, not just a design tool. Showing Flask as a concept in Powerpoint before writing code was what shifted the team from PowerApps to something better.
  • Talking to people beats pulling data alone. Usage metrics told me reports weren't being opened — conversations told me why, and which ones were worth keeping.
  • Giving people visibility changes behaviour. Once analysts and managers could see the full estate in one place, the decisions about what to cut became obvious — they just needed the surface.