# Shopify Store Enrichment: Tech Stack, Pixels, Contacts & Churn (`adastra-connect/ecommerce-store-enrichment`) Actor

Enrich Shopify and WooCommerce store domains with verified installed apps, ad pixels (Klaviyo, Meta, GA4, TikTok, Triple Whale, Attentive), theme metadata, catalog price tiers, role-based business contacts, social links, and competitor app churn diffs.

- **URL**: https://apify.com/adastra-connect/ecommerce-store-enrichment.md
- **Developed by:** [Ad Astra Connect](https://apify.com/adastra-connect) (community)
- **Categories:** E-commerce, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.60 / 1,000 stores

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/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

## Shopify & E-Commerce Store Enrichment: Tech Stack, Pixels, Contacts & App Churn

Enrich any list of Shopify, WooCommerce, or e-commerce store domains with **verified installed apps, advertising and analytics pixels, theme metadata, catalog price-tier distributions, public role-based business contacts, social profile links, and competitor app churn diffs**.

Built for **e-commerce agencies, Shopify app developers, B2B SaaS growth teams, and market researchers** who need evidence-backed storefront intelligence at pay-per-use pricing instead of a $75 to $299/month subscription.

### What This Actor Extracts per Store Domain

1. **Platform & Theme Identification (`platform`, `theme`)**
   - Detects Shopify (`Shopify.shop`, `Shopify.theme` name, `schemaName`, `themeStoreId`, and role), WooCommerce (`wp-content/plugins/woocommerce` and active WordPress theme), BigCommerce, and Magento.
2. **25 Curated E-Commerce Apps & Pixels with Code-Level Evidence (`technologies`)**
   - **Email & SMS Marketing:** Klaviyo, Attentive, Postscript, Omnisend, Mailchimp.
   - **Reviews & Loyalty:** Judge.me, Yotpo, Okendo, Loox, Stamped.io, Smile.io.
   - **Subscriptions, Upsell & Support:** Recharge, Rebuy, Gorgias, Shop Pay / Accelerated Checkout.
   - **Ad Pixels, Attribution & Analytics:** Meta Pixel, Google Analytics 4 (GA4), Google Tag Manager (GTM), TikTok Pixel, Pinterest Tag, Snap Pixel, Triple Whale, Elevar, Microsoft Clarity, Hotjar.
   - Matches only `<script src>`, `<link href>`, `<meta>`, and inline `<script>` evidence (`asset_url` or `inline_script`), excluding prose, HTML comments, and inert examples.
3. **Catalog & Price-Tier Distribution (`catalog`)**
   - Samples up to 250 public products from Shopify (`/meta.json` and `/products.json`) or WooCommerce (`/wp-json/wc/store/v1/products`) to compute `sampledProducts`, `publishedProductsCount`, `currency`, `priceMin`, `priceMedian`, `priceP90`, `priceMax`, `vendorCount`, `inStockRatio`, and `newestProductAt` (catalog velocity signal).
4. **Role-Based Business Contacts & Social Profiles (`contacts`, `socials`)**
   - Extracts only verified generic business role mailboxes (`support@`, `hello@`, `info@`, `contact@`, `sales@`, `wholesale@`, `press@`, `partnerships@`, `help@`, `care@`, `team@`, `orders@`, `b2b@`) plus `contactPageUrl`, `supportPageUrl`, and official social links (`instagram`, `tiktok`, `facebook`, `youtube`, `pinterest`, `x`).
   - **Privacy by design:** Named personal employee emails are strictly excluded at extraction time.
5. **Competitor App Churn & Stack Diff Mode (`monitorMode`, `diff`)**
   - When `monitorMode: true`, saves a deterministic snapshot per domain in the named Key-Value Store (`ecommerce-store-enrichment-state`) and emits `changedSinceLastRun`, `appsAdded`, `appsRemoved`, `pixelsAdded`, `pixelsRemoved`, `themeChanged`, and `priceMedianDelta` on subsequent runs.

### Why Agencies and App Developers Use This Actor

- **Competitor App Churn Alerts:** Schedule weekly runs across a watchlist of stores to spot merchants that just installed or removed a competing review, SMS, subscription, or upsell app.
- **Agency Portfolio Qualification:** Turn a raw list of prospect domains into a spreadsheet-ready audit showing each merchant's current theme, email/SMS stack, missing ad pixels, median product price, and public wholesale/support contact page.
- **Zero Charge for Dead or Blocked Domains:** Under Pay-Per-Event pricing, the `store` event ($4.50 per 1,000 enriched stores) is charged **only** when a store returns `status: "ok"`. Unreachable, HTTP error, or `robots.txt`-disallowed domains cost $0 in store events.

Pricing is **US$4.50 / 1,000 stores ($0.0045 per successful store)**, plus the `apify-actor-start` event fee shown in Apify's pricing. Empty input `{}` inspects allbirds.com, gymshark.com, and offermanwoodshop.com.

### Sample Output Row

```json
{
  "domain": "allbirds.com",
  "finalUrl": "https://www.allbirds.com/",
  "status": "ok",
  "platformName": "shopify",
  "themeName": "Allbirds Global",
  "appCount": 4,
  "pixelCount": 5,
  "appNames": [
    "Gorgias",
    "Klaviyo",
    "Shop Pay / Shopify Accelerated Checkout",
    "Yotpo"
  ],
  "pixelNames": [
    "GA4",
    "Google Tag Manager",
    "Meta Pixel",
    "Microsoft Clarity",
    "TikTok Pixel"
  ],
  "primaryRoleEmail": "help@allbirds.com",
  "contactPageUrl": "https://www.allbirds.com/pages/help",
  "supportPageUrl": "https://www.allbirds.com/pages/faq",
  "currency": "USD",
  "priceMin": 16,
  "priceMedian": 110,
  "priceP90": 145,
  "priceMax": 160,
  "sampledProducts": 100,
  "changedSinceLastRun": true,
  "diff": {
    "hasBaseline": true,
    "changedSinceLastRun": true,
    "appsAdded": ["Yotpo"],
    "appsRemoved": [],
    "pixelsAdded": ["TikTok Pixel"],
    "pixelsRemoved": [],
    "themeChanged": false,
    "previousThemeName": "Allbirds Global",
    "priceMedianDelta": 0,
    "snapshotHash": "9f8c2a1e4b7d6012"
  },
  "checkedAt": "2026-10-26T22:50:00.000Z"
}
```

### Using with Claude Desktop, Cursor, and MCP Clients

Apify's hosted MCP server exposes this Actor directly to any Model Context Protocol (MCP) client using your `APIFY_TOKEN`:

```text
https://mcp.apify.com?tools=adastra-connect/ecommerce-store-enrichment
```

### Observation Semantics, Privacy & Legal Disclaimers

- **Observation Semantics:** Observed technologies reflect public storefront HTML/script signatures present at inspection time. A script reference does not establish active paid subscription status or internal backend configuration.
- **Role-Based Business Contacts Only (PIPEDA / GDPR / CASL):** This Actor extracts only generic role-based business mailboxes (`support@`, `hello@`, `sales@`, `wholesale@`, `info@`) and public contact URLs. Personal/named email addresses are excluded. Users are solely responsible for complying with applicable anti-spam laws (including CASL, CAN-SPAM, and GDPR/PECR) before sending any commercial electronic message.
- **Robots.txt & Rate Limiting:** This Actor checks `/robots.txt` per domain under RFC 9309 before inspecting storefronts or catalog feeds and serializes requests per host.
- **Non-Affiliation Disclaimer:** This Actor is an independent product developed by Ad Astra Connect and is not affiliated with, endorsed by, or sponsored by Shopify Inc., Automattic Inc. (WooCommerce), Klaviyo, Meta, Google, TikTok, or any other third-party vendor detected in storefront signatures.

### Step-by-step guides

- [How to Find Shopify Stores and Build a Compliant E-Commerce Lead List (2026)](https://adastra-data-tools.pages.dev/guides/find-shopify-stores-build-a-lead-list/) (verify the platform, segment by apps and pixels, keep only role inboxes)
- [Shopify App & Tech-Stack Benchmark (2026): Data from 2,600 Stores](https://adastra-data-tools.pages.dev/guides/shopify-app-tech-stack-benchmark-2026/) (built with this Actor: Klaviyo on 58.80% of 1,556 verified Shopify stores, Judge.me on 23.97%, free 100-store sample CSV)
- [What Apps Does a Shopify Store Use? How to Detect a Store's Tech Stack (2026)](https://adastra-data-tools.pages.dev/guides/what-apps-does-a-shopify-store-use/)
- [How to Monitor Shopify and WooCommerce Competitor Prices](https://adastra-data-tools.pages.dev/guides/monitor-shopify-competitor-prices/)

# Actor input Schema

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

Public e-commerce store domains or HTTPS URLs (for example, allbirds.com, gymshark.com, offermanwoodshop.com).

## `includeCatalogStats` (type: `boolean`):

When enabled, samples the public Shopify /products.json or WooCommerce Store API feed to compute SKU sample size, min/median/p90/max prices, currency, vendor count, in-stock ratio, and newest product date.

## `maxProductsPerStore` (type: `integer`):

Maximum number of public catalog products sampled per store when computing price tiers and velocity signals (10 to 250).

## `includeRoleContacts` (type: `boolean`):

Extract verified generic business mailboxes (such as support@, hello@, sales@, wholesale@, info@) and public contact/support URLs. Personal/named employee emails are strictly excluded.

## `monitorMode` (type: `boolean`):

Persist a tech-stack and catalog snapshot per domain in a named Key-Value Store and emit appsAdded, appsRemoved, pixelsAdded, pixelsRemoved, and themeChanged on subsequent runs.

## `emitUnchangedInMonitorMode` (type: `boolean`):

When monitorMode is true, emit all enriched stores (with changedSinceLastRun=false when unchanged). Set to false to emit only stores with detected stack/theme/catalog changes after the baseline run.

## `monitorKey` (type: `string`):

Namespace key used to isolate persistent snapshots in the named Key-Value Store when running multiple independent watchlists.

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

Maximum number of enriched store rows pushed to the dataset in a single run.

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

Number of independent store domains inspected in parallel (requests to any single domain are always serialized).

## `requestDelayMs` (type: `integer`):

Minimum delay in milliseconds between consecutive HTTP requests to the same host.

## Actor input object example

```json
{
  "domains": [
    "allbirds.com",
    "gymshark.com",
    "offermanwoodshop.com"
  ],
  "includeCatalogStats": true,
  "maxProductsPerStore": 100,
  "includeRoleContacts": true,
  "monitorMode": false,
  "emitUnchangedInMonitorMode": true,
  "monitorKey": "default",
  "maxResults": 100,
  "concurrency": 4,
  "requestDelayMs": 250
}
```

# Actor output Schema

## `stores` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `overview` (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": [
        "allbirds.com",
        "gymshark.com",
        "offermanwoodshop.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("adastra-connect/ecommerce-store-enrichment").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": [
        "allbirds.com",
        "gymshark.com",
        "offermanwoodshop.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("adastra-connect/ecommerce-store-enrichment").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": [
    "allbirds.com",
    "gymshark.com",
    "offermanwoodshop.com"
  ]
}' |
apify call adastra-connect/ecommerce-store-enrichment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,adastra-connect/ecommerce-store-enrichment"
        }
    }
}
```

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/rAqcXtoVopJMCr2o6/builds/ZhuIbefDyllCHtoKK/openapi.json
