Soku Runs the Campaign. The Auction Sits Outside It.
One small advertiser shares a single keyword with a bidder running 198,105 of them. An ad agent optimising inside its own account cannot see that.

Soku is an AI marketing agent that generates ad creative, launches campaigns natively on Meta, Google and TikTok, and then optimises spend and bids continuously toward a ROAS or CAC target. It runs a perceive, decide, act loop rather than a dashboard you check.
The interesting question about any agent like that is not whether the loop works. It is what the loop can perceive.
So we measured the thing that sits just outside it. For one small direct-to-consumer advertiser, here is the set of domains competing for the same paid keywords:
tenthousand.cc, US paid search, 24 competing domains
shared keywords with each 1 low 1 median 11 high
their paid keyword counts 6 low 327 median 198,105 high
largest bidder, versus median 1,475x the spend
Read the first row again. The median competitor shares exactly one keyword. And somewhere in that set is an advertiser running 198,105 paid keywords. None of that appears anywhere in the ad account.
Fair disclosure. You are on the Monid blog, Monid sells the endpoint that returned those numbers, and Soku is a content partner. Soku is not in the Monid catalogue. Everything above about Soku comes from their own public site. The section near the end says when none of this is worth wiring in.
What can an ad agent actually see?
Everything it did, in perfect detail, and nothing anybody else did.
The closed loop is genuinely powerful
An agent with access to the ad accounts, GA4 and the store can see impressions, clicks, spend, conversions, revenue, and which creative variant won. It can run an A/B test on live traffic and act on the result without waiting for a human to open a dashboard on Monday. For the decisions that live entirely inside those numbers, that is a real advantage and the loop needs nothing else.
Soku goes further than most by making the autonomy explicit: analysis only, then act with approval, then full autopilot, with every decision logged. That laddering is the right shape, and it matters more once you see what the loop is missing. The generation side is genuinely fast now too, as their own walkthrough of building a TikTok slideshow from a prompt shows, which is exactly why the constraint moves to knowing which thing to generate.
The boundary of the loop is the account boundary
Now list what those same numbers cannot contain, at any resolution:
- Who else entered the auction this month
- How much they are spending, and on how many keywords
- Whether your creative angle is now the fourth one a shopper has seen today
- Whether a competitor cut price, went out of stock, or launched
Every one of those changes your results. None of them changes anything the agent can read. The agent will still see a number move, and it will still act.
Who else is bidding on your keywords?
More advertisers than the account suggests, and they are wildly unequal.
Two advertisers, two competitive sets
We pulled the paid search competitors for a well-known athletic brand and for a much smaller one in the same category.
gymshark.com tenthousand.cc
competing domains 30 24
shared keywords, median 4 1
paid keywords, median 418 327
largest bidder vs median 626x 1,475x
Two things jump out. The first is that the median overlap is tiny: four keywords for the large advertiser, one for the small one. There is no single rival who explains your costs. The competitive set is a long tail of advertisers who each touch a corner of your keyword list.
The second is the spread. In the small advertiser's set, the biggest bidder is running three orders of magnitude more paid keywords and roughly 1,475 times the median monthly spend. They share exactly one keyword. That one keyword sits in an auction priced by somebody operating at a completely different scale.
The set is not who you would name
Asked to list competitors, the small brand would name the other apparel labels. The measured set does include those, and it also includes a general marketplace, a department store chain and a magazine, each sharing between one and three keywords.
That matters because it is the part a human strategist prunes out as noise and the auction does not. A department store bidding on three of your terms still moves the price of those three terms.
Why does the same rising CPC mean two different things?
Because the agent's only readable signal collapses two very different causes into one number.
Both stories produce the same graph
Suppose cost per click rises 30% over two weeks and ROAS falls. Two explanations:
- Your creative fatigued. The audience has seen it, click-through fell, quality signals dropped, and you are paying more for the same placement.
- The auction got more expensive. A larger advertiser expanded into your keywords, or a seasonal bidder came back, and the clearing price moved for everyone.
Inside the ad account these look identical. Same CPC line, same ROAS line, same direction.
They call for opposite responses. Story one says refresh creative and the cost comes back down. Story two says your creative is fine, the market repriced, and the correct move is to re-evaluate which keywords are still worth holding, or to accept a lower target on that segment.
An autonomous agent will act on the wrong one confidently
This is the part worth sitting with. An agent optimising toward a ROAS target has a small set of levers: bid, budget, audience, creative. Faced with a falling ROAS it will pull them, because that is what it has. If the cause was external, pulling those levers produces churn: new creative that was never the problem, bids cut on keywords that were never underperforming relative to their new price.
Worse, it will log a confident rationale. The activity log will read as a reasoned decision, because from inside the account it was one.
The fix is not a smarter agent. It is one more input.
Telling the two stories apart takes one comparison
The diagnostic is simpler than it sounds, and it does not need a model.
Pull your competitive set twice, a month apart, and compare three fields: how many domains appear, how many keywords each shares with you, and how large their paid footprint is. Then read the result against your own numbers.
If your CPC rose and the set is unchanged, the cause is inside the account. Refresh the creative; that is story one and the agent's instinct was right.
If your CPC rose and the set gained entrants, or an existing member's paid keyword count jumped, the cause is at least partly outside it. Creative refresh will not recover the old price, because the old price no longer exists.
The useful property here is that the comparison is cheap and slow-moving. You are not streaming an auction feed. You are answering one question once a month: did the field change, or did I. Most of the time the answer is "neither, that was noise", and knowing that is worth something too, because it stops an autonomous agent from manufacturing work.
Which outside signals belong inside the loop?
Four, in rough order of how often they move.
The competitive set, refreshed
Who shares your keywords, how many they run, and roughly what scale they operate at. This is the measurement above, and it answers "did the field change" before the agent starts blaming itself. Monthly is usually enough; the set does not churn weekly.
Competitor creative, which is a different job
What rivals are actually running, and for how long. That signal deserves its own treatment, and reading run duration as a profitability signal covers it properly rather than in a paragraph here. The short version: an ad that has run ninety days is the closest thing to published proof that it converts.
Price and availability on the other side
If a competitor cuts price, your conversion rate falls with no change in your funnel. Product and pricing data is what an agent cannot see from inside its own store either, and the same call answers both questions.
The organic and marketplace context
Whether the query is being satisfied elsewhere. A term whose results page filled up with marketplace listings behaves differently at the same bid.
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to list the domains competing with my site on paid search, how many keywords we share, and how their paid footprint compares to mine.Reaching four different signals used to mean four vendors, four keys and four contracts. Monid is the OpenRouter for agent tools: one key and one balance across the catalogue, discovery and inspection free, execution metered. That is the same argument as models and tools being two separate integrations, applied to the layer an ad agent reaches for. Current per-endpoint figures are at monid.ai/tools, which stays accurate in a way a number typed into a post does not.
If the wiring question is the live one, MCP versus a plain API call covers who does the wrapping, and the tool layer an agent discovers through covers the other half. For the ad archives specifically, turning a brand name into its competitor ad archive is the mechanical version.
When is none of this worth wiring in?
Three cases, and the first is more common than vendors admit.
When you are the largest bidder
If your paid footprint dwarfs everyone sharing your keywords, the auction moves because you moved it. The external signal is mostly your own reflection, and the closed loop is genuinely sufficient. Measure the set once to find out which side of that line you are on, then stop.
When spend is too small for the variance to matter
Below a certain budget the noise in your own conversion data is larger than the effect you are trying to detect. Adding a competitive feed to a campaign spending a few hundred a month buys you a more sophisticated way to misread randomness. Fix sample size first.
When nobody will act on it
The signal has to reach a decision. If the agent runs on full autopilot with no branch that says "external cause, hold the creative", then feeding it competitor data changes nothing except the bill. Wire the input and the branch together, or wire neither.
The tell that you are in the fourth case, the one worth avoiding, is an activity log full of confident creative refreshes that never quite fix the ROAS. That is an agent solving the wrong story well.
Conclusion
Two measured competitive sets, and one number worth keeping from each.
The median competitor shares one to four keywords with you. There is no single rival to watch; the price is set by a long tail you would not have named. And the largest bidder in a small advertiser's set runs 1,475 times the median spend while sharing exactly one keyword with them.
An agent inside the ad account sees neither. It sees a CPC line, and a CPC line that rises because your creative aged looks exactly like a CPC line that rises because somebody else arrived.
Give the loop one more input and the two stories separate. Leave it out and the agent will keep choosing between them, quickly, on its own, and roughly half the time it will choose wrong.
FAQ
Do the ad platforms not already show competitive metrics?
Partly, and only within their own walls. Auction insights and impression share tell you about the platform you are already spending on, in the categories that platform recognises. They will not tell you that a marketplace expanded across ten of your keywords, and they cannot compare a rival's footprint on one platform against another. The measured sets above cross those boundaries.
How often should an agent refresh competitive data?
Monthly for the competitive set, which does not churn weekly. Faster for price and availability, which can move daily and hit conversion rate immediately. Refreshing everything on the fastest cadence is the usual mistake: it multiplies cost without improving the decision, because the slow signals were not the thing that moved.
How do I find what creative my competitors are running?
That is a separate job with a better answer than this piece would give it. Reading run duration from the ad archives works through it: which ads to pull, how to read longevity as a profitability signal, and when that signal lies.
Is it safe to let an agent change bids on its own?
It depends less on the agent and more on whether it can tell why a number moved. An agent with only internal signals will act confidently on ambiguous evidence, which is the failure mode described above. A staged control ladder, analysis first, then act with approval, then autonomy, with every decision logged, is the right shape, and it is the shape Soku has built.
Last updated August 2026.

