SaaS Pricing, Seat Costs & Limits Monitor
Pricing
$3.00 / 1,000 successful pricing page checks
SaaS Pricing, Seat Costs & Limits Monitor
Compare public SaaS plans, estimate team seat costs, and monitor published price and limit changes with source evidence.
Pricing
$3.00 / 1,000 successful pricing page checks
Rating
0.0
(0)
Developer
Inus Grobler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Monitor SaaS pricing and calculate published team costs
SaaS Pricing, Seat Costs & Limits Monitor reads public pricing pages from Linear, Notion, GitHub, Figma, and Slack. It returns source-linked plan rates, stated limits, and an estimate for your team size. Run the same pages again to see whether a published price or selected limit changed.
This Actor is useful for product marketers comparing competitors, procurement teams reviewing software spend, and founders watching how similar products package their plans. It extracts public information without a source API key or a paid data provider.
Use cases
- Competitor pricing research: compare public monthly and annual plan rates with the wording that supports each rate.
- Software budget estimates: apply your team size, or Figma seat mix, to published per-seat base prices.
- Pricing change monitoring: repeat a watchlist to see rate and stated limit changes with previous and current values.
Start in three steps
- Enter one or more supported public pricing-page URLs.
- Set Team seats. If you include Figma, optionally set its Full, Dev, and Collab seat counts.
- Run the Actor. The first successful check creates a baseline; later runs using the same History name show changes.
Input
Example input:
{"pricingUrls": ["https://linear.app/pricing", "https://www.figma.com/pricing/"],"teamSize": 25,"seatMix": { "full": 10, "dev": 10, "collab": 5 }}
Use the same History name for repeated checks of a watchlist. It must contain lowercase letters, digits, and hyphens between characters; underscores are not accepted by Apify storage. Give independent watchlists different names. Avoid overlapping runs that use the same name. You can schedule repeat runs in Apify Console when you need ongoing monitoring; the Actor does not create a schedule for you.
Output
The default dataset has one row per requested page. Each supported plan contains its published per-seat monthly rate, whether the customer pays monthly or commits annually, its seat class, short source wording, selected stated limits, and calculated team cost where enough information is available. Annual commitment is 12 times the published monthly equivalent for annually billed offers. Results can be exported from Apify as JSON, CSV, or Excel. If no requested page produces a valid pricing result, the run fails; its diagnostic rows and RUN_SUMMARY remain available.
Simplified example from a Linear page, for 25 seats:
{"url": "https://linear.app/pricing","vendor": "linear","status": "ok","currencyCode": null,"currencySymbol": "$","changeType": "baseline","plans": [{"name": "Basic","kind": "fixed","prices": [{"amount": "10.00","billing": "annual","seatType": "standard","qualifier": "standard","evidence": "Basic $10 per user/month","estimatedMonthlyCost": "250.00","estimatedAnnualCommitment": "3000.00"}],"limits": ["5 teams"]}]}
The example is illustrative; live prices can change. A dollar sign alone does not prove a currency code, so currencyCode remains null unless the page explicitly identifies USD. The RUN_SUMMARY output reports counts by check status and the number of detected changes.
How price and limit monitoring works
The Actor compares normalized published rates, billing terms, seat classes, and selected stated limits with the last reliably parsed snapshot. It reports baseline, unchanged, price_change, or packaging_change. Each change includes its type, affected plan and field, previous value, and current value. If a page blocks access, a required rate disappears, or its layout changes, the row explains the failure and the previous good snapshot remains available for the next check. A changed plan lineup may require an adapter update before monitoring can resume.
Figma prices are separated into Full, Dev, and Collab seats. A Figma team estimate stays empty until you provide a seat mix. GitHub rates labelled as introductory or “starting at” retain those qualifiers. Slack's temporary promotional rates do not replace its displayed standard monthly rate in the team estimate. The Actor does not treat a promotion as an ongoing price.
Supported pages and limits
- Supported v1 pages:
linear.app/pricing,notion.com/pricing,github.com/pricing,figma.com/pricing/, andslack.com/pricingon their public English layouts. Other URLs receiveunsupportedrather than invented plan data. - Prices are published base rates. They exclude tax, usage overages, discounts not shown in the pricing card, currency conversion, custom quotes, and eligibility checks. A
starting_ator introductory estimate applies only to the published qualifying rate. - Stated limits are extracted claims, not independently verified entitlements. Pages may change by region, currency, account, or time; review the linked source before making a purchase decision.
- The Actor respects source robots rules, does not log in, and does not bypass challenges. A blocked or changed layout produces an error row instead of a guessed rate.
How much does a run cost?
Introductory pay-per-event price: $0.003 per successfully checked supported pricing page ($3 per 1,000 checks). A five-page watchlist costs at most $0.015 in Actor events per run. Baseline checks and unchanged repeat checks both count: each delivers a fresh validated pricing snapshot. Unsupported, blocked, and failed pages have no Actor event charge. There is no run-start fee, and platform usage is included in the event price. Apify free-plan users can try the Actor under Apify's free-plan rules. Set a maximum charge per run in Console or the API to limit the number of paid page results; pages skipped because the charge limit was reached receive a diagnostic row and do not update monitoring history.
Browser interaction is used for pages with monthly/annual controls; GitHub and Slack normally use lighter HTML requests. The default 2 GB memory setting has headroom for a complete five-vendor run; one page at a time is the default for predictable memory use. Start with one page before running a larger watchlist.
Use the Apify API from Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("thescrapelab/saas-pricing-limits-monitor").call(run_input={"pricingUrls": ["https://linear.app/pricing"],"teamSize": 25,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["vendor"], item["status"], item["changeType"])
If a supported page repeatedly returns LAYOUT_DRIFT or BLOCKED, include the vendor, run ID, and error code when contacting the developer through Apify Console. Do not include private account details or tokens in a support report.