Competitor SaaS Pricing Change Monitor
Pricing
from $5.00 / 1,000 analyzed pages
Competitor SaaS Pricing Change Monitor
Track competitor SaaS pricing pages and product changelogs. Extract plans, prices, trials and discounts, then receive typed alerts when a price, plan or release changes.
Pricing
from $5.00 / 1,000 analyzed pages
Rating
0.0
(0)
Developer
Juddroid
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Watch competitor SaaS pricing pages and product changelogs. Get structured alerts when a price, plan, trial, discount or release changes, without reviewing noisy page diffs.
Use it for competitive intelligence, product marketing and sales enablement. The first run creates a baseline; scheduled runs report only meaningful changes and can send them directly to Slack or any webhook.
What does SaaS Pricing & Changelog Monitor do?
You give it a list of SaaS pricing pages and changelog pages. For each pricing page it extracts the plans (name, price, currency, billing period, free or contact-sales, CTA, top features), plus page-level signals such as free trial length, free plan and annual discount wording. For each changelog it extracts the latest release entries (date, title, version, link), preferring the site's RSS/Atom feed when the page links one. Every run stores a normalized snapshot per URL, and the next run compares against it. You then get events like price_changed, plan_added or new_changelog_entry rather than a raw page diff.
Why use it
- Typed changes, not text diffs. Each change has a type, the plan name, before/after values and a one-line message, ready to filter or forward to Slack.
- Low noise. Whitespace, countdown timers, dates in promo banners and tracking parameters are normalized away. Pages that fail to load or return no usable data never overwrite your baseline, so a temporary block does not trigger fake "plan removed" alerts.
- Pricing and changelogs in one Actor. Track a competitor's prices and what they ship from one schedule, one dataset and one webhook.
- Works on many layouts. Repeated plan cards (with "Custom"/"Contact sales" enterprise tiers), comparison grids, schema.org JSON-LD offers, changelog feeds, date-grouped lists and article cards.
- Honest about limits. Pages that only render prices with JavaScript are flagged
js_rendering_likely_requiredand not charged. - Webhook built in. Optional POST with a Slack-compatible
textfield when something changes.
What data you get
| Field | Description |
|---|---|
url, finalUrl, label | Input URL, URL after redirects, your label |
pageType | pricing or changelog (auto-detected unless you set it) |
status | ok, no_data, failed or invalid_input |
statusCode, title | HTTP status and page title |
summary | One-line human summary of the page and its changes |
pricing.plans[] | name, price {amount, currency, raw}, period (month/year/one-time/custom), billingNote, isFree, isContactSales, ctaText, features |
pricing.* | hasFreeTrial, trialDays, hasFreePlan, annualDiscountText, discountMessages[], currencySymbols[], ctas[], prices[], priceRange (from JSON-LD) |
changelog.entries[] | date, title, version, url, newest first, up to 20 |
changelog.* | source (feed or html), feedUrl, entryCount, latestEntryDate |
changeStatus | baseline (first run), changed, unchanged or not_monitored |
changes[] | Typed changes: price_changed, plan_added, plan_removed, trial_changed, free_plan_changed, discount_changed, new_changelog_entry |
warnings[] | For example js_rendering_likely_required, currency_changed_possible_geo_pricing, no_plan_cards_detected |
checkedAt | ISO timestamp |
How to use
- Open the Actor and paste your pages into Pages to monitor. Plain URLs work; add
typeandlabelif you want. - Keep Detect changes since the last run on. The first run records a baseline.
- Optionally add a Webhook URL (for example a Slack incoming webhook).
- Save it as a task and add a schedule (daily or weekly). From the second run on you get typed changes.
{"pages": ["https://linear.app/pricing","https://vercel.com/pricing",{ "url": "https://github.blog/changelog/", "type": "changelog", "label": "GitHub changelog" },{ "url": "https://vercel.com/changelog", "label": "Vercel changelog" }],"monitorChanges": true,"snapshotStoreName": "saas-pricing-snapshots","onlyOutputChanges": false,"webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ","proxyConfiguration": { "useApifyProxy": true },"maxConcurrency": 3}
Copy-paste recipes
Pricing watchlist - three competitors
{"pages": [{ "url": "https://linear.app/pricing", "type": "pricing", "label": "Linear" },{ "url": "https://vercel.com/pricing", "type": "pricing", "label": "Vercel" },{ "url": "https://www.notion.com/pricing", "type": "pricing", "label": "Notion" }],"monitorChanges": true,"snapshotStoreName": "competitor-pricing"}
Product launch watch - changelogs only
{"pages": [{ "url": "https://github.blog/changelog/", "type": "changelog", "label": "GitHub" },{ "url": "https://vercel.com/changelog", "type": "changelog", "label": "Vercel" }],"monitorChanges": true,"onlyOutputChanges": true}
Slack alerts - pricing and releases together
{"pages": ["https://linear.app/pricing", "https://linear.app/changelog"],"monitorChanges": true,"webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"}
Output example
A pricing page (trimmed, from a real run):
{"url": "https://linear.app/pricing","pageType": "pricing","status": "ok","statusCode": 200,"title": "Pricing – Linear","summary": "4 plans: Free USD 0; Basic USD 10/month; Business USD 16/month; Enterprise contact sales","pricing": {"plans": [{ "name": "Free", "price": { "amount": 0, "currency": "USD", "raw": "$0" }, "period": null, "isFree": true, "isContactSales": false, "ctaText": "Get started", "features": ["Unlimited members", "2 teams", "250 issues"] },{ "name": "Basic", "price": { "amount": 10, "currency": "USD", "raw": "$10 per user/month" }, "period": "month", "billingNote": "billed yearly; per user", "isFree": false, "isContactSales": false, "ctaText": "Get started" },{ "name": "Business", "price": { "amount": 16, "currency": "USD", "raw": "$16 per user/month" }, "period": "month", "billingNote": "billed yearly; per user", "isFree": false, "isContactSales": false, "ctaText": "Get started" },{ "name": "Enterprise", "price": null, "period": "custom", "isFree": false, "isContactSales": true, "ctaText": "Contact sales" }],"hasFreeTrial": false,"trialDays": null,"hasFreePlan": true,"annualDiscountText": null,"currencySymbols": ["$"]},"changeStatus": "changed","changes": [{ "type": "price_changed", "plan": "Business", "from": { "amount": 14, "currency": "USD", "period": "month" }, "to": { "amount": 16, "currency": "USD", "period": "month" }, "message": "Business: USD 14/month -> USD 16/month" },{ "type": "plan_added", "plan": "Basic", "price": "USD 10/month", "message": "Plan added: Basic (USD 10/month)" }],"warnings": [],"checkedAt": "2026-10-16T08:35:04.083Z"}
A changelog (entries from the discovered feed):
{"url": "https://github.blog/changelog/","pageType": "changelog","status": "ok","changelog": {"entries": [{ "date": "2026-10-16", "title": "Multi-repo support and other improvements for GitHub Copilot in Slack and Microsoft Teams", "version": null, "url": "https://github.blog/changelog/2026-10-15-copilot-in-slack-and-teams-adds-model-and-repository-updates" },{ "date": "2026-10-15", "title": "Download GitHub Code Quality license usage as a CSV", "version": null, "url": "https://github.blog/changelog/2026-10-15-download-github-code-quality-license-usage-as-a-csv" }],"source": "feed","feedUrl": "https://github.blog/changelog/feed/","entryCount": 10,"latestEntryDate": "2026-10-16"},"changeStatus": "unchanged","changes": []}
The changes values above come from a test where a stored snapshot was edited locally to simulate a price change. On a real schedule they appear when the page itself changes.
Pricing
$0.01 per analyzed page (event pricing-page-result), charged once for each page that was fetched and parsed successfully, whether it changed or not.
- 10 competitor pages checked weekly (about 44 checks a month): about $0.44 per month
- 20 pages checked daily (about 600 checks a month): about $6.00 per month
- 1,000 page checks: $10.00
Not charged: invalid URLs, pages that fail to load (DNS errors, timeouts, HTTP 4xx/5xx, blocks), pages with no usable data (for example prices rendered only by JavaScript), the extra request to a changelog's RSS feed, snapshot storage and webhook calls. "Only output changed pages" filters the dataset but does not change the cost: unchanged pages are still analyzed.
Integrations and scheduling
- Schedules: create a task with your page list and run it daily or weekly. Baselines live in the named store (
saas-pricing-snapshotsby default), so every scheduled run compares against the previous one. Use a different store name per project to keep baselines separate. - Webhook: set
webhookUrlto get one POST per run when at least one page changed. The JSON includestext(works directly with Slack incoming webhooks),pagesChangedand the fullchangesper page. A run summary is also saved to theSUMMARYrecord of the run's key-value store. - API, Make, Zapier, n8n: read the dataset or use Apify integrations to forward
changesanywhere. - MCP and AI agents: the typed
changesarray and one-linesummaryare easy for agents to read. Use this Actor through the Apify MCP server for competitive-intelligence workflows.
FAQ and limitations
Which layouts work? Plan cards with a name and a price (most SaaS pricing pages), "Custom"/"Contact sales" tiers next to them, grids split into several rows, comparison tables, and schema.org Offer/AggregateOffer data. In our tests, Linear, Vercel, Notion, Basecamp, Supabase, Tailscale and Mailchimp returned every plan, and Buttondown's plans came from JSON-LD.
What does not work? Prices rendered only by JavaScript (no headless browser is used), so those pages are flagged and not charged. Pages behind a login also don't work. Calculator or slider pages (for example a "pick your pageviews" slider) usually yield a priceRange or prices list rather than named plans. Some site builders that duplicate content for each breakpoint may return only part of the plans. Feature lists are best effort and are not used for change detection.
Why did prices switch currency? Many SaaS sites localize prices by visitor country. If the proxy country changes between runs, you may see a currency_changed_possible_geo_pricing warning, and per-plan price changes are suppressed for that run. For stable monitoring, pin a proxy country (for example "apifyProxyCountry": "US") or run without a proxy from a fixed location.
How are changelog entries matched? By entry URL and by normalized title, so a typo fix or tracking parameter does not create a "new" entry. If the source switches between feed and HTML, the Actor re-baselines instead of reporting old entries as new.
Can I still pass a simple list of URLs? Yes. pages accepts plain strings, and the older urls input field is still read for existing tasks.
Is this legal? The Actor reads publicly available pages only, at low request rates, and does not log in or collect personal data. You are responsible for complying with each website's terms of service and applicable laws in your jurisdiction. Use the data for competitive research and monitoring, not for republishing copyrighted content.