Shopify Price Drop & Restock Monitor — Competitor Watch avatar

Shopify Price Drop & Restock Monitor — Competitor Watch

Pricing

from $5.00 / 1,000 store checkeds

Go to Apify Store
Shopify Price Drop & Restock Monitor — Competitor Watch

Shopify Price Drop & Restock Monitor — Competitor Watch

Shopify competitor monitor: an alert row for every price drop, price rise, new product or restock. Schedule it, no login.

Pricing

from $5.00 / 1,000 store checkeds

Rating

0.0

(0)

Developer

Mohammed Samaan

Mohammed Samaan

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

12 days ago

Last modified

Categories

Share

Shopify Products Scraper + Price Drop & Restock Monitor

Pull the full product catalog of any Shopify store — title, price, compare-at price, discount, availability, SKU, vendor, tags, images and product URL — as one clean row per variant. Or switch on monitor mode and get only what changed since the last run: price drops, restocks, new products, price rises.

No login, no cookies, no API key and no browser: every Shopify store publishes its catalog at /products.json, and this actor reads that directly.

Who it's for

  • Ecommerce sellers and dropshippers watching competitor pricing and stock
  • Agencies building product feeds, price-comparison sheets or catalog audits
  • Market researchers sizing a niche by scanning many stores at once
  • Automation builders (n8n / Make / Zapier / MCP agents) that need Shopify products as JSON

What you get

Scraper mode (default) — one row per product variant:

FieldWhat it is
storeStore origin, e.g. https://www.allbirds.com
title / variantProduct title and variant name (size, colour…)
price / compareAtPrice / discountPctCurrent price, strike-through price, discount %
availableIn stock (true/false)
sku / productId / variantIdIdentifiers
vendor / productType / tagsCatalog metadata
url / handleProduct page URL
image / imageCountFirst image URL and image count
createdAt / updatedAt / publishedAtShopify timestamps

Monitor mode (onlyChanges: true) — one row per change, with changeType = PRICE DROP / RESTOCK / NEW PRODUCT / PRICE RISE, plus was / now / drop / dropPct. The first run for a store returns the full catalog tagged INITIAL and saves the baseline, so it is never empty.

Sample scraper row:

{
"store": "https://www.allbirds.com",
"title": "Men's Tree Runners",
"variant": "Blizzard / 10",
"price": 98,
"compareAtPrice": 120,
"discountPct": 18.3,
"available": true,
"sku": "TR-M-BLZ-10",
"vendor": "Allbirds",
"url": "https://www.allbirds.com/products/mens-tree-runners"
}

Example output

One real row (scraper mode, allbirds.com). The tags field is shortened here; the actor returns it in full.

{
"store": "https://www.allbirds.com",
"productId": 7340901859408,
"variantId": 42146889039952,
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"variant": "5",
"price": 25,
"compareAtPrice": 50,
"discountPct": 50,
"available": false,
"sku": "A12513W050",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": "allbirds::edition => limited, allbirds::gender => womens, allbirds::hue => pink, … (shortened)",
"handle": "womens-allbirds-flip-flop-dusty-pink",
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
"imageCount": 5,
"createdAt": "2026-03-27T14:03:50-07:00",
"updatedAt": "2026-09-28T09:00:35-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"checkedAt": "2026-09-28T16:04:19.893Z"
}

In monitor mode (onlyChanges: true) the first run returns the whole catalog with changeType: "INITIAL"; later runs return only rows with changeType set to PRICE DROP, RESTOCK, NEW PRODUCT or PRICE RISE.

Input

{
"stores": ["https://www.allbirds.com", "gymshark.com"],
"maxProducts": 2000,
"onlyChanges": false
}
  • stores — one Shopify store URL per line (any URL on the store works).
  • maxProducts — cap per store.
  • onlyAvailable — scraper mode: drop sold-out variants.
  • onlyChanges — off by default. On = monitor mode; pair with an Apify schedule. Choose which changes to report with alertOnPriceDrop, alertOnRestock, alertOnNewProduct, alertOnPriceRise.
  • webhookUrl — monitor mode: changes are POSTed as JSON.

Pricing

Pay per event: a small charge per store checked and a charge per change detected in monitor mode. Catalog product rows are currently not charged separately. Exact prices are on the Pricing tab. ERROR rows are not billed; a store that returns NO CHANGES or NO PRODUCTS is still charged the per-store fee.

Monitor mode on a schedule

  1. Set onlyChanges: true and your competitor stores.
  2. Save as a Task and add an Apify Schedule (hourly or daily).
  3. Read the dataset, or set webhookUrl to push changes to Slack / Zapier.

Errors and limits

How the actor behaves when things go wrong (read from its code):

  • No input. An empty stores list makes the run fail immediately with "Provide at least one Shopify store URL". An entry that cannot be parsed as a URL is skipped with a warning.
  • Not a Shopify store, password-protected, blocked or down. The actor reads <store>/products.json. An HTTP error (403, 404, 429, 5xx), a non-JSON response or a 20-second timeout produces one row {"store": ..., "status": "ERROR: <reason>"} for that store, and the run moves on to the next store. Error rows are not charged.
  • Partial catalogs. The catalog is fetched 250 products per page, up to 80 pages. If a later page fails after earlier pages succeeded, the actor keeps what it already has and continues without reporting an error, so a catalog can be incomplete. maxProducts (default 2,000 per store) cuts the catalog off silently at that number. There is no proxy and no retry.
  • Empty results. A store that answers but has no products (or none left after onlyAvailable) returns one row with status: "NO PRODUCTS".
  • Monitor mode. The first run for a store saves a baseline and returns the full catalog tagged INITIAL. After that, a run with no differences returns one status: "NO CHANGES" row for that store. Baselines are kept in a named key-value store (ecom-monitor-state) in your account, so a store is only compared against runs from the same account. Changes are detected per variant: price drops, price rises (if enabled), restocks and new variants.
  • Webhook. If webhookUrl is set and changes were found, the actor POSTs them once. A failed POST logs a warning and does not fail the run, and it is not retried.
  • Charging. One store-checked event for each store whose catalog was fetched (including a store that then returns NO CHANGES or NO PRODUCTS), and one change-detected event per change in monitor mode. Stores that return an ERROR row are not charged. If your max-charge limit is reached, the run stops with what it has.

FAQ

A store returned ERROR: http 401/403 or "not a JSON response". The store has password protection or has disabled the public products feed. Nothing to fix on your side — that store is not publicly readable.

Does it show exact inventory counts? No — Shopify's public feed exposes available (in stock / sold out), not quantities.

Is it only for Shopify? It works on any storefront that serves the Shopify-style /products.json format.

Send results to Notion (new, Sep 2026)

Authorize Notion once in Apify Console → Settings → API & Integrations → MCP connectors (choose Notion, sign in). Then pick that connector in Notion connector and paste the link of any Notion page in Notion page to create the table in. The first run creates a table inside that page and fills it with the price and stock changes (up to 500 rows per run; the full set is always in the dataset). To keep adding to the same table on later runs, paste the table ID from the log into Existing Notion table ID. This Actor never sees your Notion login: Apify's connector proxy holds it. If the Notion step fails, your dataset results are still delivered and the reason is logged.

Use it from an AI agent (MCP)

Add this Actor to any MCP client (Claude, Cursor, VS Code) with one URL:

https://mcp.apify.com?tools=leadharbor/ecommerce-price-restock-monitor

Or call it through the Apify API with an input like this:

{
"stores": [
"https://www.allbirds.com"
],
"alertOnPriceDrop": true,
"alertOnNewProduct": true,
"alertOnRestock": true,
"maxProducts": 100
}

Returns one alert per change on a Shopify store: price drop, price rise, new product, restock. Results land in the run's default dataset (JSON, CSV or Excel). No login or API key is needed for the sites it reads, and pay-per-event pricing works with Apify's x402 agent payments.

API usage

Run it from your own code with an Apify API token. The input below is this actor's prefilled example.

curl (runs the actor and returns the dataset items):

curl -X POST "https://api.apify.com/v2/acts/leadharbor~ecommerce-price-restock-monitor/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"stores": [
"https://www.allbirds.com"
],
"onlyChanges": false,
"maxProducts": 100
}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("leadharbor/ecommerce-price-restock-monitor").call(run_input={
"stores": [
"https://www.allbirds.com"
],
"onlyChanges": False,
"maxProducts": 100
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Changelog

28 Sep 2026 — Buyer max-charge cap now stops the run; optional Notion output for price drops, new products and restocks; MCP agent section. Plus 5 public example tasks with their own pages.

More from leadharbor


Using this actor? A quick review helps other buyers find it: ecommerce-price-restock-monitor

  • Disposable Email & Domain Checker — Flags throwaway and free-provider email domains using 5 merged public lists. $0.30 per 1,000 checks.
  • Domain Trust Check — 0-100 trust score for a domain from domain age, SSL, SPF/DKIM/DMARC and disposable-domain lists. $2.50 per 1,000 domains.
  • Website Contact Extractor — Pulls emails, phone numbers and social links from website URLs.
  • Website Technology Detector — Detects the CMS, frameworks, analytics and 100+ other technologies a website uses from its homepage. $9 per 1,000 sites.