Back to Blog
advertisingarchitectureai-agentsconsolidation

Multi-Channel Ad Automation Architecture: 3 to 1

How I consolidated three contradictory ad systems into one multi-channel ad automation architecture with a channel adapter pattern, without breaking the live one.

By Mike Hodgen

Short on time? Read the simplified version

How I Ended Up With Three Ad Brains

I never set out to build three ad systems. Nobody does. But that is exactly what I ended up with, running ads for my own DTC fashion brand plus a handful of client accounts under one agency manager account, across two major ad platforms.

Diagram showing three isolated ad automation systems: a working live autopilot, a stranded half-built adapter, and a smart profit brain that only writes reports, none connected to each other. Three disconnected ad brains, none aware of the others

This is the part of multi-channel ad automation architecture nobody warns you about: the rot is quiet, and every individual decision that got you there was reasonable.

The live one that worked

The first system was a live autopilot on platform A. It actually did the job. Every day it read performance, shifted budget toward winners, and pulled spend off losers. It was the Meta autopilot with specialist agents, and it was making money. It could not go down.

The stranded one

Then I onboarded a client whose spend lived mostly on platform B. So I started building a second autopilot for that platform. It got about halfway. The API client worked, the data flowed, but it never actually executed a single budget change. A stranded brain, half-built, parked.

The smart one that never acted

The third was the worst kind of waste: the smartest one. A Python profit brain with causal halo modeling, blended margin across products, and a self-grading loop that scored its own past calls. The most sophisticated reasoning I had built. And it never touched a budget. It only produced recommendations that sat in a table.

Three systems. None of them knew the others existed.

That is how stacks rot. Locally rational, globally incoherent. I wrote up the full teardown in the companion piece on how I collapsed three ad systems into one. This article is the architecture underneath it.

The Audit That Mapped the Redundancy

Before I touched a line of code, I ran an audit. Six agents, roughly a million tokens, mapping every overlap across the three systems. You cannot consolidate what you have not mapped, and guessing is more expensive than measuring.

Infographic of audit findings showing six redundant API clients, three metrics stores that quadruple-count spend, and conflicting decisions scattered across two databases. The audit findings: redundancy across clients, metrics stores, and decision logs

What it found was uglier than I expected.

Six API clients across two languages

There were six separate API clients talking to the same two platforms. Written across two languages. Each one did a variation of the same calls: read spend, read performance, set budget. Six implementations of the same handful of operations, none of them shared, all of them drifting apart with every fix.

Three metrics stores that triple-counted

There were three separate metrics stores, and they did not agree because two of them were wrong. They summed account rows plus campaign rows plus adset rows plus ad rows as if each were independent spend. The same dollar got counted at four levels.

The result was a "spend" number inflated several times over. Decisions were being made on a figure that was pure fiction. I have seen this exact failure before, and I wrote about metrics that lie by double-counting because it is so common it deserves its own warning.

Decisions scattered across two databases

The decision logs were spread across three to four stores in two different databases. Which meant the same account could have two conflicting recommendations live at the same time. One brain saying scale, another saying pause.

The audit was cheap. The cost of consolidating blind would have been catastrophic. Map first.

Why Overlapping Ad Tools Contradict Each Other

If your marketing tools overlap and contradict each other, you are not doing something wrong. It is structural. It happens to almost everyone past a certain size, and it happens for three specific reasons.

Each tool owns its own copy of the truth. Every system has its own metrics store and its own decision log. The moment you have two copies of "spend," they drift. There is no shared definition, so they diverge a little every day until they tell completely different stories.

There is no shared definition of profit or spend. When two systems optimize the same account without agreeing on what "profit" means, they pull in opposite directions. One optimizes for ROAS, one for margin, one for a triple-counted spend figure that was never real. They are not malfunctioning. They are obeying different instructions.

The smartest reasoning is trapped in whatever got built last. The best logic almost always lives in the newest tool, bolted on the side. So it advises but never executes. The dumbest system is in charge of the money, and the smartest one writes memos nobody reads.

The canonical failure is the triple-count. A "spend" number summed across four levels of the hierarchy looks authoritative on a dashboard. It is wildly inflated. And every downstream decision inherits the error.

This is what ad tech stack rationalization actually means. Not buying a better dashboard. The goal is one source of truth and one executor. More tools make the contradiction worse, not better. The fix is fewer brains, not smarter ones.

The Channel Adapter Pattern: One Spine, Pluggable Channels

Here is the architecture that fixed it, and it is the reusable part for you.

Architecture diagram showing a single decision engine talking to a generic AdsClient interface with five verbs, which connects to thin per-platform adapters, allowing new channels to be added without changing the decision logic. The channel adapter pattern: one decision engine, pluggable platform adapters

A multi-channel ad automation architecture is a single decision engine that controls spend across multiple ad platforms through a shared interface, so the logic that decides what to do is completely separate from the plumbing that does it on each platform.

The mechanism is the channel adapter pattern.

A generic AdsClient interface

I extracted one generic interface, an AdsClient, that every platform has to implement. It defines a small, fixed set of operations: read spend, read performance, set budget, pause, scale. That is the whole contract. Five verbs.

Every platform speaks the same language to the rest of the system.

Channel-aware decision engine

The decision engine talks only to that interface. It never imports a specific platform's SDK. It never knows whether it is looking at platform A or platform B. It asks for performance, it sets a budget, and it trusts the interface to handle the rest.

This is the whole trick. The engine reasons about money and outcomes. It does not reason about which API endpoint takes which parameter format.

Building the second-platform adapter

Then you write a thin adapter per platform. The adapter's only job is to translate the five generic calls into that platform's actual API, with all its quirks and rate limits and naming. I built the adapter for the second platform, and the stranded client finally had a home, not a half-built one-off.

Result: one spine, two channels, and room to add a third whenever I want without touching the decision logic.

The lesson for your stack: separate the decisions from the channel plumbing. When those are tangled together, every new platform means a new full system. When they are separate, a new platform is just a new adapter.

Moving the Profit Brain From Advisor to Executor

Now back to that smart Python brain that never did anything.

Before-and-after comparison showing a profit brain that only wrote reports being rewired into the executing spine to control cross-channel budgets, with a human approval gate on large moves. Profit brain moving from advisor to executor

It had the best reasoning I owned. Causal halo effects, so it understood that scaling one product lifted adjacent ones. Blended margin across channels, so it knew real profit, not just platform-reported ROAS. A self-grading loop that scored its own past decisions and adjusted.

Causal halo and blended margin

This is the logic from bidding on profit instead of ROAS. It is genuinely good math. And it was completely useless, because it only produced recommendations into a table.

A recommendation no one acts on is a report. Reports rot. Advisory-only systems are nearly worthless in practice, no matter how clever the reasoning, because the clever part never reaches the lever.

From recommendations to cross-channel budget allocation

So I ported the profit brain out of the sidecar and into the executing spine. It became a cross-channel budget arbitrator. It now decides where the next dollar goes across both platforms, not just within one. Real cross-channel budget allocation, driven by blended margin, actually moving money.

The win was not smarter math. The math was always there. The win was wiring the smart math to the lever.

One honest limit: I kept a human approval gate on large budget shifts. A single arbitrator with full autonomy over all spend is a single point of failure, and I am not comfortable handing every dollar to one piece of code with no human in the loop. Small daily moves are automatic. Big swings get a glance from me first. That gate has caught two bad calls already, which is two more than zero.

How to Consolidate Without Breaking the Live System

The real question, the one that keeps people from ever fixing this: how do I unify everything without breaking the one system that is running and making money?

Vertical five-step flowchart for safely consolidating ad systems: audit and map, build the new spine alongside, run in shadow mode, migrate the live channel last, and decommission redundancy one at a time, all while the live autopilot stays up. The five-step safe consolidation sequence without breaking the live system

The live autopilot stayed up the entire time. Here is the exact sequence I used.

1. Audit and map before touching code. The six-agent audit came first. I knew every redundant client, every metrics store, every decision log before I changed anything. No surgery without the X-ray.

2. Build the new spine alongside the live system. Not in place of it. The channel adapter spine got built next to the running autopilot, sharing nothing, breaking nothing. The thing making money never noticed.

3. Run the new path in shadow mode. For weeks, the new spine read the same inputs and produced its own decisions without executing them. Then I compared. Did the new path agree with the live one? Where it disagreed, was it right or wrong? Shadow mode means you find out before real money is on the line.

4. Migrate the live channel last. I cut the live platform over only after the new path matched or beat it on the same inputs. The thing that worked was the last thing I touched, not the first.

5. Decommission redundancy one at a time, with rollback. The six clients and three metrics stores came down one by one, each with a path back if something broke. No big-bang cutover. No weekend where everything is down and you are praying.

The rule, the one I would carry into any consolidation: never rip out the thing that is working until the replacement has proven itself on the same inputs. Proven, not promised.

When Your Stack Has Three Brains and Doesn't Know It

Most companies past a certain size have this exact problem and have never named it. Overlapping marketing tools. Three metrics that do not agree. The sharpest analysis trapped in a spreadsheet or a sidecar that nobody acts on.

You probably recognize at least one of those. Maybe all three.

The fix is almost never a new tool. Adding tools is what created the mess. The fix is mapping the redundancy, picking one source of truth, separating the decisions from the plumbing with a clean interface, and migrating the live thing last so you never break what is working.

I do this for my own DTC brand and for client accounts. The two platforms became one spine. The triple-counted metrics became one honest number. The profit brain went from writing reports to moving money. And the autopilot that was making revenue never went dark for a second.

If your stack is fighting itself, the first deliverable is not a rebuild. It is the map. You cannot fix the contradiction until you can see it, and most teams have never sat down to draw it. That is usually the cheapest, highest-leverage week of the whole project.

If you want to look at your stack the same way, that is where I would start. Not with code. With the X-ray.

Want to explore what AI could do for your business?

Book a free 30-minute strategy call. No pitch deck, no sales team, just a real conversation about your operations and where AI actually fits.

Book a Discovery Call

Get AI insights for business leaders

Practical AI strategy from someone who built the systems — not just studied them. No spam, no fluff.

Ready to automate your growth?

Book a free 30-minute strategy call with Hodgen.AI.

Book a Strategy Call