B2B SaaS Changelog & Feature Intelligence Monitor
Pricing
from $2.00 / 1,000 changelog entries
B2B SaaS Changelog & Feature Intelligence Monitor
Extracts, normalizes, and diffs changelog/release-note data from any SaaS URL via RSS/Atom, Next.js data, HeadwayApp, Canny, Beamer, GitHub Releases, or generic Readability fallback. Outputs clean LLM-ready Markdown and JSON with stateful cross-run change detection.
Pricing
from $2.00 / 1,000 changelog entries
Rating
0.0
(0)
Developer
DataFlow Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Track any SaaS competitor's changelog automatically. This Actor extracts, normalizes, and diffs changelog / release-note data from any SaaS URL — RSS feeds, Next.js apps, HeadwayApp, Canny, Beamer, GitHub Releases, or plain custom HTML — and outputs clean, LLM-ready Markdown plus structured JSON. Only genuinely new entries since your last run are flagged, so you can pipe results straight into Slack, Notion, or a n8n / Make.com workflow without re-processing duplicates.
Why use this Actor?
- Works on almost any changelog, out of the box. A strict extraction waterfall tries the highest-fidelity method first and falls back gracefully:
- RSS / Atom / JSON feed discovery
- Next.js
__NEXT_DATA__hydration payload - Platform adapters — HeadwayApp, Canny, Beamer, GitHub Releases
- Generic Readability-based fallback for any other custom HTML page
- Stateful diffing, no duplicate noise. Every entry gets a stable content hash stored in a Key-Value Store across runs, so scheduled runs only report what's actually new.
- LLM-ready output. Every entry ships as clean Markdown (HTML boilerplate stripped) with an estimated token count, ready to drop into a prompt, RAG pipeline, or AI agent.
- Zero anti-bot headaches. Changelogs are public pages — this Actor uses a fast, lightweight
CheerioCrawler(HTTP-only), no headless browser required. - Auto-categorized. Each entry is tagged as
New Feature,Improvement,Bug Fix,Breaking Change,Security, orGeneral Updatebased on content heuristics.
Use cases
- Competitive intelligence — monitor competitors' changelogs and get notified the moment they ship a feature that matters to you.
- Product management — keep a single feed of everything shipped across your own product's multiple changelog sources (marketing site + docs + GitHub).
- AI workflows — feed new releases into an LLM to auto-draft competitor battlecards, sales talk tracks, or internal Slack digests.
- VC / market research — track feature velocity across a portfolio of SaaS companies over time.
Input
| Field | Type | Required | Description |
|---|---|---|---|
startUrls | array of strings | ✅ | Absolute http(s) URLs to changelog, release-notes, or GitHub Releases pages (e.g. https://linear.app/changelog, https://github.com/vercel/next.js/releases). |
onlyNewSinceLastRun | boolean | – | When true (default), only entries not seen in a previous run are included in the output. Set false to always emit the full current snapshot. |
maxItemsPerSource | integer | – | Optional cap on how many entries to keep per source URL (most recent first). Leave empty for no limit. |
requestTimeoutSecs | integer | – | Per-URL timeout in seconds for fetching the page and any discovered feed. Default 60. |
proxyConfiguration | object | – | Optional Apify Proxy or custom proxy URLs. |
Example input
{"startUrls": ["https://linear.app/changelog","https://github.com/vercel/next.js/releases","https://supabase.com/changelog"],"onlyNewSinceLastRun": true,"requestTimeoutSecs": 60}
Output
One dataset record per changelog entry (not per source URL) — the actual scraped content, flat and ready to consume:
{"sourceUrl": "https://linear.app/changelog","hostname": "linear.app","status": "OK","extractionMethod": "rss","isNew": true,"scrapedAt": "2026-08-27T04:10:32.123Z","id": "b2c1e4f9a6d7...","title": "Improved keyboard navigation in the Inbox","contentMarkdown": "We've reworked keyboard shortcuts across the Inbox...\n\n- Jump between threads with J/K\n- Archive with E\n- Snooze with H","features": ["Jump between threads with J/K","Archive with E","Snooze with H"],"url": "https://linear.app/changelog/2026-08-20-inbox-keyboard-nav","publishedAt": "2026-08-20T00:00:00.000Z","category": "Improvement","tags": [],"estimatedTokens": 84}
contentMarkdown— the full release body/content (from the RSS<content:encoded>/<description>, Atom<content>/<summary>, or the matched adapter's HTML), converted to clean Markdown.features— the top bullet-point lines pulled out ofcontentMarkdown, for a quick scannable summary without parsing the full body yourself.isNew— whether this entry wasn't seen in any previous run (seeonlyNewSinceLastRunbelow).
A source URL that fails to process still produces exactly one record, so a single bad URL never crashes the whole run and the failure stays visible in the dataset:
{"sourceUrl": "https://example.com/broken","hostname": "example.com","status": "FAILED","error": "Request timed out","scrapedAt": "2026-08-27T04:10:32.123Z"}
Pricing
This Actor uses Apify's Pay-Per-Event model — no flat platform subscription:
| Event | Price | When it's charged |
|---|---|---|
| Base run cost | $0.005 | Once per Actor run |
| Per URL processed | $0.005 | Per source URL crawled |
| Per new changelog detected | $0.02 | Per genuinely new entry found (skipped for duplicates) |
Integrations
Connect the dataset output to:
- Slack / Discord — via Apify's built-in webhook integrations, alert your team the moment a competitor ships something new.
- n8n / Make.com — trigger a scenario on new dataset items to auto-summarize with an LLM and post to Notion, Airtable, or a CRM.
- Zapier — use the Apify Zapier integration to route new entries into any downstream app.
Example recipe: Automated Slack Digest (Make.com / n8n)
Turn this into a daily "what did our competitors ship" digest with zero manual work:
- Schedule the Actor — in the Apify Console, open this Actor → Schedules tab → create a new schedule (e.g.
0 8 * * *for 08:00 AM UTC daily) with your list of competitorstartUrls. - Keep
onlyNewSinceLastRun: truein the schedule's input — this ensures the run only reports items that weren't already seen in a previous run, so your digest never repeats itself. - Add a webhook on run completion — Actor → Integrations → Webhooks → create one for the
ACTOR.RUN.SUCCEEDEDevent, pointing at:- a Make.com scenario's "Custom Webhook" trigger, or
- an n8n workflow's "Webhook" node.
- Fetch the dataset in your scenario/workflow — the webhook payload includes
resource.defaultDatasetId; use Apify's "Get Dataset Items" module/node (or a plainGET https://api.apify.com/v2/datasets/{datasetId}/items) to pull the new records. - Filter for
isNew: trueso the flow (and your Slack channel) stays silent on days with no changes. - Format and post to Slack/Discord — each dataset record is already one changelog entry, so post one message per record (or group them into one digest) to your team's
#competitor-intelchannel, includingtitle,category,url, and thefeaturesbullet list or fullcontentMarkdown.
This gives you a fully automated, noise-free "competitor changelog digest" landing in Slack every morning with $0 infrastructure to maintain.
Model Context Protocol (MCP) Setup
You can also call this Actor as a live tool directly from an AI agent like Claude Desktop or Cursor, via Apify's MCP server. Once connected, you can just ask your agent things like "Check linear.app/changelog for anything new" and it will run this Actor and read the results back into the conversation.
Option A — Hosted remote server (recommended, no install)
No npx, no local Node process, and it auto-updates. Add a custom MCP connector pointing at:
https://mcp.apify.com
- Claude Desktop: Settings → Connectors → Add custom connector → paste the URL above → Connect (authorizes via OAuth, no token to copy/paste).
- Cursor: Settings → MCP → Add new MCP server → paste the URL above.
Option B — Local stdio server
Add this to claude_desktop_config.json (Claude Desktop) or .cursor/mcp.json (Cursor):
{"mcpServers": {"apify": {"command": "npx","args": ["-y","@apify/actors-mcp-server","--actors","dataflow-tools/saas-changelog-feature-intelligence-monitor"],"env": {"APIFY_TOKEN": "YOUR_APIFY_API_TOKEN"}}}}
- Get
YOUR_APIFY_API_TOKENfrom Apify Console → Settings → Integrations. - The
--actorsvalue whitelists which Actor(s) show up as tools — swap in a comma-separated list to expose more than one. - Fully quit and reopen Claude Desktop / Cursor after saving the config for it to pick up the new server.
Note: this only works with your own
APIFY_TOKENwhile the Actor is private. To let other people referencedataflow-tools/saas-changelog-feature-intelligence-monitorwith their own tokens, publish the Actor to the Apify Store first (Console → Actor → Publication tab).
How it works (extraction waterfall)
- RSS/Atom/JSON feed discovery — looks for
<link rel="alternate">tags and common feed paths (/feed,/rss.xml,/changelog.rss, etc.). - Next.js hydration data — parses
<script id="__NEXT_DATA__">for server-renderedpagePropscontaining changelog entries. - Platform adapters — dedicated parsers for HeadwayApp, Canny, Beamer widgets, and GitHub Releases (converted to their Atom feed).
- Generic fallback — uses Mozilla's Readability algorithm to extract the main article content from any other page, then splits it into entries by heading.
Whichever method succeeds first is used — later stages are only attempted if earlier ones return no results.
FAQ
Does this work on Canny/Headway/Beamer widgets even if they're client-side rendered? For platforms that render primarily via JavaScript (e.g. some Beamer embeds), the Actor extracts whatever is present in the initial server-rendered HTML or inlined script payload. If a source renders 100% client-side with no fallback data, the generic Readability extractor is used as a last resort.
Can I track only new items and never see duplicates again?
Yes — leave onlyNewSinceLastRun at its default (true). The Actor persists a stable hash per entry across runs in a named Key-Value Store, so re-running on a schedule only surfaces what's new.
Can I run this on a schedule?
Yes — set up an Apify Schedule against this Actor (e.g. daily or hourly) with the same input, and combine it with a webhook to get notified only when newItemCount > 0.
What if a source URL is temporarily down?
That source's record is marked "status": "FAILED" with an error message; all other URLs in the same run are processed normally.