Tech Stack Switch Alerts - Website Technology Monitor avatar

Tech Stack Switch Alerts - Website Technology Monitor

Pricing

from $2.40 / 1,000 site scanneds

Go to Apify Store
Tech Stack Switch Alerts - Website Technology Monitor

Tech Stack Switch Alerts - Website Technology Monitor

Monitor which technologies websites use (CMS, ecommerce, analytics, CRM, chat, payments, CDN) and get alerts when a site adds, removes or switches one, e.g. Magento to Shopify. 200 signatures, state kept between runs.

Pricing

from $2.40 / 1,000 site scanneds

Rating

0.0

(0)

Developer

Andrew Boiko

Andrew Boiko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Find out when a company changes the technology behind its website. The actor detects the stack of any site (CMS, ecommerce platform, site builder, analytics, tag manager, ad pixels, CRM and marketing automation, email tools, chat and support, payments, A/B testing, CDN and hosting, JavaScript frameworks, cookie consent) using 200 built-in signatures, remembers it between runs and raises an alert when something is added, removed or switched - for example Magento -> Shopify, Intercom -> Zendesk or no CRM -> HubSpot.

Technology changes are strong buying signals: a company that just moved to Shopify needs apps and agencies, a company that dropped its old analytics may be evaluating alternatives, a site that added Stripe is starting to sell online. Run the monitor weekly on your prospect list and act on the changes.

Who is it for?

  • Sales teams of SaaS, apps and agencies - catch prospects the week they adopt or drop a technology you sell or replace.
  • Agencies and consultants - find sites migrating platforms (replatforming leads).
  • Market researchers - track adoption of tools across a list of companies.
  • Competitive intelligence - watch what your competitors add to their sites.

What you get

Two row types in one dataset (rowType):

  1. site-scan - one per site: technologies found (with confidence and evidence), grouped by category, plus the number of changes since the last run.
  2. alert - one per change: added, removed or switched with category, from/to, evidence, when it was last seen and when it was detected.

Input

FieldTypeDescription
domainslistWebsites to monitor (domains or URLs), up to 2000 per run.
watchlistOptional: only alert on these technologies (Shopify) or categories (category:CRM).
monitorNamestringName of the saved state; keep it stable for scheduled runs.
includeBaselinebooleanAlso output the technologies found on the first scan as added alerts (charged per alert). Default off.
includeUnchangedbooleanInclude the full technology list in site-scan rows of unchanged sites. Default off (counts and grouped names only).
scanExtraPagesbooleanScan up to 2 extra internal pages (pricing, checkout, cart, shop ...). Default on.
maxDomainsintegerSafety limit per run (default 200, max 2000).
includeFailedbooleanAdd free error rows for sites that could not be scanned.

Output example - alert

{
"rowType": "alert",
"id": "shop.example.com:switched:Ecommerce platform:Magento>Shopify:2026-10-14",
"alertType": "switched",
"domain": "shop.example.com",
"summary": "shop.example.com switched from Magento to Shopify (Ecommerce platform)",
"category": "Ecommerce platform",
"from": "Magento",
"to": "Shopify",
"evidence": ["script/resource: cdn.shopify.com/", "inline script: Shopify.theme", "response header: x-shopid: 12345"],
"confidence": "high",
"previousSeenAt": "2026-10-07T08:00:11.000Z",
"detectedAt": "2026-10-14T08:00:09.000Z",
"isBaseline": false,
"source": "Direct scan of the public website"
}

Output example - site scan

{
"rowType": "site-scan",
"domain": "shop.example.com",
"status": "scanned",
"finalUrl": "https://shop.example.com/",
"httpStatus": 200,
"pagesScanned": ["https://shop.example.com/", "https://shop.example.com/pricing"],
"techCount": 9,
"technologiesByCategory": { "Ecommerce platform": ["Shopify"], "Analytics": ["Google Analytics"], "CRM & marketing automation": ["Klaviyo"] },
"changesDetected": 2,
"alertCount": 2,
"isBaseline": false,
"technologies": [{ "name": "Shopify", "category": "Ecommerce platform", "confidence": "high", "score": 100, "evidence": ["..."] }],
"scannedAt": "2026-10-14T08:00:09.000Z"
}

The run also writes an OUTPUT record (counts, charged events, skipped sites with reasons, warnings, stoppedReason) and a short RESULTS_MD summary to the key-value store.

Pricing

Pay only for results, per event:

EventPriceWhen
site-scan$0.003One per site that was scanned successfully with at least one technology detected
switch-alert$0.01One per alert row (added, removed or switched)

Nothing is charged for unreachable or blocked sites, robots.txt exclusions, pages where nothing was detected, duplicates, or anything beyond the maximum cost you set for the run. Apify's free plan credit lets you try the actor at no cost; volume discounts (Bronze/Silver/Gold) apply automatically. Example: 500 prospect sites per week with about 15 alerts costs 500 x $0.003 + 15 x $0.01 = $1.65 per run.

How it works

  1. Fetch the homepage (and up to 2 internal pages such as pricing or checkout) with an honest User-Agent, low concurrency and robots.txt respected.
  2. Detect technologies by matching 200 signatures against script and resource URLs, stylesheet links, meta tags, HTML comments, inline script globals, cookie names, response headers and DOM markers. Every detection carries evidence and a confidence (high / medium / low).
  3. Compare with the snapshot saved in a named key-value store (tech-stack-<hash>, derived from monitorName).
  4. Alert following these rules:
    • added: a technology appears that was not in the previous snapshot (only medium/high confidence).
    • removed: a technology must be missing in two consecutive successful scans before the alert, so a flaky page or a lazy-loaded script does not cause noise.
    • switched: two ways. In the exclusive categories CMS, Ecommerce platform and Site builder, if one technology disappears and another appears in the same scan, you get one switched alert immediately. In other categories, a confirmed removal that follows an added technology of the same category is reported as switched from A to B.
  5. Safety: a failed, blocked or empty fetch never changes the stored snapshot and never creates a removal.

The first scan of a site is a baseline: you get the site-scan row but no alerts (unless you enable includeBaseline).

Limits and honest caveats

  • Detection works on what the server returns to a plain HTTP request. Technologies loaded only after user interaction, behind a login, or injected late by JavaScript can be missed, and some single-page apps expose little in the HTML.
  • It cannot see back-end technology that leaves no trace in the response (databases, most server languages, internal tools).
  • Signatures are pattern based. A mention of a vendor in the page text is not enough to trigger a detection, but false positives and false negatives are possible; use the evidence and confidence fields to judge. low confidence detections are listed but never raise alerts.
  • Sites behind bot protection (Cloudflare challenge, Akamai, DataDome and similar) are reported as blocked and are not charged; the actor does not try to bypass them.
  • Switch detection depends on the scan interval: a change is seen at the first run after it went live, and removals take two runs to be confirmed.
  • Changing the list of domains without a monitorName starts a fresh baseline; set a monitorName to keep history while editing the list.
  • Not a replacement for dedicated services with crawled historical databases: this actor tells you what changed between your own runs.

Only publicly served pages are requested (homepage and at most two internal pages per site), at low rates, with an honest User-Agent, respecting robots.txt. No logins, no bypassing of protections and no personal data are collected. Technology usage is public information, but check local rules and the terms of the sites you monitor before using the data commercially.

FAQ

Which technologies are detected? 200 signatures across 14 categories: CMS, Ecommerce platform, Site builder, Analytics, Tag manager, Advertising, CRM & marketing automation, Email service, Chat & support, Payments, A/B testing, CDN & hosting, JavaScript framework and Consent management.

How do I only get alerts for what matters to me? Use watch, for example ["Shopify", "category:CRM", "category:Payments"]. State is still updated for everything, so you can widen the list later without a new baseline.

Why no alert on the first run? The first run is a baseline. Enable includeBaseline to get an added alert per detected (watched) technology; they are charged as alerts.

Why was a removal not reported immediately? To avoid false alarms, a technology must be missing in two consecutive successful scans.

What does blocked mean? The site answered with a bot-protection or access-denied page. Nothing is charged and the stored state is untouched.

Can I run it daily? Yes. Weekly is enough for most prospecting lists; use daily for competitors.

Is the confidence a probability? No. It is a rule-of-thumb label: high means several independent kinds of evidence, medium one strong signal, low a weak marker only.

Use it via API

Replace username with the actor owner.

curl -X POST "https://api.apify.com/v2/acts/username~tech-stack-switch-alerts/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains":["allbirds.com","gymshark.com"],"watch":["category:Ecommerce platform"],"monitorName":"ecom-weekly"}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('username/tech-stack-switch-alerts').call({
domains: ['allbirds.com', 'gymshark.com'],
monitorName: 'ecom-weekly',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.rowType === 'alert'));
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("username/tech-stack-switch-alerts").call(run_input={
"domains": ["allbirds.com", "gymshark.com"],
"monitorName": "ecom-weekly",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["rowType"] == "alert":
print(item["summary"])

Integrations

Schedule the actor with Apify Schedules (weekly is typical), then connect the dataset to Make, n8n or Zapier ("Actor run finished" trigger, then "get dataset items") to send alert rows to Slack, your CRM or Google Sheets. Webhooks and the Google Sheets integration work too; filter on rowType = alert and alertType = switched.