Platform case study · AdTech · DOOH

Smart ads. Real impact.

HadsUp owns and operates its own network of AI-integrated digital screens — and the platform behind them. Edge cameras measure who actually looked, a spatial search turns that into buyable inventory, and an automated nightly run settles every partner. One Laravel API serves sixteen rolesacross web, admin console and mobile apps.

Sector · Digital Out-of-Home advertisingType · Multi-sided AdTech marketplaceMarket · London · Birmingham · Edinburgh · LeedsStack · Laravel 10 · MySQL Spatial · BigQuery
16
User roles sharing one financial and inventory truth
1
OAuth2 API behind every web, admin and mobile client
9
Scheduled jobs running the platform unattended
0
Manual reconciliations at month end
01Executive Summary

A media buy, rebuilt as a measurable marketplace

Traditional out-of-home advertising is opaque, slow to book and disconnected from audience insight. Advertisers pick screens from estimated footfall. Landlords have no self-serve way to earn from a wall. Franchise partners, agents and investors all need different tools — and every one of them needs to trust the same numbers.

HadsUp attacks all of it from one platform. It owns the screens, so it can put cameras on them and sell verified attention rather than estimates. It exposes that inventory through a geo-intelligent search — city, venue type, age band, ethnicity, footfall, impressions — so a brand goes from “I want to advertise in Leeds” to a paid, scheduled campaign in one flow. And it settles the money automatically: a nightly settlement run credits landlords, franchises, sales, agents, investors, brokers and sponsors out of every campaign charge.

The core mandate: make DOOH self-serve and measurable end to end — verified audience data at the point of purchase, the campaign lifecycle automated from draft to archive, and multi-party earnings distributed without a single manual reconciliation.
02The Challenge

Four problems that had to be solved at once

Any one of these is a product on its own. Together they’re the reason DOOH still gets bought over email.

📊

Limited audience intelligence

Legacy DOOH networks offer estimated footfall — not verified demographics, attention time or emotional response from real viewers standing at the screen.

🔗

Fragmented stakeholder models

Advertisers, landlords, sales teams, franchise operators, investors and brokers each need different tools — but must share one financial and inventory truth.

🗺️

Complex geo-targeting

Buyers need to search by city, venue type, ethnicity, age band, footfall and impressions — then book specific screens and date ranges in seconds, not days.

💰

Unfair revenue distribution

Without automated settlement, multi-party earnings become manual, error-prone and — fatally for a partner network — untrustworthy.

The decision that unlocked the rest: own the network. Operating its own screens is what let HadsUp put cameras on them — and verified audience data is what turns every other feature, from search filters to ROI calculators to post-campaign reports, from a claim into a measurement.
03The AI Layer

The screen measures who actually looked

AI here isn’t a label on a landing page — it’s a pipeline with a cron schedule. Edge cameras on HadsUp screens capture audience signals, those land in Google BigQuery, a nightly job syncs them into the platform, and they surface in the three places that matter: search filters, campaign dashboards and post-campaign reports.

Step 01

Capture

Edge AI cameras on the screens read face and body signals.

Step 02

Store

Face and body data lands in Google BigQuery.

Step 03

Sync

Nightly analytics jobs pull it into the platform.

Step 04

Visualise

Precomputed pie and spline chart tables per device.

Step 05

Act

Targeting filters, calculators and ROI reporting.

Face analytics

  • Gender detection — male / female distribution
  • Age band segmentation, 11–20 through 71+
  • Gender × age cross-tabulation for precision targeting
  • Average age and attention time per device
  • Smile / viewing sentiment mapped to reaction categories

Body & footfall analytics

  • Total impact — people count as a footfall proxy
  • Dwell time — how long audiences stay near the screen
  • Estimated impressions normalised from body + face data
  • Six-month rolling averages used for search ranking
  • Yesterday’s impression values printed on ad-spot cards

Live health monitoring

Scheduled jobs check real-time people counts. Low-traffic screens raise Slack and in-app alerts — escalated when a paid campaign is running on them.

Audience calculator

Advertisers model budget, reach and investment return against real impression databefore committing spend — the same numbers that later appear in the report.

04Advertiser Journey

“I want to advertise in Leeds” to a live campaign

The public website and the logged-in product run on the same backend, so discovery flows straight into booking without re-entering anything.

Step 01

Discover ad spots

A hero search — “I want to advertise in…” — plus a campaign date picker. UK city cards for London, Birmingham, Edinburgh and Leeds show live inventory counts, and map or list views expose each screen with pricing and AI-enriched metrics.

Step 02

Filter by intelligence

Footfall ranges, age demographics, ethnicity, venue category, impression bands and geo radius or bounding box. Google Places autocomplete merges with internal device search, so a place name and a screen both resolve through the same box.

Step 03

Create & configure

Campaigns start as DRAFT. Creative uploads to S3 through pre-signed URLs; the buyer picks devices, dates and time slots while pricing applies discounts, VAT and slot multipliers automatically.

Step 04

Publish & pay

Publishing places a payment hold; operator approval moves the campaign to SCHEDULED. Daily jobs then activate, charge and complete it. Wallet top-ups run through Stripe, PayPal or Wise.

Step 05

Measure performance

Campaign charts report impressions, dwell and attention totals; device-level demographics carry the ROI conversation. This is where the loop closes — the camera that measured the audience is the same source that justifies the next buy.

05The Architecture

One API, five layers, sixteen role-shaped front doors

Every client — advertiser website, admin console, landlord app, franchise dashboard, investor and broker apps — authenticates through Laravel Passport, with scopes separating API, backend and franchise routes. There is one campaign engine and one balance engine underneath all of them.

Clients Web + mobile
Advertiser websitepublic discovery + bookingAdmin consoleAngular · full operationsBrand / agency appiOS + AndroidLocation owner appvenues, devices, withdrawalsFranchise dashboardmulti-location networksInvestor / broker appsportfolio and referrals
API layer Laravel 10 · REST
Passport OAuth2JWT, scoped per surfaceRole permissions16 roles, one policy layerAPI resourcesresponses shaped per clientRepository patterntestable data access
Core services Domain engines
Campaign enginedraft → scheduled → charged → archivedSpatial searchMySQL Point, radius + bboxTransaction & balance enginehold, earned, withdrawableCMS playlist publisherpushes creative to screensAnalytics pipelineBigQuery → chart tablesNotification hubpush, email, Slack
Integrations Third party
Google BigQuerythe AI data warehouseGoogle Placeslocation autocompleteAWS S3pre-signed creative uploadsStripe · PayPal · Wisetop-ups and withdrawalsHivestack · Framenprogrammatic supplyFirebasepush notificationsSlackoperational alerts
Data Storage
MySQL + spatialdevices as geographic pointsRediscache and queuesChart tablespie + spline, precomputedS3 media CDNcampaign creative delivery
Why precomputed chart tables: a buyer filtering a map should never wait on a warehouse query. Nightly jobs aggregate six months of face and body data into pie and spline tables, so search ranking and dashboards read cheap local rows while BigQuery stays the system of record.
06Partner Settlement

Every campaign charge settles itself

This is the part a partner network lives or dies on. Each party’s entitlement is encoded in the user model, and a job at 05:00 settles every role — no spreadsheet, no month-end reconciliation, no trust exercise.

One charge settles in a fixed order
Deterministic sequence — the same every night
01 · Campaign chargedadvertiser wallet debited
02 · Acquisition creditedsales and advertiser agent
03 · Host creditedlocation owner, then location agent
04 · Operator creditedfranchise for the network
05 · Capital creditedinvestor and sponsor on funded devices
06 · Referral chain creditedbroker tiers
07 · Balances updatedhold → earned → withdrawable
Order is what makes it deterministic. Each step reads the balance the previous step left behind, so the same charge produces the same result whether it settles tonight or is re-run next week — which is exactly why it can run unattended at 05:00 with nobody checking it.Commercial terms are configuration, and deliberately not published here.

Sixteen roles, one system of record

Separate apps and dashboards per role — but a single financial and inventory truth underneath.

RolePrimary surfaceKey capabilityEarns
Brand / agencyAdvertiser web + mobileCreate campaigns, pay, view AI analytics
Location ownerLandlord appRegister venues, manage devices, withdraw earnings
FranchiseFranchise dashboardOperate multi-location networks, manage landlords
SalesSales dashboardOnboard advertisers, track pipeline
InvestorInvestor appFund devices, track portfolio returns
Advertiser agentAgent toolsManage campaigns on behalf of brands
Location agentAgent toolsManage locations for owners
Broker / BB / ABBroker appsRecruit investors or advertisers
SponsorSponsor portalSponsored device campaigns
Admin / operatorAdmin consoleFull ops — locations, campaigns, users, reports
What the automation bought: balances split into hold, earned and withdrawable; cashback listeners fire on transactions; invoices and PDF or Excel reports generate on demand; withdrawals run through Wise and PayPal workflows. A partner can check their own numbers instead of asking for them.
07Automated Operations

The platform runs itself overnight

A distributed screen network can’t depend on someone remembering to bill it. Nine scheduled jobs move every campaign through its lifecycle, pull the AI data, distribute earnings and watch the cameras — most of it before anyone is awake.

A day in the schedulerEvery job idempotent and independently re-runnable
Campaign lifecycle AI & analytics sync Earnings distributionPlus every minute — Hivestack / Framen play confirmation

Campaign lifecycle

  • 00:10 — activate scheduled campaigns
  • 00:20 — charge active campaigns for yesterday
  • 00:25 — complete expired campaigns
  • 00:30 — archive completed campaigns
  • 05:00 — distribute earnings to all roles

AI & analytics

  • 00:15 — pull BigQuery face and body data
  • 01:00 — aggregate six-month chart statistics
  • 12:30 — monitor live camera health
  • Every minute — Hivestack / Framen play confirmation

Content delivery

  • S3 pre-signed uploads for campaign creative
  • CMS playlist publishing out to device screens
  • VAST video ad support
  • Campaign preview rendering for floor displays

Financial automation

  • Role-based balances — hold, earned, withdrawable
  • Automated cashback listeners on transactions
  • Invoices plus PDF and Excel financial reports
  • Wise and PayPal withdrawal workflows
08Technology

Built for scale, security and geographic intelligence

Deliberately boring where it should be — a well-understood Laravel core — and specific where the product demands it: spatial SQL for inventory, a warehouse for audience data, three payment rails for partners in different countries.

Laravel 10PHP 8.1+Laravel PassportMySQL SpatialRedisGoogle BigQueryGoogle Places APIAWS S3StripePayPalWiseFirebaseHivestackFramenVAST video adsDomPDFMaatwebsite ExcelSlack notificationsAngular (admin)iOS + Android apps
09Where It Landed

DOOH as a measurable, self-serve marketplace

Not a media buy with a spreadsheet attached — a platform where the audience data, the booking flow and the money all reference each other.

Data-driven ad buying

Advertisers choose screens on real measurements rather than estimates. Demographics, impressions and sentiment feed the search, the calculator and the post-campaign report alike.

One source · camera → BigQuery → filter → report
Fair partner economics

A transparent nightly settlement credits sales, franchise, landlords, agents, investors and sponsors without manual reconciliation — and every party can audit their own balance.

Runs at 05:00 · entitlements in the user model
Operational scale

One API supports web, admin and mobile clients while cron-driven billing and CMS publishing keep thousands of screen slots manageable by a small team.

9 scheduled jobs · 16 roles · 1 backend
Geo-intelligent inventory

Spatial queries, Google Places, venue metadata and UK city rollups make “find your ad spots” a working product surface rather than landing-page copy.

MySQL Point · radius and bounding-box search
Programmatic ready

Direct self-serve campaigns and programmatic supply through Hivestack and Framen coexist, with play confirmation providing delivery proof on both paths.

Play confirmation polled every minute
Enterprise-grade platform

OAuth2 with scoped access, role permissions across sixteen roles, audit-friendly transactions and exportable financial reporting support both growth and compliance.

Passport scopes · PDF and Excel exports
The strategic outcome: HadsUp can sell attention it has actually measured, onboard partners who can verify their own earnings, and grow the screen network without growing the ops team in proportion. Owning the hardware is what made the data possible; automating the money is what makes the network worth joining.

Idea in your head? Let’s
bring it to life.

Got a project? A wild idea? Or just want to say hey?
We're here for all of it — reach out anytime.

I’m looking for a help with:

I’m hoping to stay around of (in USD):