# Shopify Store Analyzer: Apps, Theme, Catalog, Prices & Contacts (`larkmoor/shopify-store-analyzer`) Actor

Analyze a list of Shopify stores: name, country, currency, product/collection counts, price range and median, sale and stock share, top vendors and types, new products, theme, apps and pixels, emails, phones, socials. Non-Shopify sites free. $8/1,000 stores.

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

## Pricing

from $6.80 / 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.
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 Store Analyzer: Apps, Theme, Catalog, Prices & Contacts

Give it a list of store domains and get one clean row per store: is it a Shopify store, its name, country and currency, how many products and collections it publishes, its price range and median price, how much of the catalog is on sale or sold out, its top vendors, product types and tags, how many products it added in the last 30 and 90 days, which theme it runs, which apps and tracking pixels are installed, and the public emails, phone numbers and social profiles it lists.

Everything comes from files every Shopify storefront serves in public — `/meta.json`, `/products.json`, `/collections.json`, the homepage and the contact page. No login, no browser, no API key, no proxies. Sites that turn out not to be Shopify stores — and stores that refuse to serve their data files — are listed free of charge, so you can throw a mixed list at it.

### What you can use it for

- **Lead generation for Shopify agencies and app makers**: find stores that run a competitor's app (or none in your category), on an old free theme, or with no email capture tool — then reach them through the contact details in the same row
- **Competitor research**: track a rival's catalog size, price points, discount depth and launch pace week over week
- **Supplier and wholesale prospecting**: see which brands a multi-vendor store carries (top vendors) and in which product types
- **Market sizing**: median price, product count and country for hundreds of stores in a niche, in one run
- **List cleaning**: confirm which domains in a lead list really are Shopify stores before you pay for anything else

### Why this one

- **$8 per 1,000 stores** — about half of what comparable Shopify analyzers charge, and non-Shopify inputs cost nothing
- **Facts, not guesses**: no made-up revenue or traffic "estimates"; every number comes from the store's own public files, and when a big catalog is only partly read the row says so (`catalogComplete: false`)
- **Exact product count** straight from the store, even for catalogs with 10,000+ products
- **80+ apps and pixels recognized**: Klaviyo, Attentive, Gorgias, Judge.me, Yotpo, Okendo, Loox, Recharge, Rebuy, Smile.io, Afterpay, Klarna, PageFly, GemPages, Triple Whale, Elevar, Meta / TikTok / Pinterest pixels, Google Tag Manager and many more
- **Theme details**: theme name, the theme it is built on (e.g. Dawn) and its version
- **Fast**: 4 stores at a time by default; a store takes 1–3 seconds

### Input

| Field | What it does |
|---|---|
| Stores | Domains or URLs (`allbirds.com`, `https://colourpop.com`, `name.myshopify.com`) |
| Analyze the product catalog | Price, sale, stock, vendor, type, tag and freshness stats (on by default) |
| Catalog pages per store | 250 products per page; 4 pages = up to 1,000 products read per store |
| Find emails, phones and social profiles | Reads the homepage and `/pages/contact` |
| Only output Shopify stores | Drop rows for non-Shopify inputs |
| Stores analyzed at once | 1–8 in parallel |
| Respect robots.txt | Skip pages a store disallows (on by default) |
| Max stores | Hard cap — you never pay for more than this |

Example input:

```json
{
  "stores": ["allbirds.com", "deathwishcoffee.com", "colourpop.com"],
  "analyzeCatalog": true,
  "maxCatalogPages": 4,
  "findContacts": true
}
```

### Output

One row per store. A real example (some lists shortened):

```json
{
  "input": "deathwishcoffee.com",
  "url": "https://www.deathwishcoffee.com",
  "isShopify": true,
  "shopName": "Death Wish Coffee",
  "myshopifyDomain": "deathwishcoffee.myshopify.com",
  "country": "US",
  "province": "New York",
  "city": "Round Lake",
  "currency": "USD",
  "locale": "en",
  "description": "Bold, Smooth and Delicious since 2012. We source USDA Organic and Fair Trade Certified™ ar…",
  "shipsToCountries": [
    "AD",
    "AE",
    "AF",
    "AG",
    "AI",
    "…"
  ],
  "shipsToCountriesCount": 224,
  "productCount": 153,
  "collectionCount": 126,
  "catalogComplete": true,
  "productsAnalyzed": 153,
  "variantsAnalyzed": 436,
  "priceMin": 5.0,
  "priceMedian": 29.98,
  "priceAvg": 28.72,
  "priceMax": 90.0,
  "onSalePercent": 15.7,
  "maxDiscountPercent": 50.0,
  "inStockPercent": 96.7,
  "soldOutProducts": 5,
  "topVendors": [
    {
      "name": "Death Wish Coffee Company",
      "count": 42
    },
    {
      "name": "Death Wish Coffee",
      "count": 35
    },
    {
      "name": "Sportiqe",
      "count": 26
    }
  ],
  "vendorCount": 15,
  "topProductTypes": [
    {
      "name": "Coffee",
      "count": 37
    },
    {
      "name": "Apparel",
      "count": 37
    },
    {
      "name": "Accessories",
      "count": 25
    }
  ],
  "topTags": [
    {
      "name": "Merch",
      "count": 90
    },
    {
      "name": "Subscription",
      "count": 49
    },
    {
      "name": "National Coffee Day",
      "count": 44
    }
  ],
  "newestProductAt": "2026-10-16T13:05:20-04:00",
  "oldestProductAt": "2013-11-04T13:44:10-05:00",
  "lastCatalogUpdateAt": "2026-10-26T06:35:35-04:00",
  "productsAddedLast30Days": 2,
  "productsAddedLast90Days": 21,
  "giftCards": 1,
  "themeName": "deathwish-shopify-20/production",
  "themeSchema": "Dawn",
  "themeVersion": "10.0.0",
  "themeStoreId": null,
  "apps": [
    "Klaviyo",
    "Gorgias",
    "Smile.io Loyalty",
    "Rebuy",
    "Afterpay",
    "Google Tag Manager",
    "Shop Pay"
  ],
  "appCount": 7,
  "emails": [
    "hey@deathwishcoffee.com"
  ],
  "phones": [],
  "socials": {
    "instagram": "https://www.instagram.com/deathwishcoffee",
    "facebook": "https://www.facebook.com/deathwishcoffee",
    "youtube": "https://www.youtube.com/channel/UC1uurJMded2rRJioe8yka7g",
    "x": "https://twitter.com/deathwishcoffee"
  },
  "hasBlog": false,
  "checkedAt": "2026-10-26T10:37:36Z",
  "error": null
}
```

Main fields:

- `isShopify`, `shopName`, `url`, `myshopifyDomain`, `country`, `province`, `city`, `currency`, `locale`, `shipsToCountriesCount`
- `productCount`, `collectionCount` — as published by the store
- `productsAnalyzed`, `variantsAnalyzed`, `catalogComplete` — how much of the catalog the stats below are based on
- `priceMin`, `priceMedian`, `priceAvg`, `priceMax` — each product's lowest variant price, in the store's currency
- `onSalePercent`, `maxDiscountPercent`, `inStockPercent`, `soldOutProducts`, `giftCards`
- `topVendors`, `vendorCount`, `topProductTypes`, `topTags`
- `newestProductAt`, `oldestProductAt`, `lastCatalogUpdateAt`, `productsAddedLast30Days`, `productsAddedLast90Days` (the last two only when the whole catalog was read)
- `themeName`, `themeSchema`, `themeVersion`, `themeStoreId`
- `apps`, `appCount` — apps, widgets and pixels detected on the homepage
- `emails`, `phones`, `socials` — public contact details (same-domain emails first)
- `error` — why a row is empty (not Shopify, site down, blocked)

Download as JSON, CSV, Excel or HTML from the dataset, or read it through the API.

### How much does it cost?

You pay **$0.008 per Shopify store analyzed** ($8 per 1,000) plus a tiny start fee. Inputs that are not Shopify stores, and stores that block their data files (partial rows), are free. Apify's free plan includes monthly credit, which covers about 600 stores.

Worked examples:

1. **50 competitor stores, weekly**: 50 × $0.008 = $0.40 per run, about $1.60 a month
2. **A 2,000-domain lead list where 1,200 turn out to be Shopify**: 1,200 × $0.008 = $9.60 (the other 800 are free)
3. **Apps and contacts only** (catalog off) for 500 stores: still $4.00, but the run finishes faster

Higher Apify plans get an automatic discount (Bronze −5%, Silver −10%, Gold and up −15%).

### FAQ

**Is this legal?** The actor reads only public pages and public JSON files that Shopify storefronts publish for every visitor, at a polite pace, and it respects each store's robots.txt by default. It does not log in, does not bypass any protection and does not collect customer data. Contact details are the business contacts the store itself publishes. As always, use the data in line with the laws that apply to you (for example, anti-spam rules for outreach).

**Why is a store marked not Shopify?** It does not serve Shopify's storefront files — it runs on another platform, or the domain is a landing page in front of the real store. Try the shop's own domain or its `.myshopify.com` address.

**Why are the "added in the last 30 days" numbers empty?** They are only filled when the whole catalog was read, because a partial read could undercount. Raise "Catalog pages per store" to cover the full catalog (the exact `productCount` tells you how many pages you need).

**Does it estimate revenue or traffic?** No. Those numbers are always guesses; this actor sticks to what the store publishes.

**Some stores have no emails.** Many big brands only offer a contact form. The socials and phone fields often still have something.

**Can it list every product?** For full product rows (each product and variant with SKU, price and stock), use our Shopify Store Products actor; this one summarizes the store.

### Integrations

Schedule it weekly and push the dataset to Google Sheets, Airtable, a CRM, Slack or a webhook with Apify integrations, or call it from Make, Zapier, n8n or your own code through the Apify API.

### Changelog

- 0.1 (Oct 2026): first release — store facts, catalog stats, theme, 80+ apps/pixels recognized, contacts, parallel analysis, free non-Shopify rows.

# Actor input Schema

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

Store domains or URLs, one per line (e.g. 'allbirds.com' or 'https://colourpop.com'). Custom domains and \*.myshopify.com both work. Sites that are not Shopify stores are listed with isShopify = false and are not charged.

## `analyzeCatalog` (type: `boolean`):

Read the store's public product list to compute price range, median, sale and stock share, top vendors, product types, tags and catalog freshness. Turn off for a faster apps/theme/contacts-only check.

## `maxCatalogPages` (type: `integer`):

How many pages of 250 products to read per store. 4 pages = up to 1,000 products. When a store has more, the stats are computed on the products read and catalogComplete is false. The product count itself comes from the store and is exact either way.

## `findContacts` (type: `boolean`):

Read the homepage and the /pages/contact page for public emails, phone links and social profile links.

## `onlyShopify` (type: `boolean`):

Skip rows for inputs that are not Shopify stores (they are never charged either way).

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

How many stores to read in parallel (1-8). Each store's own pages are read one at a time.

## `respectRobotsTxt` (type: `boolean`):

Skip any page the store's robots.txt disallows.

## `delaySeconds` (type: `number`):

Pause between product-list pages of the same store, to stay polite.

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

Hard cap on the number of stores analyzed in this run.

## Actor input object example

```json
{
  "stores": [
    "allbirds.com",
    "deathwishcoffee.com",
    "colourpop.com"
  ],
  "analyzeCatalog": true,
  "maxCatalogPages": 4,
  "findContacts": true,
  "onlyShopify": false,
  "concurrency": 4,
  "respectRobotsTxt": true,
  "delaySeconds": 0.5,
  "maxStores": 1000
}
```

# Actor output Schema

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

All results as JSON items in the run's default dataset (also downloadable as CSV/Excel from the dataset).

# 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("larkmoor/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("larkmoor/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 larkmoor/shopify-store-analyzer --silent --output-dataset

```

## MCP server setup

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