Shopify Product & Price Monitor
Pricing
from $3.00 / 1,000 product-results
Shopify Product & Price Monitor
Track prices, sales and stock across any Shopify store. Detects price changes, new and removed products between runs. Variant-level data with SKU, sale detection and discount %.
Pricing
from $3.00 / 1,000 product-results
Rating
0.0
(0)
Developer
Dennis
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Shopify Product & Price Monitor ๐๏ธ
Track prices, sales and stock across any Shopify store โ and get notified of exactly what changed. This is not just another product scraper: it remembers the previous run and tells you which prices changed, which products are new, and which disappeared.
Works on any of the millions of Shopify-powered stores worldwide. No API keys, no login โ it uses Shopify's public product endpoints.
Why this monitor?
Most Shopify scrapers dump the full catalog every run and leave the diffing to you. This actor does the heavy lifting:
- ๐ Price change detection โ every record is annotated as
new,price_change,removedorunchanged, including the previous price and change percentage - ๐ฆ๐ค Back-in-stock / out-of-stock alerts โ an availability flip is its own
back_in_stock/out_of_stockchangeType, detected independently of any price move - ๐ท๏ธ Sale detection โ automatically flags discounted items via compare-at price, with discount %
- ๐ฆ Variant-level data โ individual SKUs, sizes and colors, not just parent products
- ๐ช Multiple stores per run โ monitor your whole competitive set at once; one blocked store never fails the run
- โก Reliable by design โ official JSON endpoints (no fragile HTML parsing), automatic retry with backoff on rate limits
When should an AI agent use this?
- "Did any of my competitor's Shopify stores change prices since yesterday?"
- "Is [product] currently on sale on [shop.example.com], and how much off?"
- "Which products has [store] added or delisted from their catalog this week?"
- "Is [SKU] back in stock on the supplier's Shopify store?"
- "Are any resellers selling below the minimum advertised price on [store]?"
- "Give me all sale items under โฌ50 in the sneakers collection on [store]."
What data do you get?
One record per product variant:
{"store": "shop.example.com","productId": 111,"variantId": 1002,"title": "Men's Cruiser Terralux","variantTitle": "Size 43","sku": "CRZ-43","vendor": "Allbirds","productType": "Shoes","tags": ["mens", "sale"],"price": 71.97,"compareAtPrice": 79.96,"onSale": true,"discountPercent": 10,"available": false,"imageUrl": "https://cdn.shopify.com/...","productUrl": "https://shop.example.com/products/mens-cruiser-terralux","changeType": "price_change","previousPrice": 81.97,"priceChangePercent": -12.2}
Use cases
- Competitive price intelligence โ know within hours when a competitor drops prices or starts a sale
- MAP / brand compliance โ verify that resellers respect your minimum advertised price
- Deal hunting & arbitrage โ schedule daily runs with
onlyOnSaleandonlyChangesfor a clean deal feed - Assortment tracking โ see which products competitors add or delist
- Dropshipping stock sync โ track availability of supplier products
- AI agents & dashboards โ clean structured JSON, ideal for LLM tools (MCP), Google Sheets or BI pipelines
Quick start
Full catalog snapshot of one store:
{ "stores": ["https://www.allbirds.com"] }
Daily price alerts on your three biggest competitors:
{"stores": ["https://storeA.com", "https://storeB.com", "https://storeC.com"],"monitorMode": true,"onlyChanges": true}
Schedule this daily: the first run builds a baseline, every next run outputs only new products, price changes and removed items. Wire it to Slack, e-mail or Google Sheets via Apify integrations.
Sale items under โฌ50 in a specific collection:
{"stores": ["https://shop.example.com"],"collections": ["sneakers"],"onlyOnSale": true,"maxPrice": 50,"onlyAvailable": true}
Input reference
| Field | Description |
|---|---|
stores | Shopify store URLs (required) |
collections | Collection handles to limit scope |
vendor / productType / tags | Product filters |
onlyOnSale / onlyAvailable | Sale and stock filters |
minPrice / maxPrice | Price range filter |
maxProductsPerStore | Cap per store (default 1000) |
monitorMode | Enable change detection between runs |
onlyChanges | Output only new/changed/removed items |
minPriceChangePercent | In monitor mode: only count a move as price_change (and charge the higher price-alert rate) if the absolute % change is at least this. Smaller moves report as unchanged. Default 0 = every difference counts |
notificationWebhookUrl | Optional: POST a compact run summary (counts + biggest price drop) to this URL at the end of the run โ a convenience for users without their own Apify integration. Same data already in RUN_SUMMARY/the dataset, no extra charge |
trackPriceHistory | Keep a short price time series per variant across scheduled runs, exposed as trend. Default false |
maxHistoryPoints | How many past price points to keep per variant when trackPriceHistory is on (default 30) |
crossStoreComparison | When monitoring 2+ stores, emit an extra record per SKU seen in more than one store, with the lowest price and which store offers it. Default false |
Pricing
Pay per event: regular product records are billed at the base rate; detected price alerts (changes and removals), stock alerts (back-in-stock/out-of-stock), and sale alerts (sale started/ended) at a slightly higher rate โ you pay for insight, not bulk. With onlyChanges enabled a typical daily monitoring run costs only a few cents.
product-result: $0.003 per delivered record (base data)price-alert: $0.01 extra, forprice_change/removedrecordsstock-alert: $0.012 extra, forback_in_stock/out_of_stockrecordssale-alert: $0.01 extra, forsale_started/sale_endedrecords โ a sale flip is usually also a price move, but this fires instead ofprice-alertfor that record, not on top of ittrend-insight: $0.0125 extra, only withtrackPriceHistoryenabled and a real multi-point comparison possible (not the first run for a variant)cross-store-comparison: $0.01 per matched SKU, only withcrossStoreComparisonenabled and the SKU actually found in 2+ monitored stores
Sale alerts (sale_started/sale_ended)
With monitorMode: true, a variant's onSale status flipping since the previous run is reported as its own
changeType โ sale_started or sale_ended โ independent of whether it also happens to be a price_change
(a sale flip almost always is one, but the sale signal is more specific and takes precedence over the generic
price_change label for that record). previousPrice/priceChangePercent are still filled when the price
also moved.
Historical price trend (trackPriceHistory, optional, separately charged)
With trackPriceHistory: true, each record gets a trend field once at least 2 price points exist for that
variant:
{"trend": {"lowestPriceEver": 71.97,"highestPriceEver": 89.99,"priceChangePercentSinceOldestPoint": -10.5,"historyPoints": 12}}
priceChangePercentSinceOldestPoint compares against the oldest point still in the retained window
(capped at maxHistoryPoints), not a fixed calendar period like "7 days ago" โ this actor doesn't assume a
particular run schedule. trend is null on the very first measurement for a variant (nothing to compare
yet). Charged as trend-insight, only once a real comparison was possible.
Cross-store price comparison (crossStoreComparison, optional, separately charged)
With crossStoreComparison: true and 2+ stores configured, the actor emits one extra record per SKU that
appears in more than one monitored store:
{"recordType": "cross_store_comparison","sku": "CRZ-42","lowestPrice": 129.0,"lowestPriceStore": "www.competitor.com","lowestPriceProductUrl": "https://www.competitor.com/products/cruiser-42","stores": [{ "store": "www.allbirds.com", "price": 135.0, "productUrl": "https://www.allbirds.com/products/cruiser-42" },{ "store": "www.competitor.com", "price": 129.0, "productUrl": "https://www.competitor.com/products/cruiser-42" }]}
Matching is exact-SKU only โ no fuzzy title matching, since that risks wrong matches for automated arbitrage
decisions. Charged as cross-store-comparison, once per matched SKU.
Run summary
A RUN_SUMMARY object (store/result/alert counts, per-store errors) is written to the actor's key-value store
after every run, and is also pushed as the last item in the dataset (marked "recordType": "run_summary",
easy to filter out) โ so no-code integrations (Zapier, Make, Google Sheets) that only read the dataset see it
too, without an extra API call. No extra charge.
Reliability notes
- Uses Shopify's public
products.jsonendpoints โ stable for years, no HTML parsing that breaks on redesigns - Automatic exponential backoff on HTTP 429 (rate limits) and 5xx responses
- Stores behind aggressive bot protection (e.g. some enterprise storefronts) may return 403; these are reported per store in the run summary while other stores complete normally
- Product data only (titles, prices, stock) โ no personal data is collected, so GDPR exposure is minimal
FAQ
Does it work on every Shopify store? The vast majority. A small number of stores disable the public product feed or sit behind bot protection; these are reported as errors in the run summary.
How many products can it handle? Tested with catalogs of thousands of products; pagination at 250 products per request.
Can I monitor specific products only? Use collection, vendor, tag or price filters to narrow scope.
Where is the change history stored? A compact per-store price snapshot lives in the actor's key-value store; each run compares and updates it.
Related Actors
Also by this developer:
- Agrigrondstofprijzen Monitor โ same profile: a change-detection price-monitoring feed with period-over-period trend and alert thresholding, for EU agricultural commodities instead of Shopify products.
Keywords: shopify scraper, shopify price tracker, price monitoring, competitor price tracking, shopify products json, price drop alert, e-commerce intelligence, MAP monitoring.
Changelog
0.5.0 - Sale alerts, price history trend & cross-store comparison
- Added
sale_started/sale_endedchange types: a variant'sonSalestatus flipping since the previous run is now its own signal, symmetric withback_in_stock/out_of_stock. Newsale-alertevent ($0.01), fires instead ofprice-alertfor that record (not on top of it) when both flip at once. - Added
trackPriceHistory(opt-in) โ keeps a short price time series per variant across scheduled runs, exposed astrend(lowest/highest price ever, % change vs. the oldest retained point). Newtrend-insightevent ($0.0125), only charged once a real multi-point comparison exists. - Added
crossStoreComparison(opt-in) โ when monitoring 2+ stores, emits an extra record per SKU matched across stores with the lowest price and which store offers it (exact SKU match only). Newcross-store-comparisonevent ($0.01), once per matched SKU.
0.4.0
- Added
notificationWebhookUrl: POSTs a compact run summary (counts + biggest price drop) to a webhook at the end of the run. Convenience feature, same data already available elsewhere, no extra charge. A failed/unreachable webhook is logged and never fails the run. RUN_SUMMARYis now also pushed as the last dataset item ("recordType": "run_summary"), not just the key-value store, so dataset-only integrations see it. No pricing change.- Fixed a potential snapshot-key collision: two different store hosts that sanitize to the same key (e.g.
myshop.co.ukandmyshop-co.uk) no longer silently overwrite each other's snapshot in monitor mode, which could have produced false new/removed signals. A short hash of the original host is now appended to the key.
0.3.1 - Bugfix
- Fixed
price-alert/stock-alertnever firing across scheduled runs: the actor was reading/writing its snapshot to Apify's per-Run default key-value store, which is not shared between separate runs. Now uses a named, persistent key-value store. A new baseline will be captured on the next run.
0.3.0
- Added back-in-stock/out-of-stock detection: an availability flip vs. the previous run is now its own
back_in_stock/out_of_stockchangeType, detected independently of any price move on the same variant. Charged as a newstock-alertevent ($0.012), confirmed by the user (2026-07-14). The per-store snapshot now also tracks availability, not just price.
0.2.0
- Added
minPriceChangePercentโ filters out micro price-changes (rounding, A/B-test pricing) from being charged asprice-alertevents, while still reporting the delta on the record. No pricing change โ this reduces noise/cost for the user, it doesn't add a new event.
0.1.0 - Initial release
- Full Shopify catalog scraping via the public
products.jsonand collection endpoints - Change detection between runs (
new,price_change,removed,unchanged) using a per-store key-value snapshot - Sale detection via compare-at price with computed discount percentage
- Pay-Per-Event pricing with separate
product-resultandprice-alertevents