OOH CMS
Campaign management for out-of-home advertising

- Role
- Backend Engineer
- Timeline
- Aug 2025 – Apr 2026
- Context
- Tech Emulsion · client in Australia/NZ
Tech & skills
- NestJS
- TypeScript
- TypeORM
- PostgreSQL
- CQRS
About
A campaign-management system for the out-of-home advertising market across Australia and New Zealand — inventory, bookings, and the pricing that sits underneath them.
The domain was the difficulty. Layered business calculations, a long tail of edge cases, and scenarios that had to stay correct and auditable as campaigns were revised.
What I built
- Worked through the migration of the backend to NestJS, applying enterprise patterns — repository, strategy, factory method, CQRS and observer — to keep the domain logic maintainable as it grew.
- Moved the data layer from Prisma to TypeORM for first-party NestJS support and entity-based design that made those patterns far easier to express.
- Laid the groundwork for a SaaS conversion with database-per-tenant isolation, so multiple agencies could each run the platform independently.
Outcome
Deployed and under active development throughout my time on it, with the multi-tenant architecture in place for the productisation phase.
What I took away
- CQRS, the repository pattern and factory methods were all new to me here. They were genuinely hard to get comfortable with, and became the thing I most enjoyed about the project.
- ORM choice is an architecture decision, not a preference. Prisma was pleasant; TypeORM was the one that made the patterns and the tenancy model expressible.
- Complex business rules need a structure that isolates them, otherwise every edge case is paid for twice — once in the code and once in every future change.