Shopify Product & Price Monitor: Catalog + Stock Alerts
Pricing
from $0.50 / 1,000 products
Shopify Product & Price Monitor: Catalog + Stock Alerts
Scrape any Shopify store's catalog (every variant's price, sale price, stock, SKU, images) or monitor it: get only price drops, increases, restocks, sell-outs, new and removed products since the last run. Multi-store, no browser.
Pricing
from $0.50 / 1,000 products
Rating
0.0
(0)
Developer
Hydro Core
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Scrape any Shopify store's full catalog, then keep watching it. Add one or many Shopify stores and get every product and variant with price, compare-at (sale) price, discount, stock status, SKU, options, images, vendor, type and tags. Turn on monitoring and each run outputs only what changed since the last run: price drops, price increases, back in stock, out of stock, new products, new variants and removed products.
One actor covers both the one-off catalog export and the ongoing price/stock watch. Change rows cost the same as product rows, and a run where nothing changed charges only a tiny per-store check fee.
What can you do with it?
- Competitor price monitoring: schedule it every few hours and get a feed of price drops and price increases across competitor stores.
- Restock & sell-out alerts: keep only
back_in_stock/out_of_stockchanges and connect a webhook, Slack, email or Zapier/Make integration. - New product launch tracking: see each competitor's new products and new variants (sizes, colors, flavors) the run after they appear.
- Catalog export: download a store's full catalog to CSV, Excel or JSON for analysis, product research or feeding an AI pipeline.
- Deal finding: filter for on-sale, in-stock items under a price, across many stores at once.
- Assortment & pricing research: compare vendors, product types, price ranges and discount depth between brands.
How it works
- Give it stores. Use a domain (
allbirds.com), a homepage URL or a collection URL (https://colourpop.com/collections/lips) to fetch only that collection. - It reads the store's public catalog feed. Shopify stores publish their catalog as JSON at
/products.json. The actor pages through it (250 products per request), reads/meta.jsonfor the store name and currency, and normalizes every product and variant. No browser, no login, no proxy needed for normal stores. - Catalog mode (default) saves one row per product (variants nested) or one row per variant (flat, spreadsheet-friendly), after your filters.
- Monitoring mode saves a compact snapshot of each store (variant prices, compare-at prices, availability) in a named key-value store. The next run compares against that snapshot and outputs only change rows. The first run of each store only saves the baseline, so there's no output and no row charges.
- It's polite and resilient. Stores are fetched in parallel, but pages of one store are fetched one at a time with a configurable delay (default 500 ms). It honors robots.txt (including Crawl-delay) and backs off on HTTP 429/5xx. Stores that aren't Shopify, are password-protected or keep rate-limiting are listed in
RUN_SUMMARYwith a clear status and aren't charged.
Why this actor
- Change detection built in. Most Shopify scrapers give you the whole catalog every run, and you have to diff it yourself. Here, monitoring mode returns only the changes, already classified (
price_drop,price_increase,back_in_stock,out_of_stock,new_product,new_variant,removed_product), with old price, new price and change %. - Variant-level accuracy. Changes are tracked per variant (size, color, pack), so "size 9 is back" or "the 10-count dropped 25%" is one row, not a vague product-level flag.
- Safe, honest monitoring logic. Removed-product detection only runs when the full catalog was fetched, so a capped or interrupted run never reports false removals. Changes that couldn't be delivered (result limit or max cost reached) stay pending and are reported next run instead of being lost.
- Many stores per run, each with its own snapshot. Collection URLs let you watch just one category.
- Filters that apply before you pay: keywords, excluded words, vendors, product types, tags, price range, in-stock only, on-sale only, minimum price-change %, and which change types to report.
- Catalog-scraper pricing for monitoring: $0.90 per 1,000 rows on the Free plan (down to $0.50 on Gold+), with change rows priced the same as product rows.
- Fast and lightweight: plain HTTPS + JSON at 256 MB memory. In our tests, 936 products from 3 stores took about 4 seconds of run time.
What it doesn't do: it doesn't log in or read private or admin data, and it doesn't return exact inventory quantities, barcodes/GTINs or reviews. It uses only what the store publishes in its public catalog feed. Headless storefronts that disable /products.json aren't supported and are reported as not_shopify.
Input
| Field | What it does |
|---|---|
stores | Domains, homepage URLs or collection URLs, one per line (required). |
monitorChanges | false = catalog mode. true = output only changes since the previous run. |
changeTypes | Which change types to report (default: all 7). |
minPriceChangePercent | Ignore price changes smaller than this %. |
outputCatalogOnFirstRun | Also output the catalog on a store's first monitoring run. |
monitoringStoreName | Name of the key-value store holding snapshots. Use one per watchlist/task. |
outputLevel | product (variants nested) or variant (one flat row per variant). |
descriptionFormat | text, html, both or none. |
keywords, excludeKeywords, vendors, productTypes, tags | Filters (case-insensitive). |
minPrice, maxPrice, onlyAvailable, onlyOnSale | Price/stock/sale filters (applied per variant in variant mode). |
maxProductsPerStore, maxResults | Limits (0 = no limit). |
requestDelayMs | Delay between requests to the same store (default 500 ms). |
Example: export catalogs
{"stores": ["allbirds.com", "deathwishcoffee.com", "https://colourpop.com/collections/lips"]}
Example: price & stock watch (schedule it every 6 hours)
{"stores": ["allbirds.com", "deathwishcoffee.com", "brooklinen.com"],"monitorChanges": true,"changeTypes": ["price_drop", "back_in_stock", "new_product"],"minPriceChangePercent": 5,"monitoringStoreName": "competitor-watch"}
Example: on-sale, in-stock variants under $60
{"stores": ["kyliecosmetics.com"],"outputLevel": "variant","onlyOnSale": true,"onlyAvailable": true,"maxPrice": 60,"descriptionFormat": "none"}
Output
Product row (catalog mode, real data from allbirds.com, shortened):
{"store": "allbirds.com","storeName": "Allbirds","currency": "USD","productId": "6858599596112","handle": "womens-tree-dasher-relay-blizzard-hazy-cobalt","title": "Women's Tree Dasher Relay - Blizzard/Hazy Cobalt (Clarity Blue Sole)","vendor": "Allbirds","productType": "Shoes","tags": ["allbirds::edition => limited", "allbirds::gender => womens", "..."],"url": "https://www.allbirds.com/products/womens-tree-dasher-relay-blizzard-hazy-cobalt","priceMin": 67,"priceMax": 67,"compareAtPriceMax": 135,"onSale": true,"maxDiscountPercent": 50.4,"available": false,"variantCount": 13,"availableVariantCount": 0,"options": [{ "name": "Size", "values": ["5", "5.5", "6", "...", "11"] }],"variants": [{ "variantId": "40234510123088", "variantTitle": "5", "sku": "A10692W050", "price": 67, "compareAtPrice": 135,"onSale": true, "discountPercent": 50.4, "available": false, "option1": "5", "option2": null, "option3": null, "grams": 638, "image": null }],"featuredImage": "https://cdn.shopify.com/s/files/1/1104/4168/files/A10691_24Q1_Tree-Dasher-Relay-Blizzard-Hazy-Cobalt-Clarity-Blue_PDP_LEFT.png?v=1776183508","imageCount": 5,"descriptionText": "Meet The Tree Dasher Relay — our laceless running shoe made from earth-friendly materials. ...","createdAt": "2023-07-15T21:42:13-07:00","publishedAt": "2026-09-25T16:49:33-07:00","updatedAt": "2026-11-02T16:01:58-08:00","sourceInput": "allbirds.com","scrapedAt": "2026-11-03T00:01:58.910Z"}
Variant row (outputLevel: "variant"): all product fields plus variantId, variantTitle, sku, price, compareAtPrice, discountPercent, available, options (e.g. {"Size": "9"}), variantUrl (.../products/handle?variant=ID) and image.
Change row (monitoring mode). This is the row format; the product is real, and the price change was triggered in our test by editing the stored snapshot:
{"changeType": "price_drop","store": "deathwishcoffee.com","storeName": "Death Wish Coffee","currency": "USD","productId": "171104582","productTitle": "Valhalla Java Single-Serve Pods","variantId": "392715452","variantTitle": "10 count","sku": "5094SSC","vendor": "Death Wish Coffee Company","productType": "Coffee","oldPrice": 19.99,"newPrice": 14.99,"priceChange": -5,"priceChangePercent": -25,"compareAtPrice": null,"wasAvailable": true,"available": true,"url": "https://www.deathwishcoffee.com/products/valhalla-java-single-serve-pods?variant=392715452","image": "https://cdn.shopify.com/s/files/1/0271/7209/files/Valhalla_Java_10ct_Angle_Vertical_Pods_A1_2.jpg?v=1733925456","previousCheckAt": "2026-11-03T00:09:32.436Z","detectedAt": "2026-11-03T00:11:18.124Z","sourceInput": "deathwishcoffee.com"}
Change types: price_drop, price_increase, back_in_stock, out_of_stock, new_product, new_variant, removed_product.
The dataset has three ready-made table views: Products, Variants and Changes. Each run also writes a RUN_SUMMARY record to the default key-value store, with per-store status (ok, baseline_saved, not_shopify, blocked, rate_limited, error), products fetched, matches, rows saved and change counts.
Pricing
Pay per event. You pay only for results:
| Event | Free | Bronze | Silver | Gold / Platinum / Diamond |
|---|---|---|---|---|
| Product (each saved product, variant or change row) | $0.0009 | $0.0008 | $0.0007 | $0.0005 |
| Store check (monitoring mode only, per store successfully checked) | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| Actor start | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
Examples on the Free plan:
- Export 936 products from 3 stores ≈ 936 × $0.0009 = $0.84.
- Monitor 3 stores every 6 hours (120 runs/month) with no changes = 120 × (3 × $0.0005 + $0.00005) ≈ $0.19/month, plus $0.0009 per change found.
Stores that fail (not Shopify, blocked, rate-limited) are never charged. Your Max cost per run setting is respected: the actor stops saving rows when it's reached.
Tips
- Scheduling: create a Task with
monitorChanges: true, then add an Apify Schedule (hourly, every 6 hours, daily). Add a webhook or integration to get changes in Slack, email, Google Sheets, Zapier or Make. - One snapshot per watchlist: use a different
monitoringStoreNamefor each task so watchlists don't overwrite each other's snapshots. - Watch a category: put a collection URL in
storesinstead of the whole store. - Noise control: set
minPriceChangePercent(e.g. 5) and keep only the change types you care about.
FAQ
Does it work with every Shopify store?
It works with stores that publish the standard public /products.json catalog, which is most Shopify storefronts. Headless storefronts or stores that disable the endpoint return not_shopify in RUN_SUMMARY and aren't charged. In our tests, Allbirds, Death Wish Coffee, ColourPop, Brooklinen, Tentree and Kylie Cosmetics worked.
How does monitoring know what changed?
After each run it saves a compact snapshot per store (each variant's price, compare-at price and availability) in the key-value store named in monitoringStoreName. The next run compares the live catalog with that snapshot.
Why did my first monitoring run return nothing?
The first check of a store only saves the baseline. Changes appear from the second run. Set outputCatalogOnFirstRun: true if you also want the full catalog on that first run.
Will I get false "removed product" alerts?
Removal detection only runs when the store's whole catalog (or whole collection) was fetched. If you cap maxProductsPerStore or a run is interrupted, removals aren't reported for that run.
What happens if I hit my result limit or max cost mid-run? Changes that couldn't be saved stay pending in the snapshot and are reported on the next run, so they aren't lost.
Do I need proxies or a login? No. It reads public JSON over HTTPS. It doesn't log in and doesn't read anything that isn't publicly published by the store.
Does it return inventory quantities, barcodes or reviews? No. It returns availability (in stock / out of stock) per variant, plus prices, SKUs, options and images. Exact quantities, barcodes and reviews aren't in the public catalog feed this actor uses.
Which currency are prices in?
The store's default currency, taken from the store's /meta.json and shown in the currency field. Prices are numbers, not strings.
How fast is it, and how much memory does it need? 256 MB is enough. In our Apify tests, 3 stores and 936 products finished in about 4 seconds of run time. Large catalogs take one request per 250 products, plus the politeness delay.
Is scraping public Shopify catalogs allowed? The actor only reads publicly available catalog data, honors robots.txt and rate limits itself. You're responsible for how you use the data and for following each website's terms and applicable law.