Cup Up HQ

the internal platform i built for Cup Up, an Australian marketing agency i’ve been the in-house developer for since 2025.

Timeline
2025 – present
My role
in-house developer: i designed it, built it, and keep adding to it.
Tech stack
Python · FastAPI · PostgreSQL · Supabase · Jinja · Tailwind CSS · REST APIs · OAuth · OpenAI API · Railway

the problem

Cup Up is a marketing agency in Australia, and i’ve been their in-house developer since 2025. their client work produced data in a lot of places: analytics tools, business listings, campaign and influencer results, and monthly reports pulled together from all of those different places. slow, easy to get out of sync, and no single view of how an account was doing.

how i did it

i started with a CRM and an internal dashboard, then grew it into a reporting platform as the team leaned on it. it’s a server-rendered app with an async API underneath: light on the front end, structured where it counts. third-party data comes in through their APIs and OAuth and gets stored as monthly snapshots, so a report is a lookup, not a fresh fetch every time.

what i built

clients and services

client records, brand relationships, service packages, and what each client’s reporting covers.

API connections

analytics, search, and business listing data linked per client through OAuth.

monthly reports

performance reporting built from stored snapshots, with the metrics configured per client.

audits

baseline audits and metric tracking over time, so you can see where a site started and where it is now.

influencer CRM

profiles, social accounts, campaigns, collaborations, and performance per influencer.

AI integrations

OpenAI wired in where the team asked for it, doing the first draft of the repetitive parts. it suggests, the team decides.

how it went

it’s in daily use and still growing; the reporting side is where most of the work goes now. the hard part was the reporting model. every client has a different mix of services, properties, and metrics, and the system had to handle that without every report becoming a custom job. the other hard part was the APIs: each source counts different things, and they all had to land in one monthly format the team could actually use.

i don’t have a number for hours saved, so i won’t invent one. what it replaced was spreadsheets, a pile of browser tabs, and reports stitched together from all of them.