Most competitive intelligence agents fail in the same quiet way. They run, they find nothing, they report nothing, and everyone assumes the market was quiet. Collection is the easy half of this problem. Knowing whether an empty briefing means "nothing happened" or "the scraper broke" is the half that decides whether anyone trusts the output by week six.

What a competitive intelligence agent actually watches
What a competitive intelligence agent actually watches

What a competitive intelligence agent actually watches

The useful scope is narrower than the category name suggests. A briefing agent is not doing market analysis; it is watching a short list of public surfaces where competitor decisions become visible, and telling you when one of them moves.

Notice that the last item is the one most tools lead with, and it is the least valuable, because a funding announcement is public simultaneously to everyone. The edge is in documentation and job boards, where the change is public but nobody is looking.

The failure mode nobody mentions: the empty briefing

This is the part worth reading twice, because it is the difference between a tool people trust and a tool people quietly stop opening. A competitive intelligence agent has two ways to produce an empty briefing, and they look identical from the outside.

What happenedWhat the briefing saysWhat you should do
Genuinely quiet week"No changes detected"Nothing
Page is JavaScript-rendered, fetch got an empty shell"No changes detected"Fix the fetch, you are blind
Bot protection served a challenge page"No changes detected"Fix the fetch, you are blind
Page moved, old URL now redirects"No changes detected"Update the URL
Content extracted, but the diff was cosmetic"No changes detected"Nothing, this is correct

Four of those five rows are indistinguishable in a naive implementation, and three of them mean your agent has stopped working. The fix is not clever: assert that the fetch produced plausible content before you diff it. If a pricing page returns a document with no currency symbol anywhere in it, that is not a quiet week, that is a broken fetch, and the briefing should say so loudly.

What we ran, and what it taught us

We built a small version of this to watch pricing pages across the agent platform market, which is a market we have obvious reasons to follow closely. The intent was ordinary: fetch each competitor's pricing page weekly, extract the plan names and prices, and flag changes.

It broke almost immediately, and not in an interesting way. Several vendors' pricing pages return a small HTML shell and render every price in the browser, so a plain fetch retrieves a page with no prices on it at all. One returned a document of roughly six kilobytes containing no currency symbols. Our first version dutifully recorded "no prices found" and moved on, which is functionally the same as reporting that the competitor had no pricing.

The second lesson was worse, because it produced a confident wrong answer rather than a blank one. Falling back to a vendor's documentation site instead of its pricing page, we pulled what looked like a set of figures, and they were not prices at all: they were framework placeholder tokens in the page's serialised application state that happened to match a currency pattern. A regular expression looking for a dollar sign followed by digits found them and reported them as pricing. Had we shipped that, we would have published invented competitor prices sourced from a real, working, authoritative URL.

That is the specific trap in this category. A dead link is easy to catch. A live page that yields plausible-looking garbage is not, and pattern matching alone cannot tell the difference. What fixed it was a validation step that asks whether the extracted values make sense as prices, in range and in context, before anything is written to a briefing. We now treat any competitor figure that has not survived that check as unverified, and the briefing labels it as such rather than stating it.

The third lesson was about volume. Once collection worked, the briefing was too long to read, because competitor marketing pages change wording constantly. Ranking by materiality, price changed, plan removed, new product line, versus copy edits, fixed the readability problem better than any summarisation prompt did.

Ranking by materiality, not by recency

A briefing sorted by time is a feed, and feeds do not get read. A briefing sorted by consequence is a document, and documents do. The ordering rule that worked for us is crude and effective.

  1. Price or packaging changed. A tier removed, added, or repriced. Always top.
  2. A capability appeared or disappeared. New product surface, deprecated feature, new API.
  3. Positioning shifted. The headline claim on the homepage changed.
  4. Hiring signal. A role that implies a direction they have not announced.
  5. Everything else. Collapsed into one line, not enumerated.

Group five is where most tools spend their word count. Collapsing it is the single change that makes a weekly briefing survive contact with a busy reader.

Cadence and scope

Weekly is right for almost everyone. Daily competitive monitoring is a fantasy sold to people who will not read it: markets do not move daily at the level a briefing can detect, and a daily digest trains the reader to skim. Scope beats frequency every time.

Why the briefing must cite, not assert

Every line in a competitive briefing should carry the URL and the date it was checked. This sounds like formatting fussiness and it is actually the control that keeps the whole thing honest, for a reason specific to how these agents fail.

A summarising agent will produce a fluent sentence about a competitor's pricing whether or not it successfully read the pricing page. The prose quality is identical in both cases. The only thing that separates a real finding from a confident hallucination, at the moment someone acts on it, is whether a human can click through and see the claim on the vendor's own page. A briefing that says "Competitor X moved their entry tier to $29" is unfalsifiable at a glance. One that says the same thing with a link and "checked 27 August 2026" can be disproved in four seconds, which means it will be, which means the agent stays honest.

This applies with more force to prices than to anything else, because prices are the most likely item to be acted on and the most likely to be stale. Treat any competitor price older than about a month as unverified until re-checked against the vendor's own page, and never against an aggregator or a roundup, which are wrong often enough that we now treat them as unusable for this purpose. The same discipline underpins our own comparison work, including pages like our Dust.tt comparison, where every figure carries the date it was checked.

How to set one up

The build order matters, because doing it in the obvious order produces a tool that looks finished and is silently blind. Start with failure detection, add sources last.

  1. Pick the competitor list and the surfaces. Write them down. Five competitors, three surfaces each.
  2. Fetch one surface and validate the extraction before adding a second. Assert the page contains what a real version of that page would contain.
  3. Add the "fetch looks broken" alarm. This is the step everyone skips and the one that determines whether you can trust an empty briefing.
  4. Store a snapshot per surface per run, so the diff is against what you actually saw last time rather than against a summary of it.
  5. Add materiality ranking before you add competitors six through eight.
  6. Deliver weekly into a shared channel with a link and a checked date on every line.

On Gravity you would describe that outcome in plain language and connect the delivery channel, rather than assembling the fetch, diff, and schedule layers yourself. The general mechanics of scheduled autonomous tasks are covered in how AI agents work, and the vocabulary in the what is an AI agent primer. If your use case is research rather than monitoring, an AI research assistant is the closer fit, and agents for consultants covers the client-facing version of this work.

What it costs

A weekly briefing over five competitors is a small job: a few dozen fetches and one summarisation pass per week. Cost scales with how many surfaces changed, not with how many you watch, because unchanged pages cost a fetch and nothing else.

On Gravity that fits comfortably inside the free tier's single agent at $0 a month for a five-competitor weekly briefing. Paid plans start at $20 a month and include $20 of usage, with extra usage available beyond the plan if you widen to daily runs or many more surfaces. The cost that actually bites is not tokens, it is the fetching infrastructure for JavaScript-rendered pages, which is why scope discipline saves more money than model choice. For how low-frequency scheduled jobs are priced across the market, our cheapest AI agent platforms breakdown covers the all-in numbers.

Frequently asked questions

What is an AI competitive intelligence agent?

A scheduled agent that watches a fixed list of public competitor surfaces, pricing pages, changelogs, documentation, job boards, and review sites, detects what changed since its last run, and delivers a single ranked briefing rather than a stream of alerts. It differs from a monitoring tool mainly in the output: the point is one readable document on a cadence, not a notification per event.

Why does my competitor monitoring agent keep reporting no changes?

Usually because it is broken, not because the market is quiet. A large share of pricing and product pages now render content in JavaScript or sit behind bot protection, so a plain fetch retrieves an empty shell that diffs cleanly against the previous empty shell. Add an assertion that the fetched page contains what that page type should contain, such as a currency symbol on a pricing page, and alarm when it does not.

Can an agent scrape any competitor website?

No, and planning around that is part of the design. Some sites block automated access outright, others require JavaScript rendering, and terms of service vary. Treat the competitor list as constrained by what you can reliably and permissibly read, and record which surfaces you cannot cover rather than pretending the list is complete. A briefing with known gaps is more useful than one with invisible ones.

How often should a competitive briefing run?

Weekly for nearly all teams. Markets rarely move at a daily resolution that a briefing can meaningfully detect, and a daily digest trains its readers to skim and then to ignore. If a weekly briefing is consistently too long, the correct fix is usually tighter materiality ranking or a shorter competitor list, not a shorter interval.

Can I trust the prices an agent reports?

Only if each one carries a source link and a checked date. Summarising models produce equally fluent prose whether or not the underlying fetch succeeded, so fluency is no signal of accuracy. Require every figure to be clickable back to the vendor's own page, treat anything older than about a month as needing a re-check, and do not accept prices sourced from aggregators or third-party roundups, which are frequently out of date.

Is this different from a Google Alert?

Yes, in scope and in shape. Alerts cover news mentions, which is the most public and least differentiated surface, and they deliver one message per event. A briefing agent watches surfaces that are public but unwatched, such as documentation and job postings, batches a period's changes into one ranked document, and can tell you that a pricing page changed, which alerts generally cannot.

Sources