Skip to main content
A competitor moves a seat limit from the Team plan to Business on a Tuesday afternoon, and your sales team finds out from a prospect three weeks later. Checking pricing pages by hand is the job everyone agrees matters and nobody does. This program watches each pricing page, and when one really changes, an agent reads the new page and its fine print, lines it up against the plans as they were, and posts a brief to Slack: what changed, plan by plan, and what it means for your own pricing.

What you need

  • An Outcrawl API key in OUTCRAWL_API_KEY.
  • A Slack incoming webhook URL in SLACK_WEBHOOK_URL. Posting to it is plain HTTP from your code, so no Outcrawl integration is involved.
  • A server reachable from the internet (the monitors post to it), and a long random string in HOOK_TOKEN for its path.
  • Node with express, or Python with fastapi, uvicorn and httpx.

How it works

1

A monitor watches each pricing page

monitors.create checks each page every 30 minutes. Timestamps, nonces and ads are stripped before comparing, ignoreSelectors drops the rotating testimonials, and each check is 1 credit whether or not anything changed.
2

A real change posts to your endpoint

The monitor sends monitorId, url, label, checkedAt, the diff and, with judge: true, a one-line summary. It sends once and never retries, so the endpoint answers 202 at once and does the work afterwards.
3

Your endpoint starts an agent run

A monitor cannot start an agent itself; your code calls oc.agent with the diff and the plans recorded after the last change. Rules keep the run on that competitor’s site and stop it signing up for anything.
4

The agent reads the page and writes the brief

It reads the live page and the comparison table, FAQ and fine print it links to, and answers in a schema: every plan with prices and limits, each change with before and after, what it means, and one suggested response.
5

Your code posts it to Slack

The brief goes to Slack as Block Kit, with the run’s replay so anyone on your team can check what the agent read. The plan table is saved as the baseline for the next change.

The program

Run it once with watch to create the monitors, then run it as a server.
Outcrawl keeps no history of a monitor’s checks: monitors.list answers each monitor’s lastCheckedAt and lastStatus, not old diffs. That is why the program saves the plan table itself in pricing-state/ and hands the last one to the next run as “before”. The first change for each competitor has only the diff to compare against; every one after that has the full plan table.
A monitor delivers each change once. If your server is down when it posts, that change is not sent again, and the next brief compares against the plans saved before it. Keep the endpoint up, and have it answer before doing any work, as both versions above do.

What you get back

The agent’s answer, as the schema shapes it:
In Slack it arrives as a header with the headline, one line per change (• *Business*: Monthly price (was $39 per seat, now $49 per seat)), the two paragraphs, and a footer linking the page, the replay and the credits the brief cost.

What it costs

  • Watching is 1 credit per check, whether or not the page changed, plus the model’s usage when a changed page is judged (judge: true), per pricing. Three pages checked every 30 minutes is 4,320 checks a month, so 4,320 credits a month.
  • Each brief is one agent run, billed for the model’s usage, browser time and proxy usage. A typical run costs about 15 credits a minute all in; the real figure depends on the task and how heavy the pages are. About 90 s is about 23 credits per brief. Each run’s caps.budget is 100.
  • Six real changes a month across the three competitors: 4,320 + 6 × 23, about 4,458 credits a month, plus model usage for the six judged changes. That fits the Builder plan’s 10,000.
A change that is only a new banner still starts a brief. Add its selector to ignoreSelectors and the monitor stops seeing it.

Make it yours

  • Post straight to a channel with no server: notify: { slack: '<incoming webhook URL>' } sends the monitor’s own diff and summary to Slack, without the agent’s brief.
  • Watch the changelog and the docs’ limits page as well as the pricing page, with one monitor per URL on the same endpoint.
  • Put the brief where your team decides: open a Linear issue, update a Notion table or a HubSpot property with one more HTTP call after the Slack post.
  • Watch a pricing page behind a login by creating the monitor and the run with the same profile.

Monitors

Schedules, notify targets and normalisation.

Agents

Tasks, caps and typed results.

Rules

Keep a run on one site.

Sessions and replay

See exactly what the agent read.