# Shopify Store Monitor – Prices, Stock & New Products (`affluent_linden/shopify-store-monitor`) Actor

Scrape any Shopify store's full catalog and get alerts-ready change events between runs: price drops, sold out, back in stock, new products and removals. No login, no browser, fast and cheap.

- **URL**: https://apify.com/affluent_linden/shopify-store-monitor.md
- **Developed by:** [Kiran Raj Dhakal](https://apify.com/affluent_linden) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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 Store Monitor: Prices, Stock & New Products

**Track any Shopify store and get notified of what changed since the last run**: price drops and increases, products and sizes that sold out or came back in stock, new launches and removed products.

No login, no browser, no proxies needed. A 10,000-product store takes about a minute.

### Who it's for

- **Dropshippers and e-commerce brands**: watch competitors' prices, launches and stock-outs.
- **Price comparison and deal sites**: keep catalogs and prices fresh on a schedule.
- **Resellers**: get alerts when sold-out sizes come back.
- **Analysts and agencies**: export a whole catalog to CSV, Excel, JSON or Google Sheets in one click.

### What you get

#### 1. Full catalog: one row per product

| field | example |
|---|---|
| `title`, `url`, `handle` | Men's Tree Runners |
| `vendor`, `productType`, `tags` | Allbirds, Shoes, \[...] |
| `minPrice`, `maxPrice`, `onSale` | 79, 98, true |
| `available`, `availableVariantCount`, `variantCount` | true, 6, 11 |
| `image`, `images` | product image URLs |
| `createdAt`, `publishedAt`, `updatedAt` | timestamps |
| `variants[]` | id, title, SKU, price, compare-at price, available, options |

#### 2. Change events: from the second run onward

| event | meaning |
|---|---|
| `NEW_PRODUCT` | a product appeared in the catalog |
| `REMOVED` | a product disappeared (unpublished or deleted) |
| `PRICE_CHANGE` | a variant's price changed, with old price, new price and % change |
| `SOLD_OUT` / `BACK_IN_STOCK` | the whole product went out of or back into stock |
| `VARIANT_SOLD_OUT` / `VARIANT_RESTOCKED` | a single size or colour changed availability |
| `NEW_VARIANT` | a new size or colour was added |

Open the **Changes** view in the dataset to see only the change events.

### How to use it

1. Enter one or more store domains, e.g. `allbirds.com` or `gymshark.com`. Any URL on the store works.
2. Click **Start**. The first run saves a baseline and outputs the full catalog.
3. **Create a schedule** (daily or hourly) under *Schedules*. Every later run outputs what changed.
4. Get alerts by connecting the run to **Slack, email, Google Sheets, Zapier, Make or a webhook** under *Integrations*.

Tip: set *What to output* to **Changes only** for a clean alert feed.

### Input example

```json
{
  "storeUrls": ["allbirds.com", "https://www.gymshark.com"],
  "output": "products_and_changes"
}
```

### Output example (change event)

```json
{
  "type": "change",
  "event": "PRICE_CHANGE",
  "store": "https://allbirds.com",
  "title": "Men's Tree Runners",
  "url": "https://allbirds.com/products/mens-tree-runners",
  "variantTitle": "10",
  "oldPrice": 98.0,
  "newPrice": 79.0,
  "changePct": -19.39,
  "detectedAt": "2026-10-24T10:00:00+00:00"
}
```

### Pricing

You pay per product scraped, plus a small amount of Apify platform usage. Because it doesn't run a browser, platform usage is minimal, so tracking a mid-size store daily costs a few cents per run.

### FAQ

**Does it work on every Shopify store?**
On almost all of them. It reads the store's public catalog. If a merchant has disabled that, the run outputs an `error` row for that store and carries on with the others.

**Can it show exact stock quantities?**
No. Shopify publishes whether each variant is in stock, not how many units are left. The monitor tracks availability per variant on every run.

**Why are there no change events on my first run?**
The first run saves a baseline. Change events start from the second run, so schedule the Actor.

**Can I track only part of a store?**
You can cap products per store with *Max products per store*, but change tracking is skipped for that run, since a partial catalog can't be compared reliably.

**Is this legal?**
It collects only publicly available product data (no personal data, no login, no checkout). As with any scraping, make sure your use complies with the laws and terms that apply to you.

### Need something custom?

Need extra fields, a non-Shopify store, a dashboard, or alerts sent somewhere specific? I build and maintain custom scrapers: [scrapers.kiranrajdhakal.com.np](https://scrapers.kiranrajdhakal.com.np). You can also open an issue on this Actor and I usually reply within a day.

# Actor input Schema

## `storeUrls` (type: `array`):

Store domains or any URL on the store, e.g. allbirds.com or https://www.gymshark.com/collections/all

## `output` (type: `string`):

Full catalog rows, only change events (price/stock/new/removed), or both. Change events appear from the second run onward; schedule the Actor (e.g. daily) to build history.

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

Leave empty for the whole catalog. When set, change tracking is skipped (a partial catalog cannot be diffed).

## `requestDelaySecs` (type: `number`):

Politeness delay between catalog pages of the same store.

## Actor input object example

```json
{
  "storeUrls": [
    "allbirds.com"
  ],
  "output": "products_and_changes",
  "requestDelaySecs": 1
}
```

# Actor output Schema

## `products` (type: `string`):

Full catalog: one row per product with prices, availability and variants.

## `changes` (type: `string`):

Price changes, sold out / back in stock, new and removed products since the previous run.

## `summary` (type: `string`):

Products and changes per store, plus any stores that failed.

# 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 = {
    "storeUrls": [
        "allbirds.com"
    ]
};

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

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

```

## MCP server setup

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

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/HdkAxfEzfw3clJfOu/builds/K9h3XCGxOzS1xA5mN/openapi.json
