ideas.
May 06, 2026 3 min read browser-extensionb2bdata

Competitor pricing tracker for product managers

A browser extension that extracts and logs pricing tiers from any SaaS pricing page into a local store, so product managers can track competitor pricing changes over time without manual copy-paste.

The idea

A browser extension with a one-click capture button: land on a competitor's pricing page, click capture, and the extension extracts plan names, prices, billing cycles, and key feature limits from the page content, then saves a timestamped snapshot to a local store. Over weeks and months you accumulate a structured history of competitor pricing without maintaining a spreadsheet or taking screenshots. Open the extension popup to see a side-by-side diff between any two captures for the same company.

Why build this

SaaS pricing changes constantly — plans get renamed, prices shift, tiers collapse or expand. Product managers typically track this through occasional manual spot-checks or screenshots buried in Slack threads. The result is patchy, inconsistent data that makes it hard to know whether you're priced aggressively or if a competitor just quietly raised prices. The technical lift to automate this is small: extract the page text, normalize it with a structured-output LLM call, store it locally. No scraping infrastructure, no cron jobs, no server.

The LLM normalization step is what makes this tractable across arbitrary pricing pages. Writing site-specific parsers for every competitor's layout is maintenance-heavy and breaks on redesigns. Sending the page text to a small model and asking for JSON back handles varied layouts without any custom code per site.

Stack sketch

  • Extension framework: Manifest V3 (Chrome and Firefox compatible via the WebExtensions API)
  • Extraction: Content script grabs the visible page text after a 1.5 s settling delay; background service worker sends it to the Anthropic API (claude-haiku-4-5) with a prompt requesting {company, plans: [{name, price_monthly, price_annual, billing_notes, key_limits}]} as JSON
  • Local storage: IndexedDB via Dexie.js — one logical table per tracked company, rows keyed by capture timestamp
  • Diff view: Simple string comparison between the two most recent JSON snapshots; highlight changed fields in the popup table
  • Export: One-click CSV or JSON download of the full capture history for any company or all companies
  • Optional self-hosted mode: Point the extension at a locally running Ollama endpoint (llama3.2 or mistral) instead of the Anthropic API so page text never leaves the machine

Scope for v1

  • Capture button in the extension popup; user confirms or corrects the auto-detected company name before saving
  • History table per company: each row is a capture timestamp plus a summary of plan count and price range; click a row to see the full extracted JSON
  • Diff indicator between the two most recent captures for a company — highlighted fields that changed, no change detection beyond that
  • CSV export per company and a full-history JSON export
  • Settings panel: API key input, toggle for Ollama mode with endpoint URL field
  • Out of scope for v1: scheduled background recaptures, push notifications on price changes, team sync, direct Notion or Airtable integration, any server-side component

Where it could go

Scheduled monitoring is the obvious next step. The Manifest V3 background service worker can register a periodic alarm (Chrome's chrome.alarms API) that wakes weekly, re-fetches the last-known URL for each tracked competitor, and runs the extraction silently. A badge count on the extension icon shows how many competitors changed pricing since the last manual review. This turns a passive log into an active alert system with no additional infrastructure.

The second direction is a shared team database. A minimal Node.js endpoint that accepts capture payloads and serves a merged history lets a whole product team contribute to the same intelligence store. Each person's extension pushes new captures; everyone sees the full team's history. The local-first schema carries over unchanged — the sync layer is just an append log on top.

Watch out for

Many pricing pages load key content dynamically — annual/monthly toggle state, feature details hidden in accordions, prices revealed only after JavaScript renders. A fixed settling delay catches most cases, but some pages will still yield incomplete extractions. The pre-commit review screen (where the user sees the extracted JSON before it saves) is not optional: it is the primary error-correction mechanism, and skipping it in the name of "one-click" will fill the history store with garbage.