Skip to content

From a URL to a decision, in six steps.

Competitor monitoring is easy to demo and hard to keep useful. Every stage below exists because the obvious version of it produces noise, and noise is how a monitoring product dies.

Crawl

A real browser, on a schedule you control

Pages render in headless Chromium, so a pricing table built client side is captured just like a static one. Each source has its own interval. robots.txt is checked, failures back off, and a source that keeps failing is marked as broken rather than silently skipped.

  • Playwright rendering
  • Per-source intervals
  • robots.txt + backoff
  • Per-workspace isolation
Extract

Structure first, model second

Rule-based selectors run first because they are deterministic and free. When a page's structure shifts or breaks, an LLM extraction pass takes over. Extraction that fails marks the source degraded rather than returning an empty result. An empty result reads as "they deleted all their pricing" and fires a false alarm.

  • Selector rules first
  • LLM fallback
  • Drift detection
  • Never degrades to empty
Diff

Field level, so noise never reaches you

Snapshots are compared as structured fields, not as text. Reordered testimonials, whitespace churn and a copyright year rolling over produce nothing at all. A tier price, a feature list, a plan name changing produces exactly one finding.

  • Structured comparison
  • No false positives from reflow
  • One change, one finding
  • Idempotent re-runs
Classify

Type and urgency, validated before it's stored

Each change is classified as pricing, feature launch, messaging, hiring, funding or partnership, then assigned an urgency. Model output is validated against a schema first. Malformed output is kept as a finding marked classification_failed rather than being invented or dropped.

  • Eight change types
  • High / medium / low
  • Schema-validated output
  • Never silently dropped
Route

Rules per change type, not one global threshold

A rule is (change type, minimum urgency) → channels, set per workspace with per-competitor overrides. Pricing goes to Slack at any urgency, hiring only to the weekly digest. The same change caught on two sources collapses into one alert.

  • Email, Slack, webhook
  • Per-competitor overrides
  • Mutes with auto-unmute
  • Cross-source dedupe
Understand

A live battlecard, and answers with citations

Positioning, strengths, weaknesses and pricing tiers update as findings land. Each section shows when it changed and which finding changed it. Ask questions across the accumulated history and get answers that cite their findings, or say plainly that nothing relevant was captured.

  • Self-maintaining battlecard
  • Section-level provenance
  • Cited Q&A
  • Declines rather than guesses

Ten source types, one pipeline.

Sources are adapters behind a registry, so crawling, diffing and classification never branch on type. Adding a new one does not disturb the ones already running.

Website

Full-page render, structured extraction of the pitch and feature claims.

Pricing page

Tracked on its own, because it moves on a different cadence and matters most.

RSS / blog

Feed parsing for announcements, launches and positioning shifts.

GitHub

Releases, changelog and issue activity for engineering-led competitors.

Hacker News

Public API. Launches, and what people actually said about them.

Reddit

Public API. Community sentiment and complaints that never reach a blog.

Product Hunt

Launch posts, positioning at launch, and reception.

YouTube

Channel uploads via the public Data API, so demos and product videos land too.

App Store

Release notes and version history for mobile-first competitors.

Google Play

The same, on the other side of the market.

See it on your actual competitors.

The free plan tracks three of them. Baseline battlecards generate on the first crawl.