Context
The challenge
Publisher monetization is rarely single-format. The same site or player may need display banners, high-impact placements, owned video inventory, header-bidding competition, house-ad fallback, and externally trafficked VAST tags for SSPs such as Google Ad Manager, Aniview, SpringServe, and Publica. Without a unified platform, ops teams juggle separate tools for demand setup, video tags, SSP wrappers, tracking pixels, and partial reporting portals—creating operational blindness when fills fail. Ad decisioning must also stay extremely fast: live relational joins at request time raise latency and collapse fill quality under traffic. The client needed Admin MariaDB as the system of record for configuration, millisecond serving against a hot cache, partner-aware macro dialects, and trustworthy funnel measurement for owned players and trafficked-out Global VAST inventory.
How we worked
Our approach
We structured the platform as four connected planes with one commercial language: a MariaDB-backed control plane for demand and supply administration; a speed plane (ad-cache) that fans configuration into Aerospike via RabbitMQ; a serving plane of lean Netty video, display, and house-ad servers plus an owned browser video player; and a measurement plane of Kafka consumers, ClickHouse warehouses, and report APIs. This separation lets ops configure rich campaigns while ad calls decide in milliseconds and analytics catch up asynchronously.
Delivery
The solution
The platform delivers full monetization coverage: JSON /ads/req lifecycle for player integrations, VAST 3.0 via /vast3/c (session-centric player path) and /vast3/g (Global/SSP path), event tracking through /vast3/event, header bidding with sellers.json/schain and ads.txt, house-ad fallback, and dialect-aware macros for IAB, GAM %%TOKEN%%, SpringServe {{TOKEN}}, Aniview, Publica, and platform-specific macro slots. Serving intelligence includes geo (MaxMind GeoIP2), device/OS/domain targeting, daypart and DMA controls, line-item priority models, creative weight/rotation, and Aerospike-backed impression and frequency caps. Measurement publishes serving outcomes to Kafka; player, Global VAST (POA v2.1), display, header-bidding, and house pipelines land in ClickHouse with interactive reports and async CSV export. Feature flags, profile-driven YAML environments, JMeter load plans, and end-to-end Kafka-to-ClickHouse verification scripts support production rollout.
Results
Key metrics
- 4-plane ad platform
- Architecture
- Netty + Aerospike
- Serving
- Player + Global SSP
- VAST Paths
- Kafka → ClickHouse
- Analytics
Impact
Results & outcomes
- One control plane for display, high-impact, owned video, header bidding, house ads, and SSP Global VAST trafficking
- Millisecond decisioning via Aerospike serving cache instead of live SQL joins on every impression
- Dialect-aware Global VAST integration with first-party proof of vast_req, impression, click, error, completed, and retry
- Owned video-player funnel analytics from request through load, start, quartiles, viewability, and completion
- House-ad fallback keeps inventory lit when paid demand misses, with dedicated measurable reporting
- Kafka + ClickHouse architecture delivers speed at the ad call and durable observability afterward
- Structured serving error codes and QA endpoints for rotation, session, and macro capture diagnosis
- Repeatable environment, feature-flag, load-test, and verification tooling for production readiness
Tech used
Technology stack
Tools and patterns from this engagement—your stack may differ.