# Shopify App & Theme Detector - Store Analyzer & Contacts (`tenfoldfleet/shopify-store-analyzer`) Actor

Find what apps and theme a Shopify store uses, in bulk: installed apps, theme, product count, price range, top vendors, % on sale, collections, currency, country, myshopify domain, emails, phones and social links. One row per store analyzed. $8 per 1,000 stores; non-Shopify sites are free.

- **URL**: https://apify.com/tenfoldfleet/shopify-store-analyzer.md
- **Developed by:** [Tenfold Fleet](https://apify.com/tenfoldfleet) (community)
- **Categories:** E-commerce, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 shopify store analyzeds

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

### What does Shopify Store Analyzer do?

**Shopify Store Analyzer** is a **Shopify app detector, Shopify theme detector and store intelligence API** in one. Give it a list of store domains and it returns **one clean row per [Shopify](https://www.shopify.com) store**: **installed apps** (Klaviyo, Judge.me, Yotpo, Loox, Okendo, ReCharge, Gorgias, Attentive, Afterpay, Klarna, PageFly, GemPages and hundreds more), **theme name and version**, **exact product count**, **price range and average price**, **top vendors and product types**, **% of products on sale**, **collections count**, **currency, country and city**, the **myshopify.com domain**, and **public contact details** (emails, phones, social profiles, business address, VAT number).

It first **confirms the site really runs on Shopify** (`window.Shopify`, `cdn.shopify.com` assets, Shopify response headers and the store's `meta.json`). It also handles **headless Shopify stores** (Hydrogen, Next.js) by finding their `*.myshopify.com` domain. Sites that are not Shopify, password-protected, blocked or offline are returned as **free error rows** with a reason, and the same store entered twice (for example its `myshopify.com` domain and its custom domain) is charged once, so you **only pay once per real Shopify store**.

Plain HTTP requests, no browser: roughly **20-40 stores per minute** with default settings.

### Why use a Shopify store analyzer?

- 🎯 **Lead generation for Shopify apps and agencies**: find stores that use a competitor's app (or don't use any reviews / SMS / subscription app yet), then reach them by email.
- 🔍 **Competitor research**: see a rival store's tech stack, theme, catalog size, price points, discount depth and newest products.
- 🧩 **Lead enrichment**: add apps, theme, product count, country and contacts to a list of Shopify domains in Clay, HubSpot, Make, Zapier or n8n.
- 📊 **Market research**: compare price ranges, vendors and app adoption across hundreds of stores in a niche.
- ✅ **Shopify checker**: bulk-check which domains in a list actually run Shopify (non-Shopify rows are free).

Runs on the Apify platform, so you get an **API**, scheduling, webhooks and integrations with Google Sheets, Make, Zapier, n8n and Clay.

### What data can it extract?

| Field | Example |
|---|---|
| `input`, `domain`, `url` | your input, its domain (`deathwishcoffee.com`) and the final URL after redirects |
| `primaryDomain`, `storeName` | the store's primary domain from Shopify, `Death Wish Coffee` |
| `myshopifyDomain`, `shopId` | `deathwishcoffee.myshopify.com`, `2717209` |
| `currency`, `country`, `city`, `province`, `locale` | `USD`, `US`, `Round Lake`, `New York`, `en` |
| `themeName`, `theme` | `Dawn` + theme id, version, theme store id, custom name |
| `apps`, `appNames`, `appCount` | `Klaviyo, Gorgias, Postscript, Rebuy, Smile, Bazaarvoice, Facebook Pixel, ...` with a category for each |
| `productCount` | `147` (exact, from the store's meta data) |
| `minPrice`, `maxPrice`, `avgPrice`, `medianPrice` | `5.99`, `119.99`, `29.34`, `29.98` |
| `percentOnSale`, `percentInStock` | `15.6`, `98` |
| `topVendors`, `productTypes` | `[{ "name": "Death Wish Coffee", "count": 74 }, ...]` |
| `newestProductDate`, `oldestProductDate` | `2026-09-21T20:40:47.000Z`, `2013-11-04T18:44:10.000Z` |
| `collectionsCount` | `126` |
| `shipsToCountries`, `shopPayInstallments`, `cardBrands` | `["US", "CA", ...]`, `true`, `["visa", "master", ...]` |
| `emails`, `phones`, `socialLinks` | `["colourpop@colourpop.com"]`, `["+18052409341"]`, `{ "instagram": "...", "facebook": "..." }` |
| `legalName`, `address`, `vatNumber`, `contactPageUrl` | from the store's contact-information policy and contact page |
| `headless`, `shopifySignals` | `false`, `["window.Shopify", "cdn.shopify.com", "header:powered-by", "meta.json"]` |
| `error`, `errorCode` | `null`, or one of the free error codes listed in the FAQ |

### How to analyze Shopify stores

1. Click **Try for free**.
2. Paste store domains or URLs into **Store URLs or domains**, one per line (`allbirds.com`, `https://www.gymshark.com/collections/x` and `brand.myshopify.com` all work).
3. Optionally change **Max product pages per store** (default 4 = up to 1,000 products sampled for price statistics) and **Find contact details**.
4. Click **Start**.
5. Download the results as **JSON, CSV, Excel or HTML**, or fetch them through the API.

### How much does it cost?

You pay **$0.008 per Shopify store analyzed**, which is **$8 per 1,000 stores**. Everything in the row is included: apps, theme, catalog statistics, collections and contacts. **Non-Shopify sites, password-protected stores, blocked and unreachable sites, and duplicates of a store already in the run are free.** Apify's free plan includes monthly credit, so you can analyze hundreds of stores at no cost. Set a **maximum cost per run** and the actor stops cleanly when it is reached.

### Input

```json
{
    "stores": ["allbirds.com", "deathwishcoffee.com", "colourpop.com"],
    "maxProductPages": 4,
    "includeContacts": true,
    "maxConcurrency": 10,
    "proxyConfiguration": { "useApifyProxy": false }
}
```

### Output

One item per input store. Example (shortened):

```json
{
    "domain": "deathwishcoffee.com",
    "storeName": "Death Wish Coffee",
    "myshopifyDomain": "deathwishcoffee.myshopify.com",
    "isShopify": true,
    "headless": false,
    "currency": "USD",
    "country": "US",
    "city": "Round Lake",
    "themeName": "Dawn",
    "theme": { "name": "Sept 10, 2026", "schemaName": "Dawn", "schemaVersion": "10.0.0", "id": 135654604855, "themeStoreId": null, "role": "main" },
    "appCount": 20,
    "appNames": "Bazaarvoice, Facebook Pixel, Google & YouTube, Gorgias, Klaviyo, Ordergroove, Postscript, Rebuy, Smile, ...",
    "apps": [{ "name": "Klaviyo", "categories": ["Marketing automation"] }],
    "productCount": 147,
    "productCountIsExact": true,
    "minPrice": 5.99,
    "maxPrice": 119.99,
    "avgPrice": 29.34,
    "percentOnSale": 15.6,
    "topVendors": [{ "name": "Death Wish Coffee Company", "count": 40 }],
    "collectionsCount": 126,
    "emails": ["hey@deathwishcoffee.com"],
    "socialLinks": { "instagram": "https://www.instagram.com/deathwishcoffee" },
    "error": null
}
```

A site that is not a Shopify store comes back as a free row: `{ "input": "wordpress.org", "isShopify": false, "errorCode": "NOT_SHOPIFY", "error": "Not a Shopify store: ..." }`.

### Tips

- **Product count is exact** even with a low page limit: it comes from the store's own meta data. The page limit only controls how many products are sampled for prices, vendors and dates. Set it to `1` for the fastest runs.
- **Headless stores** (custom Hydrogen or Next.js storefronts) have no Shopify theme, so `themeName` is empty and fewer apps are visible, but catalog, meta data and contacts still work.
- Apps are detected from what the storefront loads: script tags, theme app embeds, Shopify web pixels and app proxies. Back-office apps that never touch the storefront (accounting, inventory) cannot be seen from outside.
- Prices are in the store's base currency (`currency`).
- Turn **Find contact details** off if you only need apps and catalog data; runs get slightly faster.
- Shopify throttles very heavy traffic from one IP address. The actor slows down automatically when that happens; for runs of thousands of stores, enable **Proxy** (Apify Proxy, datacenter) to keep them fast. Residential proxy is not supported and is switched to datacenter automatically. A few stores sit behind strict bot walls and come back as free `BLOCKED` rows; a datacenter proxy sometimes gets through.
- **Big lists**: a run handles roughly 20-40 stores per minute, and the default run timeout is 6 hours (about 7,000+ stores). For bigger lists, raise **Timeout** in the run options or split the list.

### FAQ

#### How do I check if a website uses Shopify?

Add it to the input. Shopify stores get a full row; other sites get a free `NOT_SHOPIFY` row, so the actor doubles as a bulk Shopify checker.

#### Which Shopify apps can it detect?

Hundreds: email and SMS (Klaviyo, Omnisend, Attentive, Postscript), reviews (Judge.me, Yotpo, Loox, Okendo, Stamped, Junip), subscriptions (ReCharge, Skio, Appstle, Ordergroove), support (Gorgias, Zendesk, Shopify Inbox), buy now pay later (Afterpay, Klarna, Sezzle, Affirm), page builders (PageFly, GemPages, Shogun, Replo), upsells, loyalty, returns, search, translation, analytics and ad pixels (Meta, TikTok, Pinterest, Google, Reddit).

#### Is the product count exact?

Yes when `productCountIsExact` is `true` (almost always). It is the number of products published to the online store.

#### Can it find stores for me?

No, this actor analyzes stores you already have. Feed it domains from a Shopify store list, Google search, a lead database or a competitor list.

#### Why did a store fail?

Check `errorCode`: `NOT_SHOPIFY` (not a Shopify store), `PASSWORD_PROTECTED` (store not open yet), `BLOCKED` (bot protection in front of the store), `UNREACHABLE` (DNS or connection error), `NO_DATA` (Shopify detected but no store data readable), `DUPLICATE` (same store as an earlier input in the run; the row still has its data), `INVALID_INPUT` (not a domain or URL) or `INTERNAL` (unexpected error). All of these are free.

### Disclaimer

This actor only reads public pages and public Shopify storefront endpoints, with no login. Contact details are business contacts the stores publish themselves. If you process personal data, you are responsible for complying with GDPR, CAN-SPAM and other applicable laws, and for using it only for legitimate purposes. Not affiliated with or endorsed by Shopify Inc.

### More tools from Tenfold Fleet

| Actor | Price |
|---|---|
| [ATS Jobs Scraper - Greenhouse, Lever, Ashby & 5 More](https://apify.com/tenfoldfleet/ats-jobs-scraper) | $2 per 1,000 (job posting) |
| [Website Contact Scraper - Emails, Phones & Socials](https://apify.com/tenfoldfleet/company-contact-finder) | $8 per 1,000 (website with contacts) |
| [Google Ads Transparency Center Scraper - Competitor Ads by Site](https://apify.com/tenfoldfleet/google-ads-transparency-scraper) | $1 per 1,000 (ad scraped) |
| [Google News Scraper - Articles, Real URLs & Full Text](https://apify.com/tenfoldfleet/google-news-scraper) | $2 per 1,000 (article) |
| [Keyword Search Volume, CPC & Difficulty Checker (Bulk)](https://apify.com/tenfoldfleet/keyword-search-volume) | $5 per 1,000 (keyword with data) |
| [Remote Jobs Aggregator - RemoteOK, WWR, Himalayas & 4 more](https://apify.com/tenfoldfleet/remote-jobs-aggregator) | $1.2 per 1,000 (unique remote job) |
| [SEO Audit Tool - Technical On-Page SEO Checker & Score](https://apify.com/tenfoldfleet/seo-audit-tool) | $20 per 1,000 (page audited) |
| [Shopify Products Scraper - Prices, Variants & Stock](https://apify.com/tenfoldfleet/shopify-products-scraper) | $0.8 per 1,000 (product) |
| [Sitemap URL Extractor - All URLs from sitemap.xml & robots.txt](https://apify.com/tenfoldfleet/sitemap-url-extractor) | $0.4 per 1,000 (url extracted) |
| [Technology Detector - Wappalyzer & BuiltWith Alternative](https://apify.com/tenfoldfleet/tech-stack-detector) | $10 per 1,000 (website analyzed) |
| [URL to Markdown - Web Page to LLM-Ready Text for AI Agents](https://apify.com/tenfoldfleet/url-to-markdown) | $1 per 1,000 (page converted) |
| [Workday Jobs Scraper - myworkdayjobs.com API with Salary](https://apify.com/tenfoldfleet/workday-jobs-scraper) | $1.5 per 1,000 (job posting) |
| [YouTube Comments Scraper - Replies, Likes & Sort by Newest](https://apify.com/tenfoldfleet/youtube-comments-scraper) | $0.6 per 1,000 (comment scraped) |
| [YouTube Transcript Scraper - Captions & Subtitles API](https://apify.com/tenfoldfleet/youtube-transcript-scraper) | $3 per 1,000 (transcript extracted) |

# Actor input Schema

## `stores` (type: `array`):

Shopify stores to analyze. Bare domains (allbirds.com), full URLs (https://www.allbirds.com/collections/men) or myshopify domains (weareallbirds.myshopify.com). One store = one result row. Non-Shopify sites are returned as free error rows.

## `maxProductPages` (type: `integer`):

How many /products.json pages (250 products each) to read per store for price, vendor, product type and sale statistics. 4 = up to 1,000 products. The total product count comes from the store's meta data and is exact regardless of this limit. 0 skips the catalog statistics.

## `includeContacts` (type: `boolean`):

Extract public business emails, phone numbers, social profiles, address and VAT number from the homepage, the contact page and the store policies (refund, privacy, terms, shipping, contact information).

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

How many stores to analyze in parallel (up to 20).

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

Optional. Shopify rate-limits heavy traffic per IP; the actor slows down automatically when that happens. For thousands of stores per run, Apify Proxy (datacenter) spreads requests over many IPs and keeps runs fast. Residential proxy is not supported and is switched to datacenter.

## Actor input object example

```json
{
  "stores": [
    "allbirds.com",
    "deathwishcoffee.com",
    "colourpop.com"
  ],
  "maxProductPages": 4,
  "includeContacts": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "stores": [
        "allbirds.com",
        "deathwishcoffee.com",
        "colourpop.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/shopify-store-analyzer").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 = { "stores": [
        "allbirds.com",
        "deathwishcoffee.com",
        "colourpop.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tenfoldfleet/shopify-store-analyzer").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 '{
  "stores": [
    "allbirds.com",
    "deathwishcoffee.com",
    "colourpop.com"
  ]
}' |
apify call tenfoldfleet/shopify-store-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tenfoldfleet/shopify-store-analyzer"
        }
    }
}
```

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/GebSY8UzYKJhlJ5W0/builds/iIhp0MEC0Y372ldee/openapi.json
