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.

