# Shopify & E-commerce Store Analyzer with Contacts (`digital_influx/ecommerce-store-analyzer`) Actor

Analyze any list of online stores: platform and Shopify theme, catalog size from the sitemap, products updated in the last 30 days, price range from sample products, emails, phones and social profiles, review, email marketing and payment apps, and the email provider. Shopify, WooCommerce and more.

- **URL**: https://apify.com/digital_influx/ecommerce-store-analyzer.md
- **Developed by:** [Bruno Petrelli](https://apify.com/digital_influx) (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 $10.00 / 1,000 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

## Shopify & E-commerce Store Analyzer with Contacts

Give it a list of **online stores** and get **one row per store** with everything a sales team, an agency or an app maker wants to know before reaching out:

- **Platform:** Shopify, WooCommerce, BigCommerce, Magento, PrestaShop, Shopware, VTEX and more. For Shopify stores, the **theme** (the name the store gave it and the theme it is built on, with its version) and the store's **myshopify.com** address.
- **Catalog:** how many products the store lists in its sitemap, how many of them changed in the last 30 days and when the catalog last changed. A store whose products have not changed in months is likely inactive.
- **Prices:** the lowest, median and highest price of a sample of product pages, in the store's currency, with how many are on sale and in stock, the brands and the sample products themselves.
- **Contacts:** emails, phone numbers and the store's Instagram, Facebook, TikTok, YouTube, Pinterest, X and LinkedIn, plus the people named on its legal pages.
- **Apps:** the review app (Judge.me, Yotpo, Okendo, Stamped, Loox...), email and SMS marketing (Klaviyo, Omnisend, Attentive...), payments and subscriptions, analytics, ad pixels, chat and search tools.
- **Email provider** (Google Workspace, Microsoft 365, Zoho...) from the domain's mail servers.

**You only pay for stores.** Websites that are not online stores, block this Actor, cannot be reached or are not valid get their row free, with the reason.

### What you can use it for

- **Lead generation for Shopify and e-commerce services:** qualify a list of stores by platform, size, price range and the apps they already use, and get the contacts to reach them.
- **Selling apps and agencies' services:** find the stores on Dawn or on an old theme, without a reviews app, or using a competitor's app.
- **Competitive research:** see a competitor's catalog size, price range, discounts and stack in one row.
- **AI agents:** plain JSON, one row per store. Agents can call this Actor through the Apify MCP server.

### Input

| Field | What it does |
|---|---|
| **Store websites** (required) | One per line: a store's domain (`thesill.com`) or address. Websites that are not online stores are saved free. On the free Apify plan a run analyzes the first 10 websites; any paid Apify plan removes that limit. |
| Sample products per store | Product pages read from each store's sitemap for the price range, the sale and stock counts and the brands: 1 to 20, default 5. The whole sitemap is counted either way. |
| Pages read for contacts | Pages read for emails, phone numbers and social profiles, the home page included (contact, about, legal notice...): 1 to 10, default 4. |
| Include the email provider | On by default: one DNS query (MX) per store, no extra cost. |
| Stores in parallel | 1 to 10 (default 4). |

```json
{
  "websites": ["thesill.com", "nalgene.com", "tentree.com", "brooklinen.com"]
}
```

### Output

One row per website. This is thesill.com on 2026-10-27 (the sample products, people and some columns are shortened here):

```json
{
  "input": "thesill.com",
  "domain": "thesill.com",
  "url": "https://www.thesill.com/",
  "status": "ok",
  "error": null,
  "storeName": "The Sill",
  "description": "Shop houseplants, outdoor plants, and trees from The Sill. Beginner-friendly plants...",
  "language": "en",
  "platform": "Shopify",
  "shopifyTheme": "The Sill v5.0.0",
  "shopifyBaseTheme": "Horizon",
  "shopifyBaseThemeVersion": "3.2.0",
  "myshopifyDomain": "the-sill.myshopify.com",
  "currency": "USD",
  "country": "US",
  "productsInSitemap": 923,
  "catalogCapped": false,
  "productsUpdatedLast30Days": 923,
  "lastProductUpdate": "2026-10-27T20:54:14.000Z",
  "catalogStatus": "ok",
  "productsSampled": 5,
  "priceCurrency": "USD",
  "priceMin": 8,
  "priceMedian": 15,
  "priceMax": 159,
  "sampleOnSale": 2,
  "sampleInStock": 2,
  "brands": ["The Sill"],
  "sampleProducts": [
    { "name": "Large Pallas Planter", "price": 159, "currency": "USD", "availability": "in_stock", "url": "https://www.thesill.com/products/the-pallas-floor-planter" }
  ],
  "emails": ["info@thesill.com"],
  "phones": ["8889742079"],
  "instagram": "https://www.instagram.com/thesill",
  "facebook": "https://www.facebook.com/TheSillNYC",
  "tiktok": "https://www.tiktok.com/@thesill",
  "youtube": "https://www.youtube.com/thesill",
  "pinterest": "https://www.pinterest.com/thesillnyc",
  "twitter": "https://x.com/thesill",
  "linkedin": null,
  "emailProvider": "Google Workspace",
  "technologyCount": 9,
  "technologies": ["Shopify", "Recharge", "Google Tag Manager", "Klaviyo", "Gorgias", "Cloudflare", "Tailwind CSS", "Google Fonts", "Stamped"],
  "reviews": ["Stamped"],
  "marketing": ["Klaviyo"],
  "payments": ["Recharge"],
  "chat": ["Gorgias"],
  "pagesRead": 12,
  "checkedAt": "2026-10-27T22:52:44.245Z"
}
```

Field notes:

- `status`: `ok` (an online store, charged), `not_a_store` (no e-commerce platform on the home page and no product pages in the sitemap: free), `blocked_by_robots`, `blocked` (the website refused the request, for example 403), `unreachable` or `invalid`. `error` says why.
- `productsInSitemap` counts the product pages in the store's product sitemap. `null` means the store has no product sitemap, not zero products: some stores list their products in a general sitemap with every other page, and some have no sitemap at all (`catalogStatus: "no_sitemap"`). `catalogCapped: true` means 20,000 or more.
- `productsUpdatedLast30Days` and `lastProductUpdate` come from the dates in the product sitemap. A sitemap dates the **last change** of a product page, any change: Shopify often dates every product the same day after a stock or price update, so on Shopify the date says the store is active more than how many products are new.
- `currency` is the one the store shows (Shopify tells it); `priceCurrency` is the one of the sampled prices, and products in another currency are left out of the range.
- `reviews`, `marketing`, `payments`, `analytics`, `advertising`, `chat` and `search` group the apps by what they do; `technologies` has all of them.
- The run's **OUTPUT** record has the totals and how many stores run on each platform.

### Pricing

Pay per event: **one `store` event per online store analyzed**. Websites that are not online stores, block this Actor in robots.txt, refuse the request, cannot be reached or are not valid are saved **free**. Set a maximum cost for a run and the Actor stops cleanly when it is reached.

**Free Apify plan:** a run analyzes the **first 10 websites** of the list, with every field, so you can try it on real stores. The run ends normally and its status message says how many websites were left out. Any paid Apify plan removes the limit.

### How it reads a store

It reads only the store's own public pages: the home page, up to 3 more pages for contacts, the product sitemap and the sample product pages, plus one DNS query. robots.txt is respected for every page, and the User-Agent names the Actor, so store owners can see it and allow or block it. A website whose home page shows no e-commerce platform is first tried with one product page, so a list with many websites that are not stores is quick to read. A store's `Crawl-delay` is respected too (nalgene.com asks for 10 seconds between pages, so its product pages take a minute). No proxies, no login, no third-party databases: every value is read live from the store.

Use it on stores whose terms allow reading their public pages.

### Use it from AI agents (MCP)

Claude, ChatGPT, Cursor and any other MCP client can run this Actor as a tool: add `https://mcp.apify.com?tools=digital_influx/ecommerce-store-analyzer` as a remote MCP server and sign in with your Apify account.

### Good to know

- The Actor reads the pages as they arrive from the server, without running their JavaScript. Apps that load later through a tag manager do not show; prices and contacts that only appear after JavaScript runs are missed.
- The sample products are the first ones of the store's sitemap, not a random draw: the price range describes them, not the whole catalog.
- **Also from us:** **E-commerce Product Scraper** (every product of a store, with variants, GTIN and stock), **Price Monitor** (price drops and stock alerts), **Website Contact Scraper** and **Website Tech Stack Detector**, which this Actor builds on.

### Support

Found a wrong value or a store it cannot read? Open an issue on the Actor's Issues tab with the website. Issues get an answer within a few days.

# Actor input Schema

## `websites` (type: `array`):

One per line: a store's domain (thesill.com) or address. Websites that are not online stores are saved free. On the free Apify plan a run analyzes the first 10 websites; any paid Apify plan removes that limit.

## `sampleProducts` (type: `integer`):

Product pages read from each store's sitemap for the price range, the sale and stock counts and the brands (1 to 20).

## `maxContactPages` (type: `integer`):

Pages read for emails, phone numbers and social profiles, the home page included: contact, about, legal notice... (1 to 10).

## `includeEmailProvider` (type: `boolean`):

Look up the domain's mail servers (MX) in DNS: Google Workspace, Microsoft 365, Zoho... One DNS query per store, no extra cost.

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

1 to 10. Each store is read a few pages at a time and its robots.txt is always respected.

## Actor input object example

```json
{
  "websites": [
    "thesill.com",
    "nalgene.com"
  ],
  "sampleProducts": 5,
  "maxContactPages": 4,
  "includeEmailProvider": true,
  "maxConcurrency": 4
}
```

# 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 = {
    "websites": [
        "thesill.com",
        "nalgene.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("digital_influx/ecommerce-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 = { "websites": [
        "thesill.com",
        "nalgene.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("digital_influx/ecommerce-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 '{
  "websites": [
    "thesill.com",
    "nalgene.com"
  ]
}' |
apify call digital_influx/ecommerce-store-analyzer --silent --output-dataset

```

## MCP server setup

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