Competitor pricing-page watch
Firecrawl + Notion
Who it's for
Product marketers and AEs who want to know when a competitor changes their pricing page, and want the team's battlecard to stay current without anyone rewriting it by hand. Firecrawl can be swapped for Apify for the scrape (schedule an Actor run instead of a monitor). Notion can be swapped for Airtable.
What you get
A pricing change found by the monitor, with the battlecard update waiting for approval. Sample output: every company and person in it is fictional.
Competitor: Tidewell Metrics (fictional) Page: https://tidewell-metrics.example/pricing Scraped: Oct 16, compared with the battlecard's pricing section (last updated Sep 2) What changed: | Plan | Battlecard says | Page says now | Quote from the page | |---|---|---|---| | Starter | $29/user/mo | $35/user/mo | "Starter $35 per user / month, billed annually" | | Growth | 10 dashboards | Unlimited dashboards | "Unlimited dashboards" | | Enterprise | Contact sales | Contact sales | (no change) | | Team (new) | not listed | $19/user/mo, max 5 users | "Team $19 per user / month, up to 5 users" | Not compared: the page shows monthly and annual prices. Both rows above are the annual price. Draft update to 'Battlecard: Tidewell Metrics (fictional)' in Notion (not made yet): - Replace the pricing table with the one above - Add a line under 'Where we win': "Their Starter went up 20%. Our entry plan is now cheaper per seat for teams over 5." - Comment on the page: "Pricing updated Oct 16 from tidewell-metrics.example/pricing" Reply 'approve' to update the page, or tell me what to change.
Time and cost
Estimate About 15 minutes to set up, then 5 minutes each time a change is found.
Assumptions: One competitor pricing page, one scrape at setup, one monitor, and about one change a month that leads to a second scrape and one Notion update.
- Firecrawl: One scrape with JSON extraction at setup and one per change found (the scrape credit plus the JSON extraction add-on each time), and one monitor created after you approve it. Every call uses credits. Firecrawl is credit-based: Scrape 1 credit/page, Crawl 1 credit/page, Map 1 credit/call, Search 2 credits/10 results, Interact 2-7 credits/browser minute, plus option add-ons (e.g. JSON extraction +4/page). Alexandria runs cost the price listed on each tool; discovery is free. Keyless MCP is free but capped per IP per day by requests and credits. Source: docs.firecrawl.dev, checked 2026-10-16
- Notion: One search and one page read per run, then one page update and one comment after you approve them. Credit use not confirmed by Notion.
Exact credit costs depend on your plan with each vendor. Check the tool pages before a large run.
MCP servers
Every server is confirmed in: ClaudeChatGPTClaude CodeCursor
-
ClaudeChatGPTClaude CodeCursorRead + writeEvery call uses credits
https://mcp.firecrawl.dev/v2/mcp-oauth -
ClaudeChatGPTClaude CodeCursorCopilotRead + writeCredits not confirmed
https://mcp.notion.com/mcp
Set up in a chat app
Every server in this recipe is confirmed for Claude and ChatGPT. Connect each one, then paste the prompts below into one conversation.
- Connect Firecrawl without code (Claude, ChatGPT)
- Connect Notion without code (Claude, ChatGPT)
Developer setup
Auth setup and mcp.json for Claude Code and Cursor
- Firecrawl: Sign in with OAuth, or pass an API key as a Bearer token for headless use.
- Notion: Sign in with OAuth in your client (run
/mcpin Claude Code). Do it once interactively, and the client stores and refreshes the token.
Put this in .mcp.json (Claude Code, project root) or ~/.cursor/mcp.json (Cursor). Swap the example keys for your own, and don't commit real ones. Remove the // comment lines if your client requires strict JSON.
{
"mcpServers": {
"firecrawl": {
"url": "https://mcp.firecrawl.dev/v2/mcp-oauth"
// headless alternative: "headers": { "Authorization": "Bearer YOUR_FIRECRAWL_API_KEY" }
},
"notion": {
"url": "https://mcp.notion.com/mcp"
}
}
}
Step-by-step prompts
- Use Firecrawl to scrape {competitor_pricing_url} with JSON extraction. For each plan, pull the plan name, monthly price, annual price, currency, user or usage limits, and the main features listed. Show me a table, and quote the page text for each price. Scrape only that one page.
- Search Notion for the {competitor} battlecard under {battlecard_parent_page}. Show me its current pricing section next to the Firecrawl table, and list every difference. Don't change anything.
- Set up a Firecrawl page-change monitor on {competitor_pricing_url} only after I approve it. Before you create it, tell me exactly what it will watch.
- Check my Firecrawl monitor on {competitor_pricing_url}. If it found a change, scrape the page again with the same JSON extraction and show me what changed against the battlecard: old value, new value and the quoted page text. If only non-pricing content changed, say so and stop.
- Draft the battlecard update: a new pricing table and one line on what it means for us. After I approve it, update the pricing section of the Notion page (or append a dated 'Pricing change' section if there isn't one), and add a comment with the date and source URL.
Run it on a schedule (optional)
- The Firecrawl monitor does the watching, so you don't need to schedule the scrape. Check the monitor weekly, or whenever your team reviews competitive updates.
- If you schedule the check, stop at the draft. Save the summary somewhere you'll see it, and approve each Notion update yourself.
- Monitors are a Firecrawl write action and aren't available on a keyless connection. Connect with Firecrawl's OAuth sign-in or an API key before you set one up.
Where this goes wrong
- Monthly and annual prices mixed up. Many pricing pages toggle between monthly and annual billing. Ask the extraction for both prices and the billing period as separate fields, and quote the page text for each price before you compare anything.
- A renamed plan reads as a removed plan. If a competitor renames 'Growth' to 'Business', the diff shows one plan gone and one new. When a plan disappears and a new one appears in the same run, compare their prices and limits and ask me before calling it a removal.
- Cosmetic changes trigger updates. A page-change monitor can flag changes that have nothing to do with pricing, like a new testimonial or a date in the footer. Only draft a battlecard update when a price, plan name, limit or listed feature changed. Otherwise report 'no pricing change' and stop.
- Overwriting a teammate's edits. Someone may have edited the battlecard since your last run. Read the page fresh before drafting, show old and new text side by side, and only replace the pricing section, not the whole page.
Gotchas
- Firecrawl charges credits per call, and JSON extraction is an add-on on top of the scrape credit. Scrape one page, not the whole site.
- A keyless Firecrawl connection only exposes Search, Scrape and Parse. You need OAuth or an API key for monitors.
- Notion workspace admins can control whether members can connect Notion's MCP server. If you can't connect, ask your admin.
- Notion's help center names ChatGPT Pro as the supported ChatGPT tier. On other ChatGPT plans, ask for the update as text and paste it into the page yourself.
Download
Get the prompts, guardrails and expected output as one Markdown file. Paste it into a Claude Project or ChatGPT project's instructions, or save it as CLAUDE.md for Claude Code.
Download competitor-pricing-watch.md