01 / 07
Sales Dashboard
Consolidates the day's order records into one daily and monthly view, written back into the spreadsheet the team already uses.
- TYPE
- Dashboard
- USE
- Daily and monthly sales reporting
- ROLE
- Design, build, and day-to-day maintenance
- STATUS
- In use, ongoing
- BUILT WITH
- Python, Google Sheets API
- CAPABILITIES
- Automation, Data processing, Reporting

BEFORE
A nightly recap typed by hand from the day's order slips, about half an hour.
AFTER
The same sheet, written by a job instead of typed by a person.
01 / INPUTRaw order records
02 / PROCESSNormalise and aggregate in Python
03 / DECISIONWhich period a row belongs to
04 / OUTPUTThe team's existing sheet, written not typed
Typed → written
Recap
Removed
Manual re-entry
Daily + monthly
Refresh
The problem
Every night closed the same way: someone sat down with the day’s order slips and typed the numbers into a spreadsheet by hand. It took about half an hour, it happened after a full service when nobody is at their sharpest, and the number that came out of it was the number the next day’s decisions were made on. Typos in that recap didn’t announce themselves. They just quietly became the record.
What I built
A Python job that reads the raw order data, normalizes it, and writes a structured daily and monthly view back through the Google Sheets API, into the same spreadsheet the team already trusted, so nothing had to be relearned.
How it works
- Ingest: the day’s records are pulled and parsed into a consistent shape, whatever shape they arrived in.
- Normalize: dates, item names and amounts get canonicalized, because the same item does not always arrive spelled the same way.
- Aggregate: daily totals roll into a monthly view, with the comparison period worked out rather than hand-selected.
- Write back: the Sheets API updates the ranges in place, so existing formulas, references and habits keep working.
Technical approach
The deliberate decision was to write into the team’s spreadsheet rather than build a separate interface. A new dashboard would have been easier to build and harder to adopt: the sheet was already open on someone’s screen every day, already linked to by other documents, already understood. Automating the input to a tool people use beats introducing a tool they have to remember to open.
Writing in place rather than replacing the sheet is what makes that safe. The job updates ranges, so anything built on top of those ranges survives the update.
Current state
In daily use, and maintained as the operation changes: new item names and changed categories land in the normalization step rather than in a person’s head.