SaaS Pricing Monitor: Track Competitor Plans avatar

SaaS Pricing Monitor: Track Competitor Plans

Pricing

from $3.00 / 1,000 page checkeds

Go to Apify Store
SaaS Pricing Monitor: Track Competitor Plans

SaaS Pricing Monitor: Track Competitor Plans

Track competitors' SaaS pricing pages: plans, prices, billing periods, limits and features, from plan cards and schema.org offers. Get a plan-level diff on change (price old to new with %, plans added or removed, features) and a plain summary. Optional browser mode for JavaScript pages.

Pricing

from $3.00 / 1,000 page checkeds

Rating

0.0

(0)

Developer

Offera Studio

Offera Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

What does SaaS Pricing Monitor do?

SaaS Pricing Monitor watches your competitors' (or vendors') pricing pages and tells you what changed, plan by plan. On every run it reads the plans from each page (name, price, currency, billing period, per-user unit, limits and feature list) and compares them with the plans it saw last time:

  • 💲 price changes, old → new with the percentage: "Pro went from $29/mo to $35/mo (+20.7%)"
  • ➕➖ plans added or removed
  • 🔁 billing period changes (monthly ↔ yearly)
  • ✅ features added to or removed from a plan's list
  • 🧾 a plain-language summary and the structured plans in every row

Give it pricing page URLs, or just domains: the Actor looks for the pricing page itself (a pricing link on the home page, then /pricing, /plans ...). Schedule it daily or weekly and connect alerts by email, Slack or webhook.

No API key, no proxy and no login. By default the Actor reads the page's HTML (fast and cheap). For pages that build their plans with JavaScript there is an optional Render JavaScript mode (a real headless browser) at the same price per page.

Who is it for?

  • Product and pricing teams: know the day a competitor raises a price, adds a tier or moves a feature between plans.
  • Sales and marketing: keep battle cards and comparison pages current.
  • Founders and analysts: build a price history of a market without checking pages by hand.
  • Procurement: watch the list prices of the SaaS tools you buy.

How to use it

  1. Click Start with the default input: three pricing pages that render without JavaScript. The first run saves a baseline (a row with the plans found).
  2. From the second run on, you get a row only when something changed (the default input also asks for unchanged rows so that a first try and Apify's daily test show something; turn Also return unchanged pages off for monitoring).
  3. Replace the pages with your competitors' pricing URLs or domains. Set a Currency hint if the pages show $ for Canadian or Australian dollars. Give the monitor a name: its snapshots live in the named key-value store pricing-monitor-<name>.
  4. If a page comes back as no-plans-found, try Render JavaScript.
  5. Add a schedule and an integration (Slack, email, webhook, Zapier, Make, n8n) to the task.

How the extraction works (and how far to trust it)

The extraction is heuristic. There is no standard for pricing pages, so the Actor uses rules for the common layouts:

  1. Plan cards. It looks for the price on the page, then for the lowest level where two or more sibling blocks each have a price and a name. From each block it reads the name (heading), the price (first price that is not struck through and not in a feature list), the billing period and unit (/mo, per user per month, billed annually), a description, the feature list (list items) and the limits (features that state a quantity, such as "10 GB storage"). Plans without a price slot ("Free", "Contact sales") are recognised too.
  2. schema.org (JSON-LD) offers, when no cards are found. They usually carry prices but no feature lists.

Each row has a confidence (high, medium or low) and extractionNotes. It measures how clean the page's structure was, not whether the numbers are right: always compare a new baseline with the page once. Typical limits:

  • the page shows one billing state (monthly or yearly, whatever it opens in). The Actor does not click toggles: you get the prices as the page shows them when it opens, and billingNote says "billed annually" where the page says so;
  • comparison tables, sliders, per-seat calculators, usage-based tiers and "from" prices are read as what the first price says;
  • prices in images, behind a login or a region switch are not read;
  • a page redesign can change what is recognised: the Actor then starts a new baseline instead of reporting every plan as removed, and a page where no plans are found keeps the old plans and gives a free no-plans-found row.

Real pages tried (static mode, 1–2 October 2026)

PageWhat the Actor read
basecamp.com/pricingFree, Freelancer $25/mo, Studio $59/mo, Pro $99/mo, Unlimited $299/mo, with feature lists (high)
ghost.org/pricingStarter $18/mo, Publisher $29/mo, Business $199/mo, Custom (billed yearly noted) (high)
fastmail.com/pricingIndividual $6, Duo $10, Family $14 and Basic $4, Standard $6, Professional $10 per user (high; the page also shows longer-term prices as extra price options)
linear.app/pricingFree, Basic $10/user, Business $16/user, Enterprise custom (high)
zapier.com/pricingFree, Professional $19.99, Team $69, Enterprise custom (high)
trello.com/pricingFree, Standard $5/user, Premium $10/user, Enterprise $17.50/user, "billed annually" noted (high, no feature lists)
loom.com/pricingStarter free, Business $18/user, Business + AI $24/user, Enterprise custom (high)
zoho.com/crm/pricingFree, Standard ₹800, Professional ₹1,400, Enterprise ₹2,400 per user (currency ₹ read correctly)
notion.com/pricingFree and Plus $10/member only: the other plans are not in the HTML (medium)
railway.com/pricingHobby $5, Pro $20, Enterprise custom: the page's free trial tier is missing
sentry.io/pricingDeveloper, Team $26, Business $80, Enterprise (the enterprise card is read as "free": wrong, though confidence says high)
posthog.com/pricing, digitalocean.com/pricingread products or add-ons, not plans: wrong for this purpose
buttondown.com/pricingone plan with a slider: low confidence, not useful
netlify.com/pricingonly schema.org data (one "Free" offer): low
figma.com/pricing, mailchimp.com/pricing, vercel.com/pricing, todoist.com/pricing, fly.io, twilio.comno plans found in the HTML (these need Render JavaScript or are not card layouts)
github.com/pricing, canva.com/pricing, pipedrive.comrefused automated access (HTTP 403): free blocked rows

Of 28 pages tried, 12 were read well (basecamp, ghost, fastmail, linear, zapier, trello, loom, zoho, slack, miro, freshworks, dropbox), 7 partly or wrongly, 6 gave no plans in static mode and 3 refused access. So expect about half of the pages to work well, a quarter to be partly or wrongly read in ways you only see by reading the baseline, and a quarter to need Render JavaScript, an exact URL or to be out of reach.

Input example

{
"startUrls": [
{ "url": "https://competitor-a.com/pricing" },
{ "url": "https://competitor-b.com" },
{ "url": "https://competitor-c.com/plans" }
],
"currencyHint": "USD",
"renderJavaScript": false,
"includeUnchanged": false,
"monitorName": "rivals"
}

Output example

Baseline: real output of the default input on 2 October 2026 (first run):

PagePlans
https://basecamp.com/pricingFree · Freelancer $25/mo · Studio $59/mo · Pro $99/mo · Unlimited $299/mo
https://www.fastmail.com/pricing/Individual $6/mo · Duo $10/mo · Family $14/mo · Basic $4/mo/user · Standard $6/mo/user · Professional $10/mo/user
https://ghost.org/pricing/Starter $18/mo · Publisher $29/mo · Business $199/mo · Custom

A change row. Live pricing pages change rarely, so to show a real change the saved version of Basecamp's plans was edited on the test machine (Pro at $89, no Studio plan, two features fewer on Unlimited) before the next run; the row is what the Actor produced from the live page:

{
"url": "https://basecamp.com/pricing",
"domain": "basecamp.com",
"status": "changed",
"summary": "Studio added at $59/mo; Pro went from $89/mo to $99/mo (+11.2%); Unlimited gained 2 features.",
"plansCount": 5,
"plans": [
{ "name": "Pro", "price": 99, "priceType": "paid", "currency": "USD", "billingPeriod": "month", "perUnit": null, "priceText": "$99", "limits": ["Up to 25 active projects", "…"], "features": ["Up to 25 active projects", "Unlimited users", "…"], "source": "cards" }
],
"extractionMethod": "cards",
"confidence": "high",
"plansAdded": [{ "name": "Studio", "priceText": "$59/mo" }],
"plansRemoved": [],
"priceChanges": [
{ "plan": "Pro", "oldPrice": 89, "newPrice": 99, "oldCurrency": "USD", "newCurrency": "USD", "oldPeriod": "month", "newPeriod": "month", "percentChange": 11.2, "oldText": "$89/mo", "newText": "$99/mo", "option": "main" }
],
"billingPeriodChanges": [],
"featureChanges": [{ "plan": "Unlimited", "added": ["Annual billing + extra payment options …", "Extended 45-day free trial …"], "removed": [] }],
"summaryItems": ["Studio added at $59/mo", "Pro went from $89/mo to $99/mo (+11.2%)", "Unlimited gained 2 features"],
"renderedWithBrowser": false,
"error": null
}

Fields worth knowing:

  • status: baseline (first check, saved), changed, unchanged (only on request) or error (a free info row).
  • plans[].prices: all price options found in a plan (for example monthly and yearly); the first one is the main price that is compared. Other options are compared by billing period.
  • priceChanges[].percentChange is empty when the currency or the billing period differs, or the old price was 0.
  • Rows with an error code are free: no-plans-found, no-pricing-page-found, robots-disallowed, http-error, blocked, timeout, invalid-url.

How much does it cost?

This Actor uses pay per event:

EventPrice
Page checked (fetched and plans read, including baselines), with or without Render JavaScript$0.003
Pages that fail to load, pages where no plans are recognised, domains without a pricing page, pages robots.txt does not allow, info rowsfree
  • 50 competitor pages checked daily cost $0.15 a day (about $4.50 a month).
  • Browser mode needs more memory (4 GB by default) and time, but the price per page is the same.
  • Set Maximum cost per run in the run options and the Actor stops when it is reached.

Limitations

  • Heuristic extraction (see above): check each new baseline, and use confidence and extractionNotes as hints, not guarantees.
  • robots.txt is respected (also when looking for the pricing page); the Actor sends an identifiable User-Agent and waits at least 1.5 s between requests to the same site. Sites that block automated visits answer a free blocked row; the Actor does not use proxies or work around blocks.
  • No clicking: billing toggles, currency or region selectors, and "show more" buttons are not used, also in browser mode.
  • Taxes and promotions: the Actor reads list prices as shown; struck-through old prices are ignored, coupon banners are not interpreted.
  • Language: names and features are returned as written; billing periods are recognised in English, German, French, Spanish and a few more languages.
  • Up to 300 pages or domains per run, up to 12 plans per page and 60 features per plan.
  • Version history starts at your first run.

Data and your responsibility

  • The Actor reads public pricing pages. It returns prices, plan names and short feature lines for monitoring; check the site's terms before you republish them.
  • No personal data is processed. Not affiliated with any company whose pages you monitor.

FAQ

Why did a page return no-plans-found?

Its plans are built by JavaScript, are in images, or use a layout the rules do not know. Turn on Render JavaScript, or give the exact pricing URL if you gave a domain.

Can it find the pricing page from a domain?

Yes, when the home page links to it or it sits at a usual path (/pricing, /plans ...) and shows plans without JavaScript. The page found is remembered for 30 days.

Does the browser mode cost more?

No, the price per page is the same. It needs more memory (4 GB by default), so runs take longer.

Why is my plan's price missing a period?

The page shows the price and "/mo" in places the rules do not link together, or the price has no period (a one-time price, usage-based pricing). billingPeriod is then empty.

How do I track yearly prices?

If the page shows both, the plan's prices list has both and changes are reported for each period. If it only shows the default state, you get only that.

More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

Website audits

Company data and compliance

Media and AI

Market signals

Feedback

Found a pricing page that is read wrongly? Open an issue on the Issues tab with the URL.