The challenge
Agencies running paid media for several clients rarely work in one tool. Each client’s spend sits across a different mix of platforms, and each platform has its own interface, its own reporting and its own way of measuring results. The agencies Kaivo is built for were juggling client accounts across Google, Meta, TikTok, LinkedIn, Microsoft, Reddit, Spotify and Shopify with no single view of performance.
The cost of that fragmentation is not only time. When performance data sits in eight places, the early signs of trouble are easy to miss: return on ad spend sliding on one channel, a budget running ahead of plan on another, an ad that has stopped working because the audience has seen it too often. By the time someone spots it in a routine report, the client has already paid for it.
- One place to manage client ad accounts, campaigns and performance across every channel the agency runs
- Early warning on ROAS decline, budget pacing and creative fatigue, without someone checking each platform by hand
- An AI assistant built into the product rather than bolted on beside it
- An architecture that can add channels and services without a rewrite
What I built
I designed and built Kaivo end to end as a set of FastAPI microservices behind a Next.js front end, deployed on Cloudflare and AWS. Splitting the backend into services was a deliberate choice for this domain. Every ad platform has its own API, authentication, limits and release cycle, and those integrations change on the platform’s schedule, not yours. Keeping them apart means a change or outage on one platform does not take down the rest of the product, and a new channel can be added without touching the others.
Above the integrations sits the intelligence layer. The signals engine works on the performance data the platform already holds and flags three problems that quietly burn client budget: ROAS decline, budget pacing and creative fatigue. Its job is to turn those problems into something an account manager sees and can act on, rather than something found later in a report.
Kai, the in-product AI assistant, gives account managers a conversational way into the same platform. Building it into the product, rather than as a separate chatbot, means it works alongside the dashboards and signals the team already uses, on the same data.
Python and FastAPI suit this mix of integration work and AI features. Typed request and response models make the contracts between services explicit, which matters when several services and several outside APIs have to agree on the shape of the data. Next.js and React give agencies a fast interface for working across many clients and channels at once.
Architecture and stack
- Front end
- Next.js · React
- Backend
- Python · FastAPI · Microservices
- AI
- “Kai” in-product AI assistant · LLM agents · Signals engine (ROAS decline, budget pacing, creative fatigue)
- Channels
- Google · Meta · TikTok · LinkedIn · Microsoft · Reddit · Spotify · Shopify
- Infrastructure
- Cloudflare · AWS
Outcome
Kaivo gives agencies one portal for every channel they run. Instead of logging into each ad platform in turn, account managers see client accounts, campaigns and performance side by side, and the signals engine brings ROAS decline, budget pacing problems and creative fatigue to their attention before those problems cost the client money.
Because each integration lives in its own service, the platform can grow with the agency. Adding a channel or a new kind of signal is an extension, not a rewrite.
Sean Metcalf, Kaivo’s founder, summed up the working relationship as “steady progress, predictable delivery, and code that’s easy to review and integrate”. His full recommendation is below.
- One view of client ad accounts, campaigns and performance across eight channels
- ROAS decline, budget pacing and creative fatigue flagged automatically
- An AI assistant inside the product, not in a separate tool
- A service-based backend that adds channels without a rewrite
“Steady progress, predictable delivery, and code that’s easy to review and integrate.”
Last updated 2026-10-03