Shopify Competitor Watch (price & stock alerts)
Pricing
from $10.00 / 1,000 store watches
Shopify Competitor Watch (price & stock alerts)
Monitors competitor Shopify stores and alerts on price changes, product additions/removals, and stock (sold-out/restocked) changes. Uses the store's public product feed - no proxies, no logins, fully ToS-safe.
Pricing
from $10.00 / 1,000 store watches
Rating
0.0
(0)
Developer
Hossam Mohamed
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
Shopify Competitor Watch
Monitors competitor Shopify stores and alerts you when they change prices, stock status (sold out / restocked), or their product catalog (items added or removed) — and when sales start or end (compare-at price).
Uses each store's public product feed (/products.json). No proxies, no logins, no brittle page scraping — fast, cheap, and reliable.
How it works
-
First run — records a baseline snapshot of each store's catalog (every product variant: title, price, compare-at price, availability) and saves it to the Actor's key-value store. You'll see one
baseline_recordedper store withproductsTracked,complete, andcapUsed. -
Subsequent runs (schedule it daily or hourly) — re-fetches each catalog, diffs it against the snapshot, and outputs one item per detected change:
| changeType | level | meaning | key fields |
|---|---|---|---|
price_changed | variant | variant price changed | variantId, oldPrice, newPrice |
sale_started_or_ended | variant | compare-at price changed (sale on/off) | variantId, oldPrice (compare-at), newPrice |
stock_changed | variant | variant went in/out of stock | variantId, oldAvailable, newAvailable |
product_added | product/handle | product appeared (one event per handle) | handle, title, variantCount, newPrice, newAvailable |
product_removed | product/handle | product disappeared (one event per handle) | handle, title, variantCount, oldPrice |
baseline_recorded | store | first run or baseline reset for a store — no diff yet | productsTracked, complete, capUsed |
Snapshot persistence
- Complete snapshots are authoritative. A snapshot with
complete:truemeans the fetch reached the end of the store's public catalog without being truncated bymaxProductsPerStore. - Incomplete snapshots persist normalized. When both the previous and current fetches are
complete:falsewith the same cap, the Actor diffs on the overlap (price/stock/sale on shared variants, no removals) and then persists the current normalized snapshot so sentinel normalizations (e.g.compare_at "0.00" → null) take effect on the next run. - Incomplete → complete upgrades. A truncated snapshot is upgraded to
complete:truewhen a later fetch covers the whole catalog. - Failed/unusable fetches do not overwrite state. Unreachable stores or empty fetches leave the previous snapshot untouched and emit no charge.
- Cap or schema changes force a baseline. Changing
maxProductsPerStorewith a complete fetch records a fresh baseline; a truncated fetch after a cap change preserves the old snapshot and skips diffing to avoid false removals.
Each successful run reports changes since the previous successful snapshot for the same store and cap.
Input
| field | type | default | description |
|---|---|---|---|
storeUrls | array (required) | — | Shopify storefront hostnames or URLs, e.g. kith.com |
maxProductsPerStore | integer | 1000 | Safety cap per store (250 products per page). When the catalog is larger than the cap, the snapshot is complete:false and product removals are suppressed — price/stock/sale still works on overlapping variants. |
includeCompareAtPrice | boolean | true | Also detect sale-price changes |
Example
Run with storeUrls: ["brooklinen.com", "kith.com"]. First run records baselines. A day later, the run's dataset contains:
{"store": "kith.com", "changeType": "price_changed", "handle": "dmysun13sb", "title": "DMY Studios Margot Sunglasses - Black", "oldPrice": "290.00", "newPrice": "249.00"}{"store": "brooklinen.com", "changeType": "stock_changed", "handle": "down-alternative-lumbar-pillow-insert", "oldAvailable": false, "newAvailable": true}
Product-level example (one handle, 4 variants):
{"store": "kith.com", "changeType": "product_removed", "handle": "old-season-tee", "title": "Old Season Tee", "variantCount": 4, "oldPrice": "45.00"}
Tips
- Run on a schedule (daily is usually enough) for continuous monitoring.
- Connect a webhook to get notified on new changes, or use Apify's dataset integrations (Slack, Sheets, email).
- Keep
maxProductsPerStorereasonable — very large catalogs take proportionally longer. For stores with >1000 products (e.g. Kith), the snapshot will becomplete:falseand removals are suppressed on truncated runs — raise the cap if you need full-catalog removal detection. - Stores that disable the public product feed or aren't on Shopify can't be tracked; the run continues with the remaining stores.
Cost
No proxies are used — runs are essentially compute-only, so monitoring a handful of stores daily costs a fraction of a cent per run. You are charged $0.20 per store-watch (one per successfully processed store per run).
Limitations (by design)
- Tracks variant-level price/stock/sale and product-level adds/removes (with
variantCount) — The public product feed exposes availability, not inventory counts, so "stock" means available vs. sold out. - Detects changes since the last successful snapshot; it is a monitor, not a historical price archive.
maxProductsPerStorecan truncate large catalogs —complete:falsemeans the snapshot is a window, not the full catalog; removals are suppressed on truncated runs, while price/stock/sale still works on overlapping variants.compare_atvalues"0","0.00", etc. are normalized tonull(no sale) — you won't see0.00→nullsale flips.- First run for a store (or after a cap change with a complete fetch) always establishes a baseline (
baseline_recorded) before diffs begin; failed fetches leave the previous snapshot untouched. - Does not send emails itself — use dataset/webhook integrations for notifications.
Use with AI agents
Built for agents: documented JSON input schema, one stable record per change event, no auth beyond the caller's own Apify token. The simplest integration is the run-sync endpoint, which starts the run and returns all detected changes in one call:
POST https://api.apify.com/acts/dev-hoss~shopify-competitor-watch/run-sync-get-dataset-items?token=YOUR_API_TOKENContent-Type: application/json{"storeUrls": ["kith.com", "allbirds.com"], "maxProductsPerStore": 1000}
It also works with Apify's hosted MCP server (mcp.apify.com) — add the Actor to your MCP client and the input schema drives the tool call. Quiet runs (no changes) return zero records; failed store fetches are skipped without charge, so agents never pay for dead stores.