WooCommerce Catalog & Price Monitor - Diffs & Low-Stock Alerts
Pricing
from $0.00005 / actor start
WooCommerce Catalog & Price Monitor - Diffs & Low-Stock Alerts
Export any public WooCommerce store's full catalog (products, variations, prices, stock) from the Store API and get typed change alerts on every scheduled run — price drops, new products, stock-outs, and low-stock-remaining warnings.
Pricing
from $0.00005 / actor start
Rating
0.0
(0)
Developer
Eonix Pvt Ltd
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
WooCommerce Catalog & Price Monitor
Track any public WooCommerce store's prices and stock. Get told the moment something changes.
Point it at a competitor, a supplier, or your own shop. The first run exports the whole catalog. Every run after that tells you exactly what moved: price drops, price rises, products going out of stock, new products, discontinued products — and the one thing a Shopify monitor cannot give you, how many units are left.
Runs on a schedule. Sends the summary to Slack. Costs cents per check.
Who this is for
- Retailers watching competitors — know within the hour when someone undercuts you.
- Brands enforcing MAP — catch resellers pricing below your minimum, with a timestamped record.
- Dropshippers and resellers — know when a supplier's stock is running down before it hits zero.
- Store owners — monitor your own catalog for accidental price changes or products falling out of stock.
- Analysts and AI agents — a clean, consistent JSON feed of catalog and change data.
What you get
Every run produces:
| Full catalog export | One row per product — or per variation, where a product has them. Price, sale price, currency, stock, SKU, categories, tags, brands, attributes, images, weight, dimensions, ratings. |
| Change events | One row per detected change, with the old value, the new value, and the percentage move. |
| Low-stock warnings | Fired when remaining units fall into your threshold. |
| Run summary | Which stores worked, what changed, how long it took. |
| Cost estimate | Written before the work starts, so you always know what a run will cost. |
| Slack / webhook alert | A grouped digest per store: every low-stock hit plus the biggest price moves. |
The first run for each store is a baseline — it exports the catalog and remembers it. From the second run onwards you get change events. That is how it knows what "changed" means.
The seven change events
| Event | Fires when |
|---|---|
price_drop | The price went down. Includes old price, new price, and % change. |
price_increase | The price went up. |
low_stock | Remaining units fell into your threshold, or fell further while already low. |
out_of_stock | A product sold out. |
back_in_stock | A product returned. |
new_product | A product appeared in the catalog. |
removed_product | A product disappeared. |
Low-stock alerts do not repeat themselves. If an item sits at 2 units for a week, you get told once — when it drops to 2 — not every single run. A monitor that reports the same three items every fifteen minutes gets muted, and a muted monitor is worthless. Each alert carries the previous count so you can see the movement.
Getting started
- Paste one or more store URLs into Store URLs. Any page on the store works — a product page, a category page, the homepage.
- Set Low-stock threshold to whatever "running low" means for you (default: 5 units).
- Click Start.
- Run it again — or better, put it on a schedule — to start receiving change events.
- Optionally paste a Slack webhook to get the digest in a channel.
That is the whole setup. No API keys, no store credentials, no plugin to install on the store.
Tip: keep the Snapshot key-value store name the same across scheduled runs. That stored snapshot is what makes change detection possible. Changing it starts over from a fresh baseline.
Not every WooCommerce store can be monitored — check yours first
This is the single most important thing to know before you buy, so it is at the top rather than buried.
The actor reads a store's WooCommerce Store API — the same public endpoint the shop's own website calls to display its products. Most WooCommerce stores expose it. Some do not:
- Some WordPress hosts and SEO plugins publish a rule asking crawlers to stay away from that endpoint.
Those stores are reported as
skippedand cost you nothing. - Some stores have the Store API switched off or behind a firewall. Reported as
endpoint_unavailable, and again not charged.
You are never charged for a store that cannot be read. Run the actor once against your list of targets to find out which qualify — failed detections are free, so a qualification run on a list of non-WooCommerce domains costs $0.00.
For transparency, from a sample of 42 domains tested while building this actor: 6 ran WooCommerce with the Store API reachable, and 3 of those 6 asked crawlers to stay away from it. Test your own list.
Pricing
Pay per event. No subscription, no rental.
| You are charged | Price |
|---|---|
| Per store successfully snapshotted | $0.05 |
| Per 1,000 catalog records exported | $0.50 |
| Per change event | $0.002 |
| Per low-stock alert | $0.005 |
| Per Standby API request | $0.001 |
Nothing is charged for a store that fails, is skipped, or is not WooCommerce. Every charge follows data actually being written.
A low-stock alert is charged instead of a change event, never on top of it.
What a real run costs
Two real stores, 212 products, 286 records including variations:
| Line | Quantity | Cost |
|---|---|---|
| Store snapshots | 2 | $0.10 |
| Catalog export | 286 records | $0.50 |
| Change events | 0 (baseline run) | $0.00 |
| Total | $0.60 |
Turn the catalog export off and the same monitoring run costs $0.10. That is the pattern most people want: export the catalog once, then run the alert loop hourly for pennies.
You see the cost before the run does the work
Every run calculates what it expects to cost and writes it to COST-ESTIMATE.json before fetching
anything — using each store's own published product count, not a guess:
Estimated cost of this run:catalog-snapshot 2 × $0.0500 = $0.1000variant-exported 1 × $0.5000 = $0.5000change-alert 0 × $0.0020 = $0.0000low-stock-alert 0 × $0.0050 = $0.0000TOTAL $0.60
Change and low-stock lines show zero because they honestly cannot be known before the comparison runs — a monitoring run where nothing moved costs nothing beyond its snapshots. Every line explains where its number came from.
Free plan limits
On the Apify free plan, runs are capped at 1 store, 50 records, and no alert delivery. Change events are still detected and still appear in your results — they just are not posted to Slack or a webhook. Any paid plan runs uncapped.
Settings
| Setting | Default | What it does |
|---|---|---|
| Store URLs | two demo stores | The stores to monitor. Any URL on the store works. |
| Export the full catalog | on | Turn off for cheap alert-only monitoring. |
| Low-stock threshold | 5 units | When to warn you. Set to 0 to switch low-stock alerts off. |
| Snapshot store name | woo-monitor-snapshots | Keep it stable across scheduled runs. |
| Change event filters | none | Watch only certain products, categories or tags — or only moves above a % threshold. |
| Slack webhook | — | Where to send the digest. |
| Alert webhook | — | Any HTTPS endpoint that accepts JSON. |
| Maximum products per store | 5,000 | Bounds run time on very large catalogs. |
| Fetch exact variation prices | on | See "Products with variations" below. |
| Variation lookup budget | 500 | How many of those lookups to allow per store. |
| Proxy | Apify Proxy | Switch to residential if a store blocks datacenter addresses. |
Filters only narrow your alerts, never your data
Filters apply to change events only. The catalog export always contains everything. A filter can never silently shrink the data you paid to export.
{"nameIncludes": ["ribeye", "wagyu"],"categories": ["Beef"],"minPctChange": 10}
That watches only beef products whose name mentions ribeye or wagyu, and only price moves of 10% or more. Stock and low-stock alerts are never filtered out by a percentage threshold.
How low-stock detection actually works
Most listings would promise "low stock alerts" and leave it there. Here is the honest version, because finding out afterwards is worse.
WooCommerce only publishes a "units remaining" number when a store has stock management switched on and the quantity is already low. Measured on two real stores while building this:
| Store | Products checked | Published a units-remaining number |
|---|---|---|
| Store A (food retailer) | 69 | 0 |
| Store B (software) | 100 | 5 |
So the actor uses two signals:
- The store's explicit remaining-units field, when it publishes one.
- Otherwise, the number written on the product page itself —
"2 in stock","Only 3 left in stock"— tracked across runs so a falling count triggers the alert.
Every record shows both readings, and every alert says which signal fired it. If a store publishes
no quantity at all, no low-stock alert can fire for it — you will see out_of_stock instead, when
it finally sells out. That is a real limit of what WooCommerce makes public, not something any tool can
work around.
Products with variations
A variable product — three sizes of the same shirt — is exported as one row per variation, each with its own price, SKU and stock.
WooCommerce does not include variation prices in its main product listing, so the actor fetches them
separately, within the budget you set. Rows priced exactly are marked priceSource: "variation". If a
catalog has more variations than the budget allows, the remaining rows inherit the parent product's
price and are marked priceSource: "parent" — so you always know which number you are looking at.
Sample output
A catalog row (prices are exact — held as integer cents internally, so a price that did not move can never look like it did):
{"kind": "record","target": "examplestore.com","status": "ok","collectedAt": "2026-08-16T15:29:13.551Z","source": "wc/store/v1","name": "Infinity Bundle Lifetime License – Payment Plan (6 – Pay)","permalink": "https://examplestore.com/product/infinity-bundle-6-pay/","type": "subscription","price": 500,"priceCents": 50000,"regularPrice": 1700,"salePrice": 500,"currency": "USD","onSale": true,"isInStock": true,"stockAvailability": "2 in stock","stockCount": 2,"lowStockRemaining": 2,"categories": [],"imageSrc": "https://examplestore.com/wp-content/uploads/infinity-bundle.jpeg","priceSource": "product"}
A low-stock alert:
{"kind": "change","type": "low_stock","target": "examplestore.com","name": "Infinity Bundle Lifetime License – Payment Plan (3 – Pay)","url": "https://examplestore.com/product/infinity-bundle-3-pay/","lowStockRemaining": 2,"previousRemaining": 9,"signal": "low_stock_remaining","threshold": 5,"detectedAt": "2026-08-16T15:29:13.555Z"}
A price drop:
{"kind": "change","type": "price_drop","target": "examplestore.com","name": "LifterLMS Powerpack","oldPrice": 298,"newPrice": 149,"oldPriceCents": 29800,"newPriceCents": 14900,"pctChange": -50}
Every row from every actor in this series carries the same envelope — kind, target, status,
collectedAt, source — so you can wire up one integration and reuse it.
Use it from an AI agent
MCP. The actor is available as a tool through Apify's MCP server at https://mcp.apify.com. Your
agent can ask for a store's catalog, or for what changed since last time, and gets structured JSON
back.
Standby HTTP API. With Standby enabled the actor answers instantly over HTTP, with no run to schedule:
GET https://<your-actor>.apify.actor/?storeUrls=examplestore.com&lowStockThreshold=3GET https://<your-actor>.apify.actor/health
The response is the same JSON a scheduled run produces. Health checks are free.
Reliability
Measured on this build, 2026-08-16:
| Runs completed successfully | 10 of 10 |
| Typical run, two stores, 286 records | under 1 minute |
| Products captured vs. published by the store | 69/69 and 143/143 — nothing missed |
| Repeat run with nothing changed | 0 false alerts |
| Pointed at a non-WooCommerce site | Completed successfully, charged $0.00 |
| Automated tests | 199 passing |
When a source breaks, you will know. If a store starts returning data in an unexpected shape, the actor records it in your results as a health row rather than quietly returning nothing. A run that finds no usable data tells you why — it never reports success while handing you an empty file.
Support
Report problems through the Issues tab on this actor's page. Broken-source issues get a first response within 3 business days and a fix or documented workaround within 7.
What this actor does not do
- It cannot read stores that ask crawlers away from their product API, or that have it disabled. Both are reported clearly and cost nothing.
- It cannot report a stock quantity a store does not publish.
- It does not read Shopify stores — those use a completely different system.
- It does not see prices behind a login, member pricing, or per-customer pricing. Public prices only.
- It does not keep price history for you. It compares the last run with this one. Keep your results if you want a long-term series.
- It does not use a browser, so it cannot get past a JavaScript bot wall or a CAPTCHA.
- It does not touch carts, orders, or customer data. It reads the public product catalog and nothing else.
Is this allowed?
The actor reads the same public product data any shopper's browser downloads when they visit the shop — names, prices, and stock status. It reads nothing private, sends nothing to the store, and respects each store's stated crawler preferences, skipping those that ask to be left alone. It is intended for competitive price research, MAP enforcement, and monitoring your own catalog.