Product Price & Stock Monitor
Pricing
Pay per usage
Product Price & Stock Monitor
Watch product prices and stock on Shopify, Salla (سلة), and Zid (زد) storefronts. Get a row only when something actually changes — a price moved, a sale started or ended, an item sold out or came back.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Hussein Al-Mansori
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Watch product pages and get told only when something actually changes — a price moved, a sale started or ended, an item sold out or came back. Free.
Point it at product addresses on Shopify, Salla (سلة), or Zid (زد) stores, run it on a schedule, and it publishes a row only when there is something to act on. Nothing changed means nothing in your dataset and nothing in your inbox.
The number this rests on
Most monitors are judged on what they catch. The harder problem is what they invent: a monitor that reports price moves that never happened stops being read, and the one alert that mattered goes with it.
Across 21 live products from 12 stores on all three platforms, read twice a minute apart with
nothing edited in between: 0 false alerts. Reproduce it with the run_false_alert_sweep.py
script kept beside the Actor — it reads real products, waits, reads them again, and every change it
reports is by definition a false one. Ask on the issues page for the product list.
One further product could not be read at all and is counted as a failure rather than quietly dropped: removing the awkward cases after seeing the result is how a measurement stops being evidence.
That number is measured against the web as it looked in August 2026, and the web moves.
Who this is for
| You are | What you get |
|---|---|
| A reseller or dropshipper | Told the moment a supplier's price drops or an item is back in stock |
| A merchant | Competitor price moves, without paying a monitoring SaaS per product |
| A shopper waiting on stock | One row the moment a sold-out size returns |
What you paste in
Product page addresses — up to 500 per run. The platform is detected for you, including stores on their own domain.
https://www.kyliecosmetics.com/products/kylies-everyday-look-bundlehttps://elfaleh.sa/2011097-al-faleh-football-training-signals-tools
Run it on Apify's scheduler — hourly, daily, whatever suits — and the Actor compares each check against what it saw last time.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
productUrls | list of URLs | — | The product pages to watch. Required. |
onlyReportChanges | boolean | true | Publish a row only when something moved. Turn off to keep a full price history. |
stateStoreName | string | product-price-monitor-state | Where the baseline lives. Change it to run two independent watch lists. |
respectRobots | boolean | true | Skip any address the store asks crawlers not to read. Checked on every page. |
proxyConfiguration | object | off | Leave off unless a store refuses the connection. |
What you get back
{"event": "change-detected","platform": "shopify","url": "https://shop.example.com/products/wool-runners","nameEn": "Women's Wool Runners","price": 140.0,"salePrice": 98.0,"currency": "USD","availability": "in_stock","changeKinds": ["price-decreased", "sale-started"],"previousPrice": 140.0,"previousSalePrice": null,"priceChangePercent": -30.0,"previouslyCheckedAt": "2026-08-25T09:00:00Z","status": "verified"}
Every row is self-contained: it repeats the store, the current values, and what they were before, so one row is enough to act on.
changeKinds is what actually moved: price-increased, price-decreased, sale-started,
sale-ended, back-in-stock, out-of-stock, variant-stock-changed, or baseline for the first
sighting of a product.
How honest a row is
status | Meaning |
|---|---|
verified | Read cleanly. Nothing was uncertain. |
warning | Delivered, but something was uncertain — the reason is on the row. |
failed | The product could not be read. No price is published, and never a stale one. |
Four rules this Actor does not bend:
- A price that could not be read is
null, andnullis never a change. "The store did not say" is not "the price is nothing", so a reading failure is never reported as a price move. - Stock only changes between two things the store actually said. A product whose stock could
not be read has not gone out of stock — you get
unknown, not an alert. - A currency change cancels the price comparison. Some storefronts price by where the request
comes from; one measured product answered
290 SARfrom Saudi Arabia and105 USDfrom a US data centre. Comparing those two numbers would report a 64% cut no shopper ever saw. - A drop too large to believe is reported but not called
verified. It carries a warning so nobody reprices against it without looking.
What each platform can tell you
Platforms publish different things, and this Actor reports only what it can actually see.
| Price moves | Sale started / ended | Stock | Per-variant stock | |
|---|---|---|---|---|
| Shopify | ✅ | ✅ | ✅ | ✅ |
| Zid (زد) | ✅ | ✅ | ✅ | ✅ |
| Salla (سلة) | ✅ | — | ✅ | — |
Salla's product pages publish what a shopper pays but do not separate it from the list price, so a Salla row tells you the price moved and never claims a sale started. Inferring one would be a defensible-looking guess, and this Actor does not make those.
Limits
| Limit | Value |
|---|---|
| Products per run | 500 |
| Products checked at once | 4 |
| Time per product | 30 seconds |
| Time per run | 900 seconds |
| Variants tracked per product | 50 |
| Smallest price move reported | 0.005 |
What this deliberately does not do
- No logged-in prices, carts, or checkouts. Public product pages only.
- No catalogue discovery: it watches the products you name, and does not crawl a shop for more.
- No email or SMS. Use Apify's own integrations to route a run's dataset wherever you want it.
Pricing
Free. Only Apify's platform usage applies. Two events are defined — product-checked (every
read) and change-detected (a real change) — and neither is charged today.
They exist so that adding a price later would be a price change and not a redesign.
Works well with
Salla Store Scraper and Zid Store Scraper — pull a catalogue, pick the products worth watching, and hand them to this Actor. Field names are identical across all three, so the datasets concatenate with no renaming.
FAQ
How does it know what changed? It stores a small record of each product — price, sale price, currency, stock — in a key-value store on your account, and compares the next check against it. Only those fields, never the page.
What happens on the first run?
Every product is a baseline row: the starting point, not a change. You are never told a price
moved on a product the Actor has not seen before.
Can I watch a whole store? Not directly — it checks the addresses you give it. Use the Salla or Zid store scraper to get the catalogue first.
Does it need my store login? No. Public product pages only.
Why is stock unknown on some rows?
Because the store did not say. Guessing in_stock there is exactly the alert you would act on and
regret.
Will it tell me twice about the same change? It can, in one case: if the row is published but the baseline cannot be saved. That is the deliberate trade — the alternative is losing the change silently and forever.
Support
Open an issue on the Actor's Apify page. Include the run ID and the product URL.
Not affiliated with, endorsed by, or sponsored by Shopify, Salla (سلة), or Zid (زد).