NC Nati Correa
AI systems and agents
40.7128 N / 74.0060 W
LOG / 03
/ Case study / Freelance

Media buyer agent

A Meta ads media buyer that runs the daily discipline of paid social: account scans, kill calls, creative briefs, and scaling decisions. It does the analysis of a full-time buyer and judges itself on real bookings, not clicks; a human keeps the wallet.
/ The problem

A freelance client (a local sports facility) needed ongoing paid social management: creative testing, budget reallocation, scaling winners, and cutting underperformers. Done properly that is a daily discipline, reading spend, ROAS, CPA, CTR, and frequency every morning and acting on the trends, and analytics-driven decisions at that cadence are nearly impossible to sustain alongside full-time work.

/ What I built

An agent on the official Meta Ads MCP that runs the full media-buyer loop. Every morning it scans the account: spend, ROAS, CPA, CTR, frequency, and flags any ad past its kill thresholds. Weekly it audits the whole account against 7 and 30 day trends, detects creative fatigue, researches competitor ad libraries, and writes production briefs with specific hooks, angles, and test hypotheses. Then it builds the work itself, from campaigns and creative variants to budget reallocations and scaling moves.

Money keeps one rule: everything the agent creates ships paused, and a human activates it. That one rule is what makes the rest of the autonomy safe to hand over. It did not start this general. The first version was built for one specific client, a local sports facility, and once the loop proved itself there it got generalized: now the agent interviews any business owner and configures its own thresholds, budgets, and creative angles from that conversation, with the original client as the reference installation.

The sharpest part is what it optimizes toward. Wired into the client's CRM, it reads who actually booked and showed, not just who clicked, ties each booking back to the exact ad that drove it, and feeds those real conversions back to Meta so delivery learns on bookings instead of cheap clicks. Most ad agents chase a proxy metric; this one closes the loop from spend to a person on the court.

2systems in the loop: ads + crm
5metrics scanned every morning
30day trend window on audits
0dollars spent without a human
/ Proof
The loop / daily grind, weekly depthEVERY MORNING ..... SCAN SPEND, ROAS, CPA, CTR, FREQUENCY
FLAG .............. ADS PAST THEIR KILL THRESHOLDS
EVERY WEEK ........ FULL AUDIT, 7 AND 30 DAY TRENDS
CREATIVE .......... FATIGUE DETECTION + BRIEFS WITH TEST HYPOTHESES
RESEARCH .......... PUBLIC AD LIBRARY FOR COMPETITOR ANGLES
BUILD ............. CAMPAIGNS + VARIANTS, SHIPPED PAUSED
OUTCOME ........... REAL BOOKINGS READ FROM THE CRM, PER AD
FEED BACK ......... BOOKINGS SENT TO META VIA CONVERSIONS API

SPEND GOES LIVE WHEN A HUMAN SAYS SO. ALWAYS.
/ The trust boundary

Autonomy is a dial, and this agent runs it high everywhere except the wallet. That freedom is earned by a layered trust boundary, not a single guardrail. Everything it makes ships paused. Spend only starts when a human types a confirmation. The real money limits sit in the ad account and on the card, where the agent cannot reach them. Every write is appended to a ledger that is never edited. And every number in a report is computed from raw data, never the model's memory, so it can say "cannot verify" but it cannot invent a figure. The same pattern runs through everything else in this log: drafts that never send, fixes that wait for approval, spend that goes live on a human's say-so.

Bounded autonomy / how it earns the freedomSHIPS PAUSED ...... EVERY CAMPAIGN, VARIANT, AND BUDGET MOVE
GO LIVE ........... SPEND STARTS ONLY ON A TYPED CONFIRMATION
WALLET ............ ACCOUNT + CARD LIMITS IT CANNOT TOUCH
LEDGER ............ EVERY WRITE APPENDED, NEVER EDITED
NUMBERS ........... COMPUTED FROM RAW DATA, NOT THE MODEL

AUTONOMY HIGH EVERYWHERE. FREEDOM TO SPEND, NOWHERE.
/ From build to handoff

It ships as an installable skill, not a script only I can run. The package carries a plain-language owner's manual, a teaching-call script, and a pre-shoot creative card, built so a non-technical operator installs it and runs the daily loop on their own. The design assumes I am not in the room: jargon defines itself the first time it appears, starting spend takes a typed confirmation, and the agent warns about its own expiring logins before they break anything. I built the buyer and the handoff around it.

Back to the build log