# Shopify Sale Monitor (`schnellscrapers/shopify-sale-monitor`) Actor

Monitor Shopify storefronts for in-stock variants, current and compare-at prices, discounts, SKUs, tags, and product URLs. Focus a recurring competitor-price or restock workflow with pre-write availability and sale filters—no browser or account needed.

- **URL**: https://apify.com/schnellscrapers/shopify-sale-monitor.md
- **Developed by:** [Nate Schnell](https://apify.com/schnellscrapers) (community)
- **Categories:** E-commerce, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product variants

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Shopify Sale & Stock Monitor do?

Shopify Sale & Stock Monitor watches public Shopify storefronts for the product variants worth acting on: in-stock items, price reductions, and catalog changes. It is built for ecommerce teams, pricing analysts, and agencies that need a recurring competitor-price or restock feed rather than a large unfiltered product export.

### What data can you extract from Shopify?

- Product identity — product title, product ID, handle, canonical product URL, vendor, product type, and tags
- Variant pricing — current price, compare-at price, computed discount percentage, variant title, and SKU
- Stock signals — public in-stock flag, product publication time, update time, and the feed page that supplied the record
- Merchandising assets — primary product image URL for dashboards, spreadsheets, and alert messages

### How to use Shopify Sale & Stock Monitor

1. Open Shopify Sale & Stock Monitor and add one or more Shopify storefront URLs.
2. Set a small `maxItems` value for your first run.
3. Choose whether to keep only in-stock variants, only discounted variants, or a minimum discount percentage.
4. Click Run. The actor reads the public feed and applies filters before it writes records.
5. Download the dataset as JSON, CSV, or Excel, or use it through the Apify dataset API and a scheduled run.

### How much does it cost?

Shopify Sale & Stock Monitor uses pay-per-event pricing: one emitted product variant is one billable result. The public feed returns up to 250 products per HTTP page, so `maxItems`, `maxPagesPerStore`, and the sale/stock filters keep recurring monitoring runs small. Use `dryRun` to check a store and filter combination without dataset writes.

### Input

`storeUrls` is required and accepts public Shopify storefront roots such as `https://gymshark.com`. `onlyAvailable`, `onlyOnSale`, and `minimumDiscountPercent` are evaluated before billing. A store that does not expose a public product feed is skipped with a log warning, without failing the remaining stores.

```json
{
  "storeUrls": ["https://gymshark.com", "https://kith.com"],
  "maxItems": 20,
  "maxPagesPerStore": 1,
  "onlyAvailable": true,
  "onlyOnSale": false,
  "minimumDiscountPercent": 0
}
```

### Output

Each output row is one product variant, which makes it easy to watch specific sizes, colors, or SKUs. The main fields are `productTitle`, `productUrl`, `available`, `price`, `compareAtPrice`, `discountPercent`, `vendor`, `tags`, and `updatedAt`.

```json
{
  "storeUrl": "https://example-shop.com",
  "productId": "8286683070592",
  "variantId": "45143596335232",
  "productTitle": "Example performance tank",
  "productUrl": "https://example-shop.com/products/example-performance-tank",
  "available": true,
  "price": 30,
  "compareAtPrice": 40,
  "discountPercent": 25,
  "sku": "TANK-HEAVY-BLUE-S",
  "updatedAt": "2026-08-23T21:06:18.000Z"
}
```

### Integrations

Schedule Shopify Sale & Stock Monitor for daily or hourly checks, then send the dataset to Make, n8n, Zapier, a webhook, or the Apify API. The variant-level output works well as an input to a pricing dashboard or a restock alert.

### Related actors

- [Amazon Best Sellers Scraper](https://apify.com/schnellscrapers/amazon-best-sellers-scraper) — monitor ranked marketplace products alongside Shopify storefront catalogs.
- [YouTube Video Scraper](https://apify.com/schnellscrapers/youtube-video-monitor) — track creator product mentions and new videos alongside product availability.

### FAQ

#### How does Shopify Sale & Stock Monitor work?

It requests each supplied store's public `/products.json` feed and flattens its product variants. It does not render a browser page, and it does not request product-detail pages by default.

#### Can I use Shopify Sale & Stock Monitor as an API?

Yes. Run it from the Apify API and read the default dataset using the API URL returned for the run. The same results can be downloaded as JSON, CSV, or Excel.

#### Can I use Shopify Sale & Stock Monitor in Python or Node.js?

Yes. Trigger the actor using `apify-client`, wait for the run to finish, then iterate over its default dataset items in either language.

#### What does this actor access?

It accesses only the public product feed exposed by the Shopify storefront URLs you provide. No Shopify admin credentials, customer data, or API key is needed.

#### Is it legal to scrape Shopify product feeds?

Use the actor only for data you are authorized to collect and in line with the applicable website rules and laws. This actor is designed for publicly exposed product catalog data and does not access private storefront or customer information.

#### Why did a store return no records?

Some stores disable, protect, or customize their public product feed. The actor logs and skips that store so other supplied storefronts can continue.

### Your feedback

If a public Shopify store exposes a feed shape this actor does not handle, report it through the actor's Issues tab with the input URL and a redacted run ID. Feature requests for collection-specific monitoring, catalog diffs, and alert payloads are welcome too.

# Actor input Schema

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

One or more public Shopify storefront URLs, such as https://gymshark.com. The actor reads each store's public /products.json feed.

## `maxItems` (type: `integer`):

Hard cap on emitted product variants across all stores after filters. Use 20 for a bounded smoke run.

## `maxPagesPerStore` (type: `integer`):

Maximum public product-feed pages fetched per store. Each page requests up to 250 products.

## `onlyAvailable` (type: `boolean`):

Exclude sold-out variants before dataset writes and result billing.

## `onlyOnSale` (type: `boolean`):

Keep only variants whose compare-at price is higher than the current price. Filtering happens before dataset writes.

## `minimumDiscountPercent` (type: `number`):

Keep only variants with at least this computed price reduction. Set 0 to disable this filter.

## `dryRun` (type: `boolean`):

Fetch, parse, filter, and validate records without writing the dataset. Logs selected and written counts separately.

## Actor input object example

```json
{
  "storeUrls": [
    "https://gymshark.com"
  ],
  "maxItems": 100,
  "maxPagesPerStore": 1,
  "onlyAvailable": true,
  "onlyOnSale": false,
  "minimumDiscountPercent": 0,
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Filtered product-variant records with title, price, stock flag, discount, vendor, and product URL.

# 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": [
        "https://gymshark.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/shopify-sale-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": ["https://gymshark.com"] }

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/shopify-sale-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": [
    "https://gymshark.com"
  ]
}' |
apify call schnellscrapers/shopify-sale-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,schnellscrapers/shopify-sale-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/1sDQInf15kc3OznBN/builds/HcBVHPQTbkh4WQ4g5/openapi.json
