# Tech Stack Detector: Shopify, Pixels, Email, Chat (`variegated_binturong/website-tech-stack-detector`) Actor

Tech stack detector for thousands of websites: e-commerce platform and CMS, analytics and ad pixels, email marketing and CRM, chat, payments, CDN and cookie banner, with evidence. Filter in the input, for example Shopify stores without email marketing, to build lead lists.

- **URL**: https://apify.com/variegated_binturong/website-tech-stack-detector.md
- **Developed by:** [Luigi Fiano](https://apify.com/variegated_binturong) (community)
- **Categories:** Lead generation, Marketing, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 website rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tech Stack Detector: Shopify, Pixels, Email, Chat

Paste a list of domains, from a handful to thousands, and get one row per website with the technologies visible on its home page, each one with the evidence found.
Made for agencies and SaaS sales teams building lead lists, and for anyone qualifying a list of domains or researching a market.

### What you get

One row per website with its platform, analytics and ad pixels, email marketing and CRM, chat, payments, CDN, fonts and cookie banner, plus one field per category (`ecommercePlatform`, `hasMetaPixel`, `hasEmailMarketing`, `hasChat`...) to filter in a spreadsheet.

| Category | Technologies |
|---|---|
| Platform (e-commerce, CMS, site builder) | Shopify, WooCommerce, WordPress, Wix, Squarespace, Webflow, Magento, BigCommerce, PrestaShop, HubSpot CMS, Framer, Ghost |
| Analytics and ad pixels | Google Analytics 4, Google Tag Manager, Meta Pixel, TikTok Pixel, LinkedIn Insight Tag, Pinterest Tag, Hotjar, Microsoft Clarity |
| Email marketing and CRM | Klaviyo, Mailchimp, HubSpot, ActiveCampaign, Brevo, Omnisend |
| Chat and customer support | Intercom, Zendesk, Tidio, Crisp, Drift, LiveChat, Gorgias |
| Payments | Stripe, PayPal |
| CDN and security | Cloudflare |
| Fonts | Google Fonts |
| Cookie consent banner | Cookiebot, OneTrust, Iubenda |

Example row (shortened):

```json
{
  "type": "site",
  "domain": "shop.example.com",
  "url": "https://shop.example.com/",
  "finalUrl": "https://www.shop.example.com/",
  "statusCode": 200,
  "title": "Example Shop - Linen clothing",
  "language": "en-US",
  "platform": "Shopify",
  "ecommercePlatform": "Shopify",
  "isEcommerce": true,
  "analytics": ["Google Analytics 4", "Meta Pixel"],
  "hasMetaPixel": true,
  "hasTikTokPixel": false,
  "emailMarketing": ["Klaviyo"],
  "hasEmailMarketing": true,
  "chat": ["Gorgias"],
  "hasChat": true,
  "payments": [],
  "cdn": ["Cloudflare"],
  "cookieConsent": [],
  "hasCookieBanner": false,
  "technologies": [
    { "name": "Shopify", "category": "platform", "evidence": "header x-shopid: 123" },
    { "name": "Meta Pixel", "category": "analytics", "evidence": "connect.facebook.net/en_US/fbevents.js" },
    { "name": "Klaviyo", "category": "email", "evidence": "static.klaviyo.com" }
  ],
  "technologiesCount": 7,
  "error": null,
  "checkedAt": "2026-10-28T08:00:00.000Z"
}
```

The `SUMMARY` record counts how many of the sites read use each technology, before your filters: handy for market research on a list.

### How to use

1. Paste your domains or URLs, one per line (spaces, commas and semicolons also separate). Duplicates and www. / non-www. versions count once.
2. Optionally filter in the input: `requireAll` keeps sites with all the technologies or categories you list, `excludeAny` drops sites with any of them. For example `requireAll: ["Shopify"]` with `excludeAny: ["emailMarketing", "chat"]` gives Shopify stores with no email marketing tool and no live chat.
3. Click **Start** and download the list as JSON, CSV or Excel, or read it through the API. For big lists, raise the run timeout and `concurrency`.

### Input

| Field | What it does | Default |
|---|---|---|
| `domains` | One domain or URL per line. Only the home page of each site is read | required |
| `requireAll` | Keep only sites with all of these technologies or categories | every site |
| `excludeAny` | Drop sites with any of these technologies or categories | none |
| `httpFallback` | Try http once when https cannot be reached | true |
| `concurrency` | Sites read at the same time (1-20) | 8 |
| `timeoutSecs` | Timeout per site in seconds (3-60) | 20 |
| `maxRetries` | Retries on timeouts, 429 and 5xx (0-3) | 1 |
| `maxDomains` | Safety cap on the number of domains | 10,000 |
| `maxResults` | Stop after this many rows (0: no limit) | 0 |

Filters accept the technology names in the table above (case and spaces do not matter; `GA4`, `GTM` and `Facebook Pixel` also work) and these categories: `ecommerce`, `platform`, `analytics`, `emailMarketing`, `chat`, `payments`, `cdn`, `fonts`, `cookieConsent`.

### Pricing

Pay per event: **$0.002 per site row** in the dataset ($2 per 1,000 sites). Sites that cannot be read are not charged (they go to the free `ERRORS` record), and sites removed by `requireAll` or `excludeAny` are not delivered and not charged. Use `maxResults` to cap the cost of a run.

### FAQ

**Why is a tool I know missing?**
Only the public home page is read, with one request per site. Tools loaded later by Google Tag Manager, only after cookie consent, or only on other pages (checkout, contact page) are not seen. Treat a missing technology as "not on the home page", not as "not used anywhere".

**Do I pay for a typo in the filters, or for sites that do not answer?**
No. An unknown word in `requireAll` or `excludeAny` stops the run before any site is read. Sites that do not answer, block automated requests or have no HTML home page go to the free `ERRORS` record with the reason.

**How is each technology detected?**
From script and asset addresses, generator tags, response headers and cookie names set by the server (only the names, never the values). Every detection carries the string found as `evidence`, shortened to 80 characters, so you can check it.

**Does it collect personal data?**
No. It does not collect email addresses, phone numbers or names, and anything that looks like an email address is removed from the evidence and the title. Not affiliated with any of the companies whose products are detected; product names are trademarks of their owners.

# Actor input Schema

## `domains` (type: `array`):

One per line (spaces, commas and semicolons also separate). A domain (example.com) or any URL: only the home page of that site is read. www. and non-www count once.

## `requireAll` (type: `array`):

Technology names (Shopify, Klaviyo, Meta Pixel...) or categories (ecommerce, emailMarketing, chat, analytics, payments, cookieConsent, cdn, fonts, platform). Sites without them are not delivered and not charged. Empty: every site.

## `excludeAny` (type: `array`):

Same words as above. Example: requireAll Shopify + excludeAny emailMarketing gives Shopify stores without an email marketing tool. Dropped sites are not charged.

## `httpFallback` (type: `boolean`):

For a domain given without https://, try http:// once when the https connection fails (not on timeouts or unknown domains).

## `concurrency` (type: `integer`):

How many sites are read at the same time. Each site gets one request (plus retries).

## `timeoutSecs` (type: `integer`):

Give up on a home page after this many seconds.

## `maxRetries` (type: `integer`):

How many times a home page is requested again after a timeout, a 429 or a 5xx answer. Retry-After is honoured (max 10 s).

## `maxDomains` (type: `integer`):

Safety cap on the number of domains processed.

## `maxResults` (type: `integer`):

Stop after this many dataset rows. 0: no limit.

## Actor input object example

```json
{
  "domains": [
    "www.allbirds.com",
    "woocommerce.com",
    "www.wix.com",
    "webflow.com",
    "www.hubspot.com"
  ],
  "requireAll": [],
  "excludeAny": [],
  "httpFallback": true,
  "concurrency": 8,
  "timeoutSecs": 20,
  "maxRetries": 1,
  "maxDomains": 10000,
  "maxResults": 0
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `evidence` (type: `string`):

No description

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `errors` (type: `string`):

No description

# 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 = {
    "domains": [
        "www.allbirds.com",
        "woocommerce.com",
        "www.wix.com",
        "webflow.com",
        "www.hubspot.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("variegated_binturong/website-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 = { "domains": [
        "www.allbirds.com",
        "woocommerce.com",
        "www.wix.com",
        "webflow.com",
        "www.hubspot.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("variegated_binturong/website-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 '{
  "domains": [
    "www.allbirds.com",
    "woocommerce.com",
    "www.wix.com",
    "webflow.com",
    "www.hubspot.com"
  ]
}' |
apify call variegated_binturong/website-tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,variegated_binturong/website-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/p6iV8R3E24HKwIYZx/builds/OIBlr8nBicQ6J9ANE/openapi.json
