Managing ads across platforms in bulk with an AI agent: what broke in practice, and the rules that fixed it
Cross-platform bulk management with an AI agent fails in the seams between platforms, not inside any one of them: an id carried from the wrong platform, money in the wrong unit, a write built on a read that came back empty. These are the nine failures we hit running real multi-platform builds, and the rule each one became.
The run that taught us
In late September 2026 we ran one goal through the agent several times with auto-approve on: make a video ad from our own material, upload it to every ad platform we connect, and build paused campaigns around it. Uploads to Meta, LinkedIn, DV360 and Campaign Manager 360 came back as ready assets. Everything below is what went wrong on the way — none of it was a platform being down.
1. An id from the wrong platform
A Reddit create was withheld by a guardrail, so it produced no campaign id. The next step asked for that id — and the template resolver, which fell back to "the most recent campaign id", found Google Ads' campaign id instead and put it on the Reddit ad group's approval card.
The rule: a platform step reads only results from its own platform (or from neutral steps like a calculation). If the step it named did not produce the id, it fails loudly instead of borrowing one.
2. The same word in four different units
- Reddit, Pinterest, Snapchat and X return money in micro-units; LinkedIn already returns whole units; Google Ads stores micros too.
- The rule: every tool converts once at the boundary and only speaks whole account currency. A tool result is never divided again — the most common bulk-edit bug is a budget that is a million times too small or too large.
3. A write built on an empty read
A Pinterest ad create depended on two reads that came back empty — no ad group, no pin. Under auto-approve it was still held for a person, with an approval card full of references that could never resolve, and a reasoning line claiming the reads had found them.
The rule: before the approval gate, a write whose inputs all point at empty or failed steps is skipped, with the reason recorded. Nobody should be asked to approve a change that cannot run.
4. "The first one" is not an identifier
"Pause the first campaign in the list" works until the list comes back in a different order. The rule: a write that targets list[0] is removed from the plan, even when the goal said "the first" — name the object instead.
5. The interface's names are not the API's
- Reddit's "Lowest cost" is the API value BIDLESS. MAXIMIZE_VOLUME, which sounds like it, is Reddit's cost cap — and it fails without a bid.
- Snapchat's web-view call to action LEARN_MORE does not exist (it is MORE); its older goal SWIPE_UPS is now SWIPES.
- The rule: map interface names to API values one-to-one where the mapping is certain, and refuse — before any call — a strategy that needs a value the request did not give.
6. Money is a decision, not a repair
When a platform refused a budget below its minimum, an automatic argument repair was free to raise it and try again. That is a money decision made by a model. The rule: a budget, bid or cap a platform refuses pauses the run and asks the person — the platform's stated minimum, automatic bidding, or skip. The same for an account the run cannot pin down.
7. One file, many specifications
TikTok's ad policy wants 5–60 seconds; Pinterest takes aspect ratios from 1:2 to 1.91:1; LinkedIn and Meta cap file sizes differently. The rule: check each upload against that platform's own published specification; a file that fits goes unchanged, one that a platform would refuse gets a version made for it — and an approved creative is never silently altered to fix a mere recommendation.
8. Approvals at bulk scale
- Approve in batches, not one card at a time — but never with a bulk tick on the class of change that cannot be undone: a permanent delete, a public post, moving money. Those are decided one by one.
- Fan out across a manager account with a dry run first. One goal across fifty Google Ads accounts should show the per-account plan before anything is written.
- Caps that cannot be raised by removing them. Clearing a budget or a spend cap is an unbounded raise, and is blocked like one.
- Protected campaign names are matched on the platforms that support them, on any write that names or touches a campaign — including the parent campaign of an ad group being edited.
9. A follow-up that the re-plan forgot
A follow-up ruled out a Reddit post and two ads; a gap-repair pass later in the same run re-read the original goal and put them back. In another follow-up that said "don't make a new video", the plan started a new paid video anyway. The rule: every re-plan inside a follow-up run reads the follow-up's instruction, and a plan that still does what the person ruled out is treated as a defect and re-planned.
Frequently asked questions
- Can an AI agent manage campaigns across Google, Meta and TikTok at once?
- Yes, in one task: it reads every selected account, plans per platform and proposes the changes together. The hard part is the seams — ids, units and naming that differ per platform — so look for an agent that scopes each step to its own platform and converts money once.
- What is the most common bug in bulk ad edits across platforms?
- Money units. Several ad APIs use micro-units and others whole currency, so a budget divided twice — or not at all — is a million times off. Convert once at the boundary and never again.
- How do you approve hundreds of AI-proposed ad changes safely?
- Approve ordinary changes in batches, but keep irreversible ones — permanent deletes, public posts, money movement — out of every batch, so each is decided on its own. Fan out across a manager account with a dry-run preview first.
- Should an AI agent fix a rejected budget automatically?
- No. A budget below a platform's minimum is a money decision. The run should pause and ask, offering the platform's minimum, automatic bidding or skipping the step.