Marketing Prompt Hub
All posts
Published · 6 October 2026 · 12 min read · Agent build

Run a marketing monitoring agent in the background with OpenClaw

Most competitor alerts tell you something changed. This one tells you whether it matters, and refuses to guess when it doesn't know.

What this post covers
  1. The output is a decision, not a diff
  2. What is actually worth watching
  3. The three files that make it work
  4. The Skill
  5. Running it in the background without handing it the keys
  6. Silence is the default output
  7. Where it breaks
  8. The first run is manual
  9. Where the Hub fits

I have had a Google Alert for a competitor's brand name sitting in a Gmail filter since before I started this business. I have never once acted on one. That is not a Google problem. It is a format problem: an alert is a diff, and a diff is not a decision. Nobody opens a browser tab because a sentence on someone else's homepage changed. The useful version of competitive monitoring is a short weekly note that says "these two things moved, here is what they imply for your positioning, here is the one thing I would do about it," and that is a judgement task, which means it is an agent task.

The usual take on this is that you need a monitoring tool. You do not. Monitoring tools are good at detecting change and structurally bad at interpretation, because interpretation requires knowing your positioning, your price, and what you are choosing not to compete on. A background agent with read access to the web and a file with your context in it beats a $99/month change-detection SaaS at the only part that was ever hard. The catch, and it is a real one, is that an unsupervised agent reading web pages will confidently tell you a page did not change when what actually happened is the fetch failed. Most of the work below is about making that failure loud instead of silent.

The output is a decision, not a diff

Before any config, decide what the agent is allowed to hand you. Mine produces exactly three things per competitor per run:

1. What changed, quoted, with the URL and the date it was fetched. 2. The read, one or two sentences on what it implies about their strategy. 3. The move, either a concrete suggestion or the literal words "no action."

"No action" being a permitted and frequent output is the whole design. An agent that always finds something interesting is an agent that is inventing things to stay useful. Write that permission into the Skill explicitly or you will get padding, because padding is the default behaviour of every model when the honest answer is boring.

Quotes are non-negotiable. If the agent cannot quote the changed text, it did not see the change. Paraphrased change reports are where hallucination lives.

What is actually worth watching

Not social. Social is a firehose of their marketing team talking to itself. Watch the pages that cost someone an internal approval to change, because those are the ones that encode a decision.

SurfaceWhy it mattersCheck cadence
Pricing pageThe highest-signal page on any site. A tier added, removed, or renamed is a strategy change.Weekly
Homepage hero + subheadTheir positioning in 15 words. Changes here are expensive and deliberate.Weekly
Careers / jobs pageHiring a "Head of Partnerships" tells you the next channel before the launch does.Monthly
Changelog / release notesShipping cadence and where the roadmap actually went.Weekly
Docs or help centre navNew top-level section means a new product surface.Monthly
Blog, titles onlyKeyword and theme drift. Titles are enough. Do not read the posts.Weekly
Ads landing pages you already know aboutTheir paid promise, which is usually braver than their homepage.Weekly

Keep it to five competitors and six URLs each at the absolute most. I run three. A watchlist of twenty companies produces a report nobody finishes, and the thing you are optimising for is a note you will actually read on a Monday.

Two ground rules on the fetching, because this is someone else's property: public pages only, nothing behind a login or a paywall, and one polite pass per scheduled run. You are reading their marketing, which they published on purpose. You are not crawling them.

The three files that make it work

The agent is stateless between runs. The files are the memory. This is the layout:

competitive-monitor/
├── watchlist.md        # who and what URLs, plus my own positioning
├── state/
│   ├── acme.md         # last-seen snapshot per competitor
│   ├── borealis.md
│   └── cedar.md
└── log/
    └── 2026-10-06.md   # the dated report the agent writes

watchlist.md carries your context too, and that is the part people skip:

# Watchlist

## My position (the agent reads this before judging anything)
We sell a one-time-payment prompt and Skill library for marketers using Claude.
No email gate on free material. No per-seat pricing, ever. No calls, no coaching.
We compete on taste and honesty, not on volume of prompts.
Things that would genuinely matter to us: a competitor going
one-time-payment, a competitor shipping tested Claude Skills (not prompt PDFs),
a competitor dropping their email gate.
Things that do NOT matter to us: their follower counts, their webinar schedule,
another "500 AI prompts" bundle.

## Acme
- https://acme.example/pricing
- https://acme.example/
- https://acme.example/careers

## Borealis
- https://borealis.example/pricing
- https://borealis.example/changelog

That "things that do NOT matter" block is doing more work than the URL list. Without it the agent reports every change with equal weight, which is the same as reporting nothing.

A state/ file is just the last-seen text the agent captured, so the next run has something to compare against:

# Acme ,  last seen 2026-09-29

## /pricing
tiers: Starter $19/mo · Team $49/seat/mo · Enterprise "contact us"
annual discount: 2 months free
fetch: ok

## /
hero: "The AI marketing platform that scales with you"
subhead: "Join 40,000 marketers automating their content."
fetch: ok

The Skill

This is the whole thing. Drop it at .claude/skills/competitive-monitor/SKILL.md.

---
name: competitive-monitor
description: Checks a watchlist of competitor pages against last-seen state,
  reports only material changes with quotes and URLs, and refuses to guess.
  Use for scheduled or on-demand competitive monitoring runs.
---

# Competitive monitor

## Inputs
- `watchlist.md` for targets and for MY positioning. Read it first, fully.
- `state/<competitor>.md` for last-seen text. If absent, this is a baseline run.

## Procedure
1. Fetch each URL in the watchlist, one pass each.
2. For every fetch, record `fetch: ok` or `fetch: FAILED (<reason>)`.
   A failed fetch is NEVER reported as "no change." Report it as a gap.
3. Compare the page against the matching section of the state file.
4. Classify each difference:
   - MATERIAL: pricing, tier names, positioning line, new product surface,
     a change touching anything in my "would genuinely matter" list.
   - COSMETIC: wording polish, image swaps, testimonial rotation, nav reorder.
   - UNKNOWN: you cannot tell whether it is a real change or an A/B variant.
5. Write `log/<YYYY-MM-DD>.md`. Overwrite the state files with what you saw,
   only for URLs where `fetch: ok`.

## Output format, per competitor
**Changed:** the quoted before and after, with URL. Quote or it did not happen.
**Read:** one or two sentences on what it implies. Tie it to my positioning.
**Move:** a concrete action, or the literal words "no action."

## Hard rules
- Never report a number you did not read on the page. Write
  `[MISSING: REAL NUMBER]` instead.
- Never infer a price from a screenshot, a cached snippet, or memory.
- "No material changes this week" is a complete, correct, and welcome report.
  Do not pad. Do not promote a COSMETIC change to fill space.
- Do not visit anything requiring a login. Do not follow links outside the
  watchlist domains.
- One summary line at the top: `N targets · N ok · N failed · N material`.

The hard rules section is the difference between a tool and a liability. A monitoring agent that invents a competitor's price is worse than no monitoring agent, because you will quote it in a sales conversation.

Running it in the background without handing it the keys

This is where OpenClaw or any scheduled-agent setup earns its place: the run is boring, repetitive, and happens whether you remember it or not. Schedule it for a weekday morning before you start, so the report is sitting in the folder when you open your laptop.

The permission posture matters more than the schedule. A background agent on a loop with broad write access is how you get a surprise. Scope it down to the shape of the job:

Schedule:   weekly, Monday 07:00 local
Skill:      competitive-monitor
Network:    fetch only, GET only, watchlist domains only
Write:      competitive-monitor/state/** and competitive-monitor/log/** only
Deny:       posting, emailing, publishing, CRM writes, any credential store
Notify me:  only when the run reports >=1 MATERIAL change, or >=1 failed fetch

The deny list is the real config. A competitive monitor has no business touching your CRM, your social accounts, or your publishing pipeline. It reads public pages and writes two folders. If the agent runner you are using cannot express that boundary, run it with a read-only web tool and let it hand you text instead of writing files.

Notify on failure, not just on findings. If the agent is silent for three weeks, you need to know whether that is "nothing happened" or "the fetch has been 403ing since the first Monday." Those feel identical from the outside and they are opposites. Make a failed fetch wake you up the same way a pricing change does.

Silence is the default output

The temptation, once this is running, is to ask for more: sentiment, review mining, ad library sweeps, LinkedIn tracking. Resist it for at least a month. The agent's credibility comes from the fact that when it says something moved, something moved. Every extra surface you add raises the noise floor and lowers the odds you read the Monday note at all.

Here is the on-demand version for when you actually want to go deep on one competitor, which is a different job and should stay a different job:

Read competitive-monitor/watchlist.md for my positioning, then read the last
8 weeks of files in competitive-monitor/log/ for <COMPETITOR>.

Give me:
1. The sequence of changes, in order, with dates and quotes.
2. The pattern. What are they converging on? Say "no discernible pattern"
   if the changes are unrelated. Do not manufacture a narrative.
3. The one thing this changes about MY positioning, or "nothing yet."
4. What I would need to see next to confirm or kill the pattern.

Rules: quote or stay silent. No numbers you did not read in the logs.
Mark anything you are inferring as INFERENCE, explicitly.

Point 4 is the one I use most. It turns a vague hunch into a falsifiable thing you will recognise in four weeks.

Where it breaks

Honest list, from running this pattern rather than from imagining it.

JS-rendered pricing tables. Plenty of pricing pages render the numbers client side. A plain fetch gets you an empty shell, and the agent has to be told that an empty shell is a failed fetch and not a removed pricing tier. That instruction is in the Skill above for a reason.

A/B tests look exactly like strategy changes. You will get a "they changed their hero" report that is one bucket of a split test. This is what the UNKNOWN classification is for. Two consecutive runs showing the same new text is a change. One run is a maybe.

Cookie walls and consent gates will hand the agent a modal instead of a page. Same rule: that is a failed fetch.

The agent reporting on itself. Long context plus a vague brief produces summaries of summaries. The dated log files keep each run anchored to text that was actually fetched on a date.

The honest one: you still have to read it. Automating the collection does not automate the deciding. If three Mondays go by and you have not opened the log, the right move is to delete the schedule, not to add a Slack integration to it.

The first run is manual

Do not schedule this until you have run it by hand twice. The first run is a baseline, it will report nothing, and that is correct. The second run, a week later, is where you find out whether your watchlist is pointed at pages that actually move. Mine started with eleven URLs and I cut it to nine within a fortnight, because two of them were blog index pages that changed every few days and told me nothing.

If you want a worked example of the judgement layer before you automate anything, the Competitive Teardown Skill is free at /skills/, with no email gate. It does the one-off deep version of what this agent does on a schedule: reads a competitor's public positioning and pricing and tells you where they are actually strong, with the same refuse-to-invent discipline. Run the teardown manually on your top competitor first. If the output is useful to you, the scheduled monitor is just that teardown on a timer, and you will know what good looks like before you stop watching it closely.

Where the Hub fits

The Skill above is the whole monitor. Copy it, change the watchlist, you are done, and if that is all you needed then take it and go. The free Skills at /skills/ and the four free prompts at /free/ have no email gate and never will, and Competitive Teardown specifically covers the judgement half of this post.

The paid agent pack exists for the case where one monitor turns into five background jobs and you start caring about the boring parts: the permission posture per agent, the handoff-file conventions so jobs can read each other's output, the escalation thresholds, and the blueprints for the other agents worth running unattended (a reporting agent, a content-brief agent, an inbox-triage-for-marketing agent). That is packaging and structure, not secret prompts. If you only ever run this one monitor, the free material covers you completely, and I would rather you run one agent well than buy four you never schedule.

Get the 4 free Claude Skills.

Voice Extractor, Competitive Teardown, SERP-Informed Brief, Performance Readout. Installable Skills, ready to drag into Claude Desktop or Claude Code. No email gate.

Open the Skills page