← All work

Status
In use, under NDA
Work
Product design
Product
Internal data tools

Internal reporting tools

A console that collects performance data from hundreds of partner accounts across dozens of platforms, so the reporting team no longer copies numbers into spreadsheets by hand.

Overview

An estimated 10–20 hours a week back for each person on the reporting team.

Greybox redraw of version one: a table list beside a long column of metric dropdowns, mapped one table at a time
Concept recreation of the redesign: our metrics matched to their column names, with bulk mapping on for all 49 tables
Version one, 2023. Every table mapped by hand. The redesign, 2025. Map one table and the whole account follows.

Both screens are concept recreations with fake data. The real product is under NDA.

  • ClientCanadian marketing-technology company (under NDA)
  • ProductInternal tools for collecting data and building reports
  • My roleThe only designer, working with front end and back end developers. UI and design system, first working builds in Figma Make, data flows, data validation and testing
  • ScopeLead a reporting team of three and support a second team of the same size. The tools serve about 12 people across the company's reporting teams. I scope them with the PMO, two developers, a database administrator and infrastructure, and shape dashboards with commercial leads, managers, marketing and people close to the executive team.
  • TimelineFirst version shipped late 2023. Redesign shipped in 2025, in about two months
  • StatusIn use

The problem

Every report started with someone logging in to every account.

In plain terms: the company works with hundreds of partners. Each one gives us access to an account on their own reporting platform, where we can see numbers like clicks, signups and revenue. Every platform names and lays out those numbers differently, and each partner has a deal that sets how the numbers turn into what they pay.

We filled out performance reports by logging in to every account and entering the data into a spreadsheet by hand. That data was combined and sent as reports to managers, commercial marketing leads and executives, who used it to make finance decisions.

How we worked

I spent a week on site with the developers for an intensive build. I designed the UI and explained how the data flows. I also researched the API documentation for the platforms that provide it and tested the data for accuracy. My team and I have kept that process going as the system has grown.

Version one, late 2023

It had to be built in Streamlit, so I could only use its components. The bigger problem was the workflow: every element of every table had to be mapped by hand.

Greybox redraw of the first version: a table list on the left and a long column of metric dropdowns on the right, mapped one table at a time
Version one, redrawn in greybox with generic labels. Concept recreation. Real product under NDA.

The redesign, 2025

I redesigned the UI and its design system in Figma, then built the first working versions myself in Figma Make. I walked it through the functionality each screen needed, step by step, checked every element it produced and had it go back and fix what wasn't right. I tested the user flow with my team and kept refining with their feedback until we were happy with how it worked. Then we moved the build to Claude Code, where the developers took it to production. It shipped in about two months. The first version took months and was never as good as we needed.

Design decisions

01

Map one table, and the whole account is mapped

Most platforms use a fixed set of headers, so a model recognises their columns automatically, even when the wording varies a little. Bulk mapping is for the platforms that let owners write their own headers and build their own tables.

Copying a mapping from one account to another doesn't work, because no two accounts are set up alike. So the user maps a header's wording once, and the tool applies it to every other table in the account that uses the same wording. The first version shipped without this because there wasn't time to build it; AI made it quick to add in the redesign.

Concept recreation of the mapping screen: our metrics matched to their column names, with bulk mapping switched on for all 49 tables and deal setup in a side panel
Bulk mapping on. Concept recreation. Real product under NDA.
02

One deal setup for many campaigns

Search campaigns by their deal, select them, and apply one deal setup to all of them. Some accounts set deals per table and others per campaign, so the same screen covers both: tick individual campaigns or tables, select everything a search returns, or leave the search empty to set a deal for the whole account.

Concept recreation of the deals screen: campaigns filtered by deal, all selected, with a bar to apply one deal setup to 12 campaigns
Bulk deal edit. Concept recreation. Real product under NDA.
03

A notification centre that keeps data collection running

It flags anything that would stop data coming in: login errors, such as wrong credentials on a platform we read through web scraping instead of an API; a table that changed and needs its columns remapped; a new deal that needs setting up and mapping.

Before, a Slack bot posted each issue and someone had to react to the message to mark it done, so there was never a clear view of what was still open. Now each notification takes you straight to the account setup or mapping screen where the fix happens, and clears itself once it's fixed, ignored or dismissed.

Concept recreation of the notification centre: open login, mapping and new deal issues, filtered by type, each with a link to the screen where it's fixed
The notification centre. Concept recreation. Real product under NDA.
04

Built for platforms that don't agree

Some platforms let account owners rename and move any column, so the only reliable way to match their columns to our metrics is for a person to assign them.

Some give total revenue but no commission column, so you have to calculate it yourself. Deals can vary within the same platform, and sales sometimes structure a deal differently from how it appears in the platform. That's why deal setup has to be fully flexible.

Some platforms limit how many calls you can make, so the daily loader pulls data at a custom rate for each one.

We did try fixing things at the source, by getting some platforms to switch on API access and asking account owners to change how their accounts are set up. But the accounts belong to our partners, not to us, so we rarely get a say in how a platform works. The tools had to handle the variety instead.

Three platforms, one set of metrics
Platform A→Columns renamed and moved→A person maps it→Clicks
Platform B→No commission column→Deal setup calculates it→Commission
Platform C→Call limits→Loader pulls at its own rate→Daily data
Illustration with generic platform names.
05

Check it against the old reports

We ran the new reports alongside the old ones on historical data and compared them line by line. The data was only released for company use once accuracy passed an agreed threshold and was approved. My team and I signed off.

Checking didn't stop at launch. The team rotates through accounts and checks the data routinely, and each round comes back more accurate: the notification centre catches the big issues, and most small gaps now come from the platforms rather than our side. Next, I'd flag unusual numbers automatically, so the team can check data after the fact instead of checking everything up front.

Old report and new report, side by side
MetricSpreadsheetConsole
Clicks48,21048,210Match
Signups3,9043,904Match
Revenue61,775.4061,775.40Match
Commission18,532.6218,540.12Check the deal setup
Illustration with made-up numbers. A mismatch sends you back to the mapping or the deal before the switch.

Outcome

  • Time

    An estimated 10–20 hours a week saved

    For each person on the reporting team, because nobody logs in to sources and pastes data into spreadsheets any more.

  • Quality

    Fewer errors and manual fixes, and faster reports

    We know from our QA. Human error used to be common; now the automation collects the data and a person who understands it checks it. It also takes fewer people to run.

  • Upkeep

    Bugs get caught and fixed faster

    Thanks to the notification centre and the shorter build cycle. Most changes now are small improvements the team asks for.

  • Team

    My team moved from data entry to QA

    As the tools took over collecting the data, I moved my team from manual data entry to quality assurance. I got them SQL training so they could query the database and check the data themselves.

Reflection

Looking back

Documenting as we went paid off

We kept notes on every platform the whole way: logins that fail on platforms we read by web scraping, owners who rename their columns, deals that sales set up differently from how the platform shows them. That record is what let us redesign quickly instead of relearning each platform.

Map the whole flow before the screens

Version one's real problem wasn't the screens. It was that every table had to be set up by hand. Mapping the full setup flow earlier, with the developers, would have brought bulk mapping and bulk deal edits into the first version.

Keep the build loop short

The first version took months. The redesign shipped in about two months, and problems now get fixed faster. Most of what we add now are small improvements the team asks for.