# Shopify Store Analyzer – Apps, Theme, Prices (`sfoln/shopify-store-analyzer`) Actor

Analyze any Shopify or WooCommerce store: one report with platform, shop name, currency and country, product count, price stats and sale share, top vendors and product types, newest products, theme, installed apps and pixels, emails and social links. $6 per 1,000 stores.

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

## Pricing

from $6.00 / 1,000 store reports

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

Analyze **any Shopify or WooCommerce store** from its domain: one report per store with the **platform, shop name, currency and country, product count, price statistics and share on sale, top vendors and product types, newest products, the live theme, installed apps and tracking pixels, emails and social links** and hosting hints. The store's public storefront JSON (Shopify `/meta.json` and `/products.json`, the WooCommerce Store API) and its homepage are read directly, so there is no login, no API key and no browser. Built for Shopify app and agency prospecting, e-commerce lead generation, competitor research, market sizing and AI agents.

- **What you get:** `platform`, `storeName`, `country`, `currency`, `productCount`, `priceStats`, `onSaleShare`, `topVendors`, `topProductTypes`, `newestProducts`, `themeName`, `apps`, `pixels`, `emails`, `socials`, `techHints`.
- **Price:** $0.006 per store report (`store-report`), $6 per 1,000 stores. Stores on other platforms, password-protected, blocked or unreachable stores cost nothing.
- **About 70 common apps recognized** (Klaviyo, Attentive, Yotpo, Judge.me, Recharge, Gorgias, Rebuy, Global-e …) plus Meta, Google, TikTok and other pixels.
- **Works everywhere:** API, MCP for AI agents, Make, Zapier, n8n, schedules and webhooks.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `stores` | string\[] | – | Store domains or URLs (`allbirds.com`, `https://www.allbirds.com`); any page URL of a store analyzes the whole store. Entries for the same store are merged. |
| `maxProducts` | integer | 250 | Products read per store for the catalog statistics (1–2,500). Shopify lists the most recently published products first. The product count is always the store's full count. |
| `maxStores` | integer | 1000 | Safety cap for this run; further entries are ignored and counted as `inputItemsDropped` in the `OUTPUT` record. |
| `concurrency` | integer | 5 | Stores analyzed in parallel (1–10). The requests to one store run one at a time, at most 2 per second. |
| `itemTimeoutSecs` | integer | 180 | Time limit per store; reading the catalog stops cleanly before it and the statistics cover the products read. |

```json
{
  "stores": ["allbirds.com", "kith.com", "https://www.gymshark.com"],
  "maxProducts": 250
}
```

### Output

One record per store:

```json
{
  "input": "allbirds.com",
  "store": "www.allbirds.com",
  "url": "https://www.allbirds.com",
  "platform": "shopify",
  "storeName": "Allbirds",
  "description": "The world’s most comfortable shoes, made with natural materials like merino wool, eucalyptus tree fiber, and sugar cane.",
  "country": "US",
  "province": "California",
  "city": "Beverly Hills",
  "currency": "USD",
  "locale": "en-US",
  "myshopifyDomain": "weareallbirds.myshopify.com",
  "productCount": 692,
  "collectionCount": 1346,
  "shipsToCountries": ["US"],
  "shopPayInstallments": true,
  "catalogRead": true,
  "catalogComplete": false,
  "productsAnalyzed": 250,
  "priceStats": { "min": 4, "p25": 60, "median": 75, "p75": 110, "max": 165, "mean": 83.86 },
  "onSaleShare": 0.552,
  "avgDiscountPct": 48,
  "availableShare": 0.464,
  "variantsPerProduct": 10.88,
  "vendorCount": 1,
  "productTypeCount": 4,
  "topVendors": [{ "name": "Allbirds", "count": 250 }],
  "topProductTypes": [{ "name": "Shoes", "count": 234 }, { "name": "Apparel", "count": 6 }, { "name": "Underwear", "count": 2 }, { "name": "Socks", "count": 1 }],
  "topTags": [{ "name": "shoprunner", "count": 223 }, { "name": "FINAL SALE", "count": 114 }],
  "newestProducts": [
    { "title": "Women's Wool Runner - Natural Grey (Light Grey Sole)", "url": "https://www.allbirds.com/products/womens-wool-runners-natural-grey", "price": 49, "createdAt": "2026-05-26T18:10:21.000Z", "publishedAt": "2026-09-25T23:24:03.000Z" }
  ],
  "newProducts30d": 0,
  "newProducts90d": 0,
  "lastProductUpdate": "2026-10-14T22:58:08.000Z",
  "themeName": "[DNAM Theme July 2026]",
  "theme": { "name": "[DNAM Theme July 2026]", "schemaName": "allbirds-theme", "schemaVersion": "1.231.12", "themeStoreId": null, "id": 130450260048, "role": "main" },
  "apps": [
    { "name": "Attentive", "category": "email & SMS" },
    { "name": "Redo", "category": "returns & shipping" },
    { "name": "Shop Pay", "category": "payments" },
    { "name": "Elevar", "category": "analytics" }
  ],
  "pixels": ["Meta Pixel", "Google Tag Manager", "Microsoft Clarity"],
  "techHints": ["Shopify", "Cloudflare", "HSTS"],
  "emails": ["help@allbirds.com"],
  "phones": [],
  "socials": { "instagram": "https://www.instagram.com/allbirds", "facebook": "https://www.facebook.com/weareallbirds", "tiktok": "https://www.tiktok.com/@weareallbirds" },
  "contactPages": [],
  "homepageRead": true,
  "status": "ok",
  "charged": true,
  "chargedEvent": "store-report",
  "source": "storefront",
  "fetchedAt": "2026-10-14T12:00:02.000Z",
  "warnings": ["The catalog statistics cover the first 250 products of 692 (maxProducts)."]
}
```

| Field | Description |
| --- | --- |
| `platform`, `store`, `url` | `shopify` or `woocommerce` (`other` for unsupported stores, see below), and the store's host and origin after redirects. |
| `storeName`, `description`, `country`, `province`, `city`, `currency`, `locale`, `myshopifyDomain` | Shopify's `/meta.json` (name, address, currency, permanent `.myshopify.com` domain), else the homepage (site name, meta description, language). WooCommerce currencies come from the product prices. |
| `productCount`, `collectionCount`, `shipsToCountries`, `shopPayInstallments` | The store's own counts of published products and collections (WooCommerce: `X-WP-Total`), shipping countries and Shop Pay Installments (Shopify). |
| `catalogRead`, `catalogComplete`, `productsAnalyzed` | Whether the catalog could be read, whether every product was read, and how many products the statistics cover (up to `maxProducts`). |
| `priceStats`, `onSaleShare`, `avgDiscountPct`, `availableShare`, `variantsPerProduct` | Quartiles, mean and range of each product's lowest price; the share of products on sale (a variant below its compare-at price) and their mean discount; the share with at least one variant in stock. |
| `vendorCount`, `productTypeCount`, `topVendors`, `topProductTypes`, `topTags` | Distinct and most common vendors (brands), product types (WooCommerce: first categories) and tags (machine tags such as `key::value` left out). |
| `newestProducts`, `newProducts30d`, `newProducts90d`, `lastProductUpdate` | The 5 most recently created products, products created in the last 30 / 90 days and the latest product update (Shopify; the WooCommerce Store API has no dates). |
| `themeName`, `theme` | The live Shopify theme (`Shopify.theme`: name, the theme it is built on as `schemaName`, version, Theme Store ID); WooCommerce: the WordPress theme folder. |
| `apps`, `pixels` | Apps the homepage loads, by category (email & SMS, reviews & UGC, subscriptions, loyalty, support, returns, search, upsell, page builders, payments …), and advertising / analytics pixels. |
| `techHints` | CDN, hosting and server hints from the homepage's response headers (Cloudflare, Fastly, WP Engine, Nginx …) and its generator tag. |
| `emails`, `phones`, `socials`, `contactPages` | Contacts on the homepage: emails (the store's own domain first), phone numbers, social profiles and contact / about pages. |

`status`: `ok` for a Shopify or WooCommerce store whose catalog or homepage was read (charged), `not_found` for a store on another platform (`unsupported_platform`, with `platform: "other"` and `platformName` such as BigCommerce, Magento, Wix or Squarespace when the homepage shows it), a password-protected store or a domain that does not exist, `error` when the store blocks automated requests (`blocked`) or failed, `skipped_invalid` for an unusable entry and `skipped_budget` / `skipped_free_plan` when a cap was hit. Only `ok` is charged.

### Pricing

Store discounts: the FREE and BRONZE tiers use the list prices below. SILVER receives 5% off; GOLD, PLATINUM and DIAMOND receive 10% off billable result events. The platform start fee is unchanged. Check the Actor's Store pricing table for the prices currently in effect.

Pay-per-event, no subscription:

| Event | Price | When charged |
| --- | --- | --- |
| `store-report` | **$0.006** per store ($6 / 1,000) | once per Shopify or WooCommerce store whose catalog or homepage was read |

Example: a list of 1,000 e-commerce domains of which 620 run on Shopify or WooCommerce costs 620 × $0.006 = **$3.72**; the other 380 are free. Reading up to 2,500 products per store costs nothing extra. Apart from Apify's automatic Actor-start charge ($0.00005 per GB of run memory) there is no start fee.

Set **Maximum cost per run** to cap spend: the Actor checks the budget before each store and stops cleanly; remaining stores are returned with `status: "skipped_budget"` and are not charged.

Accounts on the Apify free plan can process up to 10 stores per run.

### Use with AI agents (MCP)

Use this Actor from Claude, ChatGPT, Cursor, VS Code or any other MCP client through the [Apify MCP server](https://mcp.apify.com). Add this server URL to your client and sign in with your Apify account when asked:

```text
https://mcp.apify.com?tools=sfoln/shopify-store-analyzer
```

To run the MCP server locally instead, start `npx -y @apify/actors-mcp-server --tools sfoln/shopify-store-analyzer` with your `APIFY_TOKEN` in the environment.

Example prompt:

> Analyze the Shopify stores allbirds.com and kith.com: which theme and apps does each use, how many products do they sell, what is their median price and what share of products is on sale?

Runs started by an agent are billed like any other run (see Pricing). Agents can cap what a run may spend with `maxTotalChargeUsd`.

### API usage

Run the Actor and get its dataset items in one call (the call waits up to 5 minutes for the run to finish):

```bash
curl -X POST "https://api.apify.com/v2/acts/sfoln~shopify-store-analyzer/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"stores": ["allbirds.com"], "maxProducts": 250}'
```

For large inputs, start the run asynchronously and download the dataset when it has finished:

```bash
## 1. Start a run: the response holds the run ID (data.id) and its dataset ID (data.defaultDatasetId)
curl -X POST "https://api.apify.com/v2/acts/sfoln~shopify-store-analyzer/runs" \
  -H "Authorization: Bearer <APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"stores": ["allbirds.com"], "maxProducts": 250}'
## 2. Repeat until data.status is SUCCEEDED (each call waits up to 60 s)
curl "https://api.apify.com/v2/actor-runs/<runId>?waitForFinish=60" -H "Authorization: Bearer <APIFY_TOKEN>"
## 3. Download the results (format=json, csv or xlsx)
curl "https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json" -H "Authorization: Bearer <APIFY_TOKEN>"
```

Python ([apify-client](https://pypi.org/project/apify-client/)):

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("sfoln/shopify-store-analyzer").call(run_input={"stores": ["allbirds.com"], "maxProducts": 250})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

Instead of polling, you can attach a webhook to the run (see Integrations). The API tab of this page shows the same calls for JavaScript and the Apify CLI.

### Integrations

- **Make, Zapier and n8n:** run `sfoln/shopify-store-analyzer` with the Apify app (in n8n, the Apify node) and pass the dataset items to the next step of your workflow.
- **Google Sheets:** add the items to a sheet with the Google Sheets step of Make, Zapier or n8n, or download them as CSV or Excel from the run's Storage tab or the API (`format=csv` or `format=xlsx`).
- **Webhooks:** get a POST request when a run succeeds or fails: add a webhook in the Actor's Integrations tab, or pass `webhooks` when you start a run through the API.
- **Schedules:** run it hourly, daily or weekly with the same input from Apify Schedules; every run keeps its results in its own dataset.
- **More:** Slack, Google Drive, GitHub, LangChain, LlamaIndex and other [Apify integrations](https://docs.apify.com/platform/integrations).

### Related Actors

- [Shopify Products Scraper + WooCommerce](https://apify.com/sfoln/shopify-products-scraper)
- [Tech Stack Detector – Website Technologies](https://apify.com/sfoln/tech-stack-detector)
- [Website Contact Details Scraper](https://apify.com/sfoln/company-contacts-finder)
- [Company Enrichment – Firmographics by Domain](https://apify.com/sfoln/company-enrichment)

See [all our Actors](https://apify.com/sfoln) on Apify Store.

### FAQ

#### How much does it cost, and am I charged for failed items?

You pay per event at the prices under Pricing above, plus a run start fee of $0.00005 per GB of memory, with no subscription; platform usage is included. Errors and skipped items (`skipped_…` statuses) are never charged; a lookup that finds nothing is charged only where Pricing says so, and every record's `charged` field shows whether it was billed. Set **Maximum cost per run** to cap what a single run can spend.

#### How fresh is the data?

Each run queries its source while it runs, so you get what the source returns at that moment. Source-specific details, such as how often a provider refreshes its own database, are under Limits & notes.

#### What are the limits?

Per-run caps (for example the maximum number of items) are listed under Input, source limits under Limits & notes, and the free-plan limit under Pricing. For big batches, start the run asynchronously (see API usage) and read the dataset when it has finished.

#### Can I schedule runs or get results by webhook?

Yes. Create a schedule in Apify Console to run it hourly, daily or weekly with the same input, and add a webhook to get a POST request when a run finishes (see Integrations).

#### What does this Actor record about my runs?

This Actor records operational metrics about each run (item counts, duration, charges, error codes and a pseudonymous hash of your Apify user ID) to monitor reliability and costs. It never stores your input or results.

#### How are apps detected?

From the hosts the homepage loads scripts and assets from (and a few distinctive script names): about 70 common apps such as Klaviyo, Attentive, Yotpo, Judge.me, Recharge, Gorgias, Rebuy and Global-e, plus advertising and analytics pixels. Apps that load nothing on the homepage (back-office apps, apps only on product or checkout pages) cannot be seen.

#### Does it read the whole catalog?

The product count is always the store's full count. Price statistics, vendors, product types and newest products cover up to maxProducts products (250 by default, up to 2,500); Shopify lists the most recently published products first. catalogComplete tells whether every product was read.

#### What happens with stores that are not on Shopify or WooCommerce?

They return status not_found with platform other and, when the homepage shows it, the platform they use (BigCommerce, Magento, Wix, Squarespace …). They are not charged, nor are password-protected, blocked or unreachable stores.

#### How do I get help?

Open an issue in the Actor's Issues tab and include the link to the run, so we can reproduce the problem. Feature requests are welcome there too.

### Limits & notes

- Up to 2,500 products analyzed per store and 10,000 stores per run. The statistics of larger catalogs cover the most recently published products (Shopify) or the first Store API pages (WooCommerce); `productCount` is always the full count.
- Apps are recognized on the homepage only: apps that load nothing there (back-office tools, checkout or product-page widgets) are not seen. The app table covers about 70 common apps.
- A store whose storefront JSON is refused but whose homepage is readable still gets a report without catalog statistics (`catalogRead: false`, charged). Stores that refuse every request (Cloudflare challenges, HTTP 403/429) end as `error` and are not charged.
- WooCommerce needs the Store API (WooCommerce 6.0+, enabled by default) for catalog statistics; it publishes no product dates and no shop address.
- Country, city and shipping countries come from Shopify's `/meta.json`; multi-currency stores report their base currency.
- Data is live: each run reads the store at that moment. For monitoring (new products, theme or app changes), schedule the Actor and compare runs.

# Actor input Schema

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

Store homepages or domains (allbirds.com, https://www.allbirds.com), one per line; any page URL of a store analyzes the whole store. The platform is detected per store: Shopify (/meta.json, /products.json) or WooCommerce (Store API). Duplicates are removed. Accounts on the Apify free plan can process up to 10 stores per run.

## `maxProducts` (type: `integer`):

Products read per store for the catalog statistics (1–2,500). Shopify lists the most recently published products first; larger catalogs are summarized from these and the report says so. The product count is always the store's full count. No extra charge.

## `maxStores` (type: `integer`):

Safety cap on the number of stores processed in this run.

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

Stores analyzed in parallel (1–10). The requests to one store run one at a time, at most 2 per second.

## `itemTimeoutSecs` (type: `integer`):

Reading one store stops cleanly shortly before this limit (60–3600); the statistics then cover the products read.

## Actor input object example

```json
{
  "stores": [
    "allbirds.com"
  ],
  "maxProducts": 250,
  "maxStores": 1000,
  "concurrency": 5,
  "itemTimeoutSecs": 180
}
```

# Actor output Schema

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

No description

## `summary` (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"
    ],
    "maxProducts": 250
};

// Run the Actor and wait for it to finish
const run = await client.actor("sfoln/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"],
    "maxProducts": 250,
}

# Run the Actor and wait for it to finish
run = client.actor("sfoln/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"
  ],
  "maxProducts": 250
}' |
apify call sfoln/shopify-store-analyzer --silent --output-dataset

```

## MCP server setup

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