# Shopify Product Scraper: Prices, Stock & SKUs Tracker (`laborious_rumor/universal-ecommerce-product-price-tracker`) Actor

Extract complete Shopify product catalogs, variants, SKUs, inventory status, prices, and discount percentages with automatic pagination.

- **URL**: https://apify.com/laborious_rumor/universal-ecommerce-product-price-tracker.md
- **Developed by:** [Lakshay Papneja](https://apify.com/laborious_rumor) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 e-commerce product records

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

## Universal E-Commerce & Shopify Price & Inventory Tracker (v2.0)

Extract complete product catalogs, multi-page collections, variant-level pricing, SKUs, discount percentages, and real-time stock availability from **any Shopify store (`products.json`)** or **Schema.org/JSON-LD e-commerce website** without expensive headless browsers.

***

### 🚀 Key Capabilities

1. **Multi-Page Shopify Catalog & Collection Pagination**: Automatically paginates `?limit=250&page=1..N` across the entire store or a specific `collectionHandle` (`best-sellers`, `mens-shoes`, `sale`) up to `5,000` products per store.
2. **Automatic Discount & Price Spread Calculation**: Computes `discountPercent` from `price` vs. `compareAtPrice`, plus `minVariantPrice` and `maxVariantPrice` across all sizes/colors.
3. **Variant-Level Inventory Tracking**: Returns both `inStock` (boolean) and `availableVariantsCount` / `variantsCount` alongside full SKU and weight (`grams`) arrays.
4. **Built-In Price & Sale Filters**: Filter directly for `onlyInStock`, `onlyDiscounted` (on-sale items only), `minPrice`, and `maxPrice`.

***

### ⚙️ Input Parameters

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `storeOrProductUrls` | `array` | `["https://www.allbirds.com"]` | Shopify store domains or product URLs. |
| `collectionHandle` | `string` | `""` | Optional Shopify collection handle (e.g. `mens`, `sale`). |
| `maxProductsPerStore` | `integer` | `50` | Max products to extract per store (1–5,000). |
| `onlyInStock` | `boolean` | `false` | Only return in-stock products. |
| `onlyDiscounted` | `boolean` | `false` | Only return discounted/on-sale products. |
| `minPrice` | `integer` | `0` | Minimum price filter. |
| `maxPrice` | `integer` | `0` | Maximum price filter. |

***

### 📦 Sample Output (JSON)

```json
{
  "storeDomain": "allbirds.com",
  "platform": "Shopify",
  "productId": "7829104820432",
  "handle": "mens-tree-runners",
  "title": "Men's Tree Runners - Jet Black (Black Sole)",
  "brand": "Allbirds",
  "productType": "Shoes",
  "price": 98,
  "minVariantPrice": 98,
  "maxVariantPrice": 98,
  "compareAtPrice": 110,
  "discountPercent": 11,
  "currency": "USD",
  "inStock": true,
  "variantsCount": 8,
  "availableVariantsCount": 7,
  "tags": ["mens", "running", "breathable"],
  "images": ["https://cdn.shopify.com/s/files/..."],
  "productUrl": "https://www.allbirds.com/products/mens-tree-runners",
  "publishedAt": "2026-01-15T09:00:00-08:00",
  "scrapedAt": "2026-10-28T10:25:00.000Z"
}
```

***

### 📖 How to Use (Step-by-Step)

1. **Enter Store URL**: Provide any Shopify or e-commerce store URL (e.g. `https://www.allbirds.com` or `gymshark.com`).
2. **Select Collection (Optional)**: Provide a specific collection handle (e.g. `mens-shoes`) or leave blank to scrape all products.
3. **Set Max Products**: Set `maxProductsPerStore` (supports up to 5,000 products with automated pagination).
4. **Filter Options**: Optionally filter by stock availability (`onlyInStock`) or discount percentage (`onlyDiscounted`).
5. **Run & Export**: Download the structured catalog with variant SKUs, prices, discount %, and inventory status as CSV or JSON.

***

### 💰 Transparent Pay-Per-Event Pricing

This actor is monetized using Apify Pay-Per-Event (PPE):

- **Actor Start Fee**: **$0.00005**
- **Per Extracted Product**: **$0.0025** ($2.50 per 1,000 products)
- **Free Monthly Tier**: Any Apify user with the free $5/month credit can extract **up to 2,000 products every month for $0 out-of-pocket**.

***

### 🏆 Why Use This Actor vs Other Scrapers?

| Feature | Universal E-Commerce Tracker | Legacy Puppeteer Scrapers |
| :--- | :--- | :--- |
| **Compute Cost** | ⚡ **Low** (No headless browser needed) | 💸 **High** (Burns 4GB+ RAM) |
| **Speed** | 🚀 **250 products/sec** | 🐢 1–2 pages/sec |
| **Variant & SKU Extraction** | ✅ Full variant hierarchy | ⚠️ Homepage summary only |
| **Discount Calculation** | ✅ Automatic % off calculation | ❌ Not available |
| **Automated Rate-Limit Backoff** | ✅ Built-in 429 retry pacing | ❌ Crashes on rate limits |

***

### ❓ Frequently Asked Questions (FAQ)

#### Does this work on all Shopify stores?

Yes, it automatically detects Shopify endpoints and extracts full catalog data with variant IDs, prices, compare-at prices, discount percentages, and inventory availability. For non-Shopify stores, it falls back to Schema.org/JSON-LD microdata parsing.

#### How does pagination handle 1,000+ products?

The actor requests 250 items per batch using official catalog endpoints, with built-in polite pacing and automated 429 rate-limit backoff, ensuring complete catalogs up to 5,000 items are scraped reliably.

#### Can I monitor inventory stock daily?

Yes! Set up a recurring Apify Schedule to run this actor daily or weekly and receive email or webhook alerts whenever prices drop or items go out of stock.

# Actor input Schema

## `storeOrProductUrls` (type: `array`):

List of Shopify store URLs (e.g. https://www.allbirds.com) or direct e-commerce product/collection URLs.

## `collectionHandle` (type: `string`):

Optional specific Shopify collection handle to scrape (e.g. mens-shoes, best-sellers, sale). Leave empty to scrape the entire store catalog.

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

Maximum number of products to extract per store (automatically paginates across 250-product pages).

## `onlyInStock` (type: `boolean`):

Filter out out-of-stock products.

## `onlyDiscounted` (type: `boolean`):

Only return products where compareAtPrice is higher than the current price.

## `minPrice` (type: `integer`):

Minimum product price filter (0 for no minimum).

## `maxPrice` (type: `integer`):

Maximum product price filter (0 for no limit).

## Actor input object example

```json
{
  "storeOrProductUrls": [
    "https://www.allbirds.com"
  ],
  "collectionHandle": "",
  "maxProductsPerStore": 50,
  "onlyInStock": false,
  "onlyDiscounted": false,
  "minPrice": 0,
  "maxPrice": 0
}
```

# Actor output Schema

## `results` (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 = {
    "storeOrProductUrls": [
        "https://www.allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("laborious_rumor/universal-ecommerce-product-price-tracker").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 = { "storeOrProductUrls": ["https://www.allbirds.com"] }

# Run the Actor and wait for it to finish
run = client.actor("laborious_rumor/universal-ecommerce-product-price-tracker").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 '{
  "storeOrProductUrls": [
    "https://www.allbirds.com"
  ]
}' |
apify call laborious_rumor/universal-ecommerce-product-price-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,laborious_rumor/universal-ecommerce-product-price-tracker"
        }
    }
}
```

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/d8tFyLGu1yKhQhIaN/builds/Oc2nBZ2bTuPFWNBM4/openapi.json
