Shopify Product & Price Monitor avatar

Shopify Product & Price Monitor

Pricing

from $3.00 / 1,000 product-results

Go to Apify Store
Shopify Product & Price Monitor

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

Dennis

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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, removed or unchanged, 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_stock changeType, 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 onlyOnSale and onlyChanges for 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

FieldDescription
storesShopify store URLs (required)
collectionsCollection handles to limit scope
vendor / productType / tagsProduct filters
onlyOnSale / onlyAvailableSale and stock filters
minPrice / maxPricePrice range filter
maxProductsPerStoreCap per store (default 1000)
monitorModeEnable change detection between runs
onlyChangesOutput only new/changed/removed items
minPriceChangePercentIn 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
notificationWebhookUrlOptional: 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
trackPriceHistoryKeep a short price time series per variant across scheduled runs, exposed as trend. Default false
maxHistoryPointsHow many past price points to keep per variant when trackPriceHistory is on (default 30)
crossStoreComparisonWhen 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, for price_change/removed records
  • stock-alert: $0.012 extra, for back_in_stock/out_of_stock records
  • sale-alert: $0.01 extra, for sale_started/sale_ended records โ€” a sale flip is usually also a price move, but this fires instead of price-alert for that record, not on top of it
  • trend-insight: $0.0125 extra, only with trackPriceHistory enabled and a real multi-point comparison possible (not the first run for a variant)
  • cross-store-comparison: $0.01 per matched SKU, only with crossStoreComparison enabled 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.json endpoints โ€” 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.

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_ended change types: a variant's onSale status flipping since the previous run is now its own signal, symmetric with back_in_stock/out_of_stock. New sale-alert event ($0.01), fires instead of price-alert for 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 as trend (lowest/highest price ever, % change vs. the oldest retained point). New trend-insight event ($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). New cross-store-comparison event ($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_SUMMARY is 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.uk and myshop-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-alert never 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_stock changeType, detected independently of any price move on the same variant. Charged as a new stock-alert event ($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 as price-alert events, 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.json and 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-result and price-alert events