Is it safe to let an AI agent run Meta ads? The guardrails that hold
By the Puncho team · Updated
It is safe to let an AI agent run Meta ads when three things are true: every ad it creates starts paused, a spending ceiling is checked by code the agent can't edit, and a person switches ads on. Take any one away and you are relying on the agent's judgement with a card on file.
We learned that sentence the slow way. This page is part of our guide to AI agents for Meta ads, and it's the one to read before you grant write access to anything.
What can actually go wrong
Leave aside the dramatic version where an agent goes rogue. The realistic failures are dull. The last three on this list happened to us, or came within one click of it.
- An ad is created live instead of paused, and spends overnight.
- A daily budget is set to the number meant for the month.
- A campaign takes a fallback audience and targets the wrong country.
- The agent pays for image generations nobody asked for.
- An ad that nobody read goes out under a client's name.
All of these come down to a capable agent, a vague instruction and a missing check. Our working line is that an agent with a bug and a credit card is an unrecoverable incident. Refunds from an ad platform for your own tooling's mistake are not something to plan around.
Instructions are not guardrails
This is the lesson that cost us the most time, so it goes first.
Our agent rendered images after revisions without being asked. Each render costs money. We told it to stop; it apologised and agreed, and in that session it did stop. The next session started from the same written instructions and none of that conversation, and it did the same thing again.
So we wrote the rule into its instructions: propose each render with its price, and wait. That helped. It did not hold every time, because an instruction is something a model weighs against the task in front of it, and "the user obviously wants this finished" is a heavy counterweight.
What held was taking the decision out of the model. Each tool that spends on the agent's say-so now raises a permission prompt to the human, on every call, in every mode. The agent's instructions still say to ask first, and we kept them because the proposals are useful. But the prompt is the control, and the instructions are manners.
The same applies to "never activate an ad". We don't ask the agent to refrain. It doesn't have the tool.
The five guardrails we enforce in code
1. Everything is created paused
Campaigns, ad sets, ads. No parameter can change it, so a call that forgets one can't create something live. Activation is a different call, and it isn't the agent's.
This single rule turned our worst near-miss into a non-event. The campaign that picked up a fallback audience in the wrong country was paused, so the cost was a red face.
2. A human approves every ad before it can launch
Approval is a recorded decision by a named person, and launch refuses anything without one. The agent has no approval tool. Neither does any assistant connected through a personal token or a chat app.
No model's judgement substitutes for this in any path, including a second model reviewing the first. A reviewer model is fine for checking rules. It can't be the one who answers for the ad.
3. The budget ceiling is checked before the API call
Meta has account spending limits and you should set one. But it's a single number for the whole account, enforced after your request arrives. We check our own ceiling in our own code before the request is sent: a per-workspace limit, and one figure over the whole install that nothing can exceed.
"Before the call" is the important part. A check that runs afterwards reports the damage. Ours refuses, with the number it refused and the limit it hit, and nothing reaches Meta.
4. No default audience
A launch needs saved campaign settings for that client, or places, ages, objective and optimisation goal given outright. There's no fallback to fill a gap. Defaults are how a paused campaign ends up one click from spending in the wrong country, and the pause in rule one is the only reason ours didn't.
5. A budget per piece of work, set by a person
Making ads costs money before any media is bought: image generation, background removal, relighting a product. Asking a human to approve each of those calls would be dozens of prompts per ad, and people stop reading prompts by the fifth.
So the person answers the money question once. When they send a concept to be designed, they give it a budget in dollars. Code refuses any step whose likely price would pass it, before the provider is called, and counts every dollar including retries. A design with no budget lets the agent spend nothing. Only a person can raise one.
That's the pattern worth copying. Decide the amount up front, as a number, and let code hold the line. One clear decision beats dozens of reflexive ones.
A stop button the agent can't lift
When an agent is mid-task and you want it to stop, typing "stop" into the chat is a request. We added a real one: a Stop on the board that refuses every call that isn't read-only, for that agent in that workspace, until a person presses Resume.
Two details took thought. A call already running is allowed to finish, since the provider has been asked and will charge either way. And the check fails closed: if the system can't read whether a stop was requested, writes are refused, because nobody could then say a person hadn't stopped it.
The agent has no tool to see or clear its own stop.
What we deliberately leave open
Guardrails everywhere would make the agent useless, so here is what runs freely: reading results, searching the Ad Library, writing concepts, editing a design, previewing it, checking copy against a ban list. None of these spend or publish. An agent that has to ask before reading a report gets abandoned within a week, and then the work goes back to an unguarded chat window.
The order to turn things on
- Read access only, for two weeks.
- Drafting: concepts and designs that land in a review queue.
- Launch, paused, with your own ceiling in place and tested by trying to exceed it.
- Stop there. Activation stays with a person.
Test the ceiling by breaking it. Ask the agent to set a daily budget above the limit and watch the refusal. If you haven't seen a guardrail refuse something, you don't yet know that it's there.
With money settled, the remaining question is what the approver actually looks at. That's an approval workflow for AI-made ads. Agencies running several brands should also read Meta Ads MCP for agencies, since a correct budget in the wrong account is still an incident.
Questions people ask
- Is it safe to connect Claude or ChatGPT to a Meta ad account?
- Connecting is safe: it goes through Facebook Login and Meta's own server. The risk is in what the agent is allowed to do afterwards. Read access carries almost none. Write access is safe when new ads start paused, spend has a ceiling checked outside the agent, and a person switches ads on.
- Is a spending limit in Meta enough?
- An account spending limit is a good last line, and it is the only one that holds if everything else fails. It is one number for the whole account, though, so it will not stop an agent from putting a week's budget on one ad set. Check the ceiling in your own code before the call as well.
- Can I tell the agent in its instructions not to spend without asking?
- You can, and it will mostly listen. Ours spent on image renders unasked, agreed to stop, and a new session had no memory of agreeing. Instructions shape behaviour. They are not a control.