# Website Tech Stack Detector: CMS, Shopify & Pixels (`f0rty7even/tech-stack-detector`) Actor

Find out what any website is built and sold on. Detects the CMS, ecommerce platform, analytics, advertising pixels, payment providers, chat widget, marketing and reviews apps, consent manager, CDN, server and frontend framework, each with the evidence behind it.

- **URL**: https://apify.com/f0rty7even/tech-stack-detector.md
- **Developed by:** [Michael Yousrie](https://apify.com/f0rty7even) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 websites

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Tech Stack Detector: CMS, Shopify and Pixels

Find out what any website is built and sold on. Give it a list of domains, get back one row per site naming the CMS, the ecommerce platform, the analytics, the advertising pixels, the payment providers, the chat widget, the marketing and reviews apps, the consent manager, the CDN, the server and the frontend framework.

Every match carries the evidence that produced it, so you can check the answer instead of trusting it.

**$10 per 1,000 websites.** Sites that cannot be reached are not charged.

***

### Why the results are fuller than a plain scraper's

Most of a modern site's third-party stack is not in the HTML. Google Tag Manager, consent platforms and app loaders inject the analytics, advertising and marketing tags *after* the page loads, so a tool that only reads the raw HTML sees a fraction of what is really running.

Measured on real stores while building this: Gymshark shows **3** technologies over plain HTTP and **10** once the page is rendered. Allbirds goes from 4 to 12, TechCrunch from 5 to 11.

So this reads each site twice and merges the two views:

- The **HTTP response** carries the server, CDN and hosting fingerprints that live in headers and never reach page scripts at all.
- The **rendered page** carries everything a tag manager injected.

Neither pass alone is the answer. Merging them is the product.

By default the browser opens only when the plain fetch came back thin, which keeps most runs fast. Images, fonts and video are blocked during rendering, because detection reads script URLs and never pixels.

***

### What it detects

Around 190 technologies across 17 categories.

| Category | Examples |
|---|---|
| CMS | WordPress, Drupal, Wix, Squarespace, Webflow, Ghost, Framer, Contentful, Sitecore, TYPO3, Craft, Umbraco |
| Ecommerce | Shopify, Shopify Plus, WooCommerce, Magento, Adobe Commerce, BigCommerce, PrestaShop, Salesforce Commerce Cloud, Shopware, Ecwid |
| Analytics | GA4, Universal Analytics, Google Tag Manager, Plausible, Fathom, Matomo, PostHog, Mixpanel, Amplitude, Heap, Segment, Hotjar, Clarity, FullStory |
| Advertising | Meta Pixel, Google Ads, LinkedIn Insight, TikTok, X, Pinterest, Reddit, Microsoft UET, Criteo, Taboola, Outbrain |
| Payments | Stripe, PayPal, Braintree, Adyen, Klarna, Square, Mollie, Razorpay, Afterpay, Affirm, Shop Pay, Apple Pay, Chargebee, Paddle |
| Chat and support | Intercom, Zendesk, Drift, Crisp, Tawk.to, LiveChat, Gorgias, Tidio, Freshchat, Help Scout |
| Marketing | Klaviyo, Mailchimp, HubSpot, Marketo, Pardot, ActiveCampaign, Braze, Attentive, Postscript, Omnisend, Brevo |
| Reviews | Trustpilot, Yotpo, Judge.me, Okendo, Loox, Bazaarvoice, Stamped, Feefo |
| Consent | OneTrust, Cookiebot, Usercentrics, CookieYes, Iubenda, Termly, Osano |
| Experimentation | Optimizely, VWO, AB Tasty, Convert, Kameleoon, Dynamic Yield |
| Search | Algolia, Klevu, Searchspring, Coveo, Elastic |
| Scheduling | Calendly, Cal.com, Acuity, Chili Piper, OpenTable, Mindbody |
| Frameworks | Next.js, Nuxt, React, Vue, Angular, Svelte, Gatsby, Astro, Remix, jQuery, Bootstrap, Tailwind, htmx |
| CDN and hosting | Cloudflare, Fastly, Akamai, CloudFront, Netlify, Vercel, WP Engine, Kinsta, Pantheon |
| Server | nginx, Apache, IIS, LiteSpeed, Caddy, PHP, ASP.NET, Express |
| Security and monitoring | reCAPTCHA, hCaptcha, Turnstile, Sentry, New Relic, Datadog |
| Media and maps | YouTube, Vimeo, Wistia, Google Maps, Mapbox, Leaflet |

Versions are reported where a site volunteers one, which WordPress, Drupal, Joomla, jQuery, Bootstrap, Angular and TYPO3 routinely do.

***

### Output

One row per site, with the categories flattened into their own columns so a spreadsheet filter works without touching the nested array.

```json
{
  "domain": "northwind.co",
  "cms": "Shopify",
  "ecommercePlatform": "Shopify Plus",
  "technologyCount": 15,
  "analytics": ["Google Analytics 4", "Google Tag Manager"],
  "advertising": ["Meta Pixel", "Google Ads"],
  "payments": ["Shop Pay", "Apple Pay", "Klarna"],
  "chat": ["Gorgias"],
  "marketing": ["Klaviyo", "Attentive"],
  "reviews": ["Okendo"],
  "consent": ["OneTrust"],
  "cdn": ["Cloudflare"],
  "frameworks": ["React"],
  "technologies": [
    {
      "name": "Klaviyo",
      "category": "Marketing",
      "evidence": "asset URL contains static.klaviyo.com"
    },
    {
      "name": "WordPress",
      "category": "CMS",
      "version": "6.5.2",
      "evidence": "meta generator is WordPress 6.5.2"
    }
  ],
  "renderedWith": "browser",
  "error": null
}
```

`cms` and `ecommercePlatform` name a single winner each. A WooCommerce store is also WordPress and a Shopify store usually ships jQuery, so listing everything is right for the detail view and useless for a filter. Each category resolves to the most specific match: Shopify Plus beats Shopify, Shopify beats a generic CMS guess.

***

### Common uses

**Building a platform-qualified prospect list.** "Shopify stores running Klaviyo but no reviews app" is a sales list, and it is one filter away from this output. Same for "WooCommerce sites still on Universal Analytics" or "sites using a competitor's chat widget".

**Sizing a market before you build for it.** Run a few thousand domains in a vertical and count platforms. That is a real answer to "how many of these are on Shopify" instead of a guess.

**Competitive and agency research.** See what a client's competitors run, or audit a portfolio of sites for consistency before a migration.

**Partner and integration targeting.** If you sell an app for one platform, `ecommercePlatform` is your entire qualifying criterion.

**Security and compliance sweeps.** Spot sites still serving an ancient jQuery or WordPress version, or check that every property in a group actually has a consent manager installed.

**Enriching a CRM.** Attach the tech stack to company records so sales knows what a prospect runs before the first call.

***

### Pricing

**$0.01 per website, so $10 per 1,000.** One charge per site that returned a page.

That price reflects what the work actually costs: most sites need a real browser to reveal their stack, and rendering is roughly five times the cost of a plain fetch.

Not charged when the domain does not resolve, the site cannot be reached, or it refuses the request outright. Duplicate domains in your input are merged before anything runs.

Tier discounts apply automatically on paid Apify plans, down to $7 per 1,000.

***

### Honest limits

**Tags that load only after a cookie banner is accepted may not appear.** This does not click consent banners, so on strict European sites some analytics and advertising tags stay dormant and therefore invisible. The platform, CDN, server, framework and payment detections are unaffected.

**Detection is evidence based, not a guarantee.** A signature proves a resource was requested or a marker was present. Every match carries its evidence string so you can verify it.

**Only the homepage is read.** A checkout-only payment provider or a blog-only tag may not show up on the front page.

**Absence is weaker than presence.** "Klaviyo detected" is solid. "No Klaviyo detected" means it was not found on the homepage under the render mode you chose, which is not quite the same as not installed.

***

### Frequently asked questions

**How do I find out what CMS a website uses?**
Put the domain in and read the `cms` field. It names one platform, chosen by specificity, and the `technologies` array shows the evidence.

**How can I tell if a site is built on Shopify or WooCommerce?**
`ecommercePlatform` answers that directly, and distinguishes Shopify Plus from standard Shopify where the site exposes its plan.

**Can I find all the websites using a specific tool?**
Not from a keyword, no: this checks the domains you supply rather than searching the whole web. Feed it a list and filter the output for the tool you care about.

**Does it detect Google Analytics 4 versus Universal Analytics?**
Yes, they are separate detections, which makes finding sites that never migrated straightforward.

**Why did a site come back with only two or three technologies?**
Either it genuinely runs a light stack, or its tags load after a consent banner. Try setting the render mode to Always.

**Is this like BuiltWith or Wappalyzer?**
Same idea. This one is built for bulk work through an API, returns structured per-category fields for filtering, shows its evidence, and charges per site rather than per seat.

**Do you store the sites I look up?**
No. Results go to your dataset in your account.

***

### Works well with

- [Website Lead Extractor](https://apify.com/f0rty7even/website-lead-extractor): turn the same domains into emails, phones and postal addresses
- [Bulk Email Verifier](https://apify.com/f0rty7even/email-verifier): check those addresses against DNS before you send
- [SEO Audit and Site Health Checker](https://apify.com/f0rty7even/seo-auditor): on-page SEO issues and a health score per page

***

### Notes

Public pages only. The Actor reads what any visitor's browser would load, and it does not log in or bypass paywalls.

# Actor input Schema

## `startUrls` (type: `array`):

One or more websites. Paste bare domains (northwind.co), full URLs, or a whole spreadsheet column separated by commas or new lines.

## `renderMode` (type: `string`):

Most analytics, advertising and marketing tags are injected by a tag manager after the page loads, so they are invisible to a plain HTTP request. Auto reads the page over HTTP first and opens a real browser when that finds little, which is the right trade for almost every list.

## `renderThreshold` (type: `integer`):

In Auto mode, open the browser when the plain fetch found fewer technologies than this. Raise it for more detail, lower it for speed.

## `maxWebsites` (type: `integer`):

Hard stop after this many websites, as a safety net on large inputs. Leave empty to analyze everything you supplied.

## `maxConcurrency` (type: `integer`):

How many sites to work on at once.

## `proxyConfiguration` (type: `object`):

Proxy used to reach the websites. The default rotating datacenter proxy is included on every plan. If a site behind Cloudflare blocks it, switch to Residential.

## Actor input object example

```json
{
  "startUrls": [
    "northwind.co",
    "https://contoso.com"
  ],
  "renderMode": "auto",
  "renderThreshold": 8,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `techStacks` (type: `string`):

One row per website. Export as JSON, JSONL, CSV or Excel.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "allbirds.com",
        "gymshark.com",
        "techcrunch.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("f0rty7even/tech-stack-detector").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        "allbirds.com",
        "gymshark.com",
        "techcrunch.com",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("f0rty7even/tech-stack-detector").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "allbirds.com",
    "gymshark.com",
    "techcrunch.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call f0rty7even/tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,f0rty7even/tech-stack-detector"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BSx7VnzPyeUpsjIcS/builds/EsbTeeNYKdeqhfOYJ/openapi.json
