Imran Munawar
Web ApplicationsIn production2025–2026

Ad Spend Intelligence Platform

Media-expenditure analytics across TV, radio, web, outdoor, press and magazines

My role: Full-stack developer: NestJS API, MySQL data model, React reporting dashboard, deployment.

Ad spend dashboard: year-on-year expenditure by medium, share by media type, and top gainers and losers

In production for a media-monitoring company in Cyprus. Client name shown only with their agreement. Screenshots were taken with the client's permission and show aggregate market figures.

Overview

An analytics product for a media-monitoring company. It turns the company's advertisement monitoring data into reports agencies pay for: top advertisers, new campaigns, gainers, category and media-type analysis, just-aired TV spots with creatives, and public share links for individual reports.

The problem

The company had rich monitoring data but delivered it as spreadsheets. Analysts rebuilt the same reports by hand every month and could not give clients self-serve access.

The solution

A NestJS 10 API with JWT and refresh tokens, Swagger documentation, rate limiting and structured logging sits on the MySQL warehouse. A React dashboard offers dashboard summaries, searchable advertiser reports by month and year, category analytics, TV campaign and just-aired views, ad-creative galleries, and shareable public reports.

Principal features

  • Report library

    Top 100 advertisers, top new advertisers, top gainers, new campaigns, TV campaigns, media-type and category analysis.

  • Ad creatives

    Browse and share the actual creatives behind the spend, with a media proxy for images.

  • Public share links

    Any report or creative set can be shared with a client through an unguessable key, no login required.

  • Fast tables

    Virtualised tables keep tens of thousands of rows smooth; Excel export for the rest.

  • Caching

    Expensive TV-campaign queries use stale-while-revalidate caching with a hard TTL.

  • Role-based access

    Admin and analyst roles with user management.

Technical decisions

  • Read-heavy endpoints are cached at the API layer, so the warehouse is queried once per window instead of once per user.
  • Charts and tables share one query layer (TanStack Query) so filters stay consistent across every report.
  • Playwright and Vitest are wired into the frontend so the reporting flows can be covered as they stabilise.

Screens

Category analytics: year-over-year change per category across TV, radio, outdoor, web, press and magazines
Category analytics: year-over-year change per category across TV, radio, outdoor, web, press and magazines
Ad creatives gallery: searchable TV, radio and print creatives with category, sector and media, and a select-and-share action
Ad creatives gallery: searchable TV, radio and print creatives with category, sector and media, and a select-and-share action

More Web Applications

Web ApplicationsIn production

CYMaps

Billboard inventory, availability and campaign booking on a map, for Cyprus

View project