TL;DR
- Most WooCommerce stores publish their full catalog publicly, including prices, sale prices, SKUs and stock, so a competitor's catalog can be monitored without logins, plugins or page-by-page scraping.
- The useful part is diffing: snapshot the catalog on a schedule and send only what changed (new, removed, price changed, stock changed) to Slack, email or Sheets.
- In three real stores we checked on Oct 20, 2026, 13–36% of products were out of stock and 1–15% were on sale. Those are the fields that move day to day.
- A daily check of a 1,000-product competitor with 10 changes costs about $0.25 a run with our monitor actor. The first (baseline) run is never charged for changes.
- Full setup below: the scheduled actor, Zapier, Make, built-in Apify integrations and Python.
If you sell products that other shops also sell, you've probably done this: open a few competitor tabs every Monday, scroll their catalogs, and try to remember what things cost last week. That works for 20 products. It breaks at 200, and it misses the things that matter most: the sale that started Tuesday night, the best-seller that went out of stock on Thursday, the new product line that appeared over the weekend.
Price-monitoring tools exist, but many are built around matching URLs one product at a time, or need a WooCommerce REST API key, which you can only get for your own store. For competitor stores built on WooCommerce, there's a sturdier path: monitor the whole catalog and get told only what changed.
This guide shows that path end to end. Every number in it comes from real public stores or from our actor's published pricing.
Disclosure: we built the WooCommerce Product Feed & Catalog Monitor actor used in this guide.
Contents
- Why competitor price monitoring matters
- What a competitor's catalog tells you
- Step 1: snapshot and diff on a schedule
- What it costs
- Step 2: alerts with Zapier, Make or Apify integrations
- Step 3: the code version
- Which alerts are actually worth sending
- Caveats
- FAQ
- Try it
Why competitor price monitoring matters
Competitor signals are some of the cheapest market data you can get, and they're perishable:
- Price drops on products you both sell decide whether you lose the click on Google Shopping, the marketplace comparison, or the customer who checks two tabs.
- Stock-outs are the most underused signal. When a competitor sells out of a popular item, demand moves to whoever still has it. That's the moment to hold your price, not cut it, and maybe to raise ad spend.
- New products show where a competitor is investing before they announce it.
- Removed products show what didn't sell.
None of these need a perfect real-time feed. A daily diff catches nearly all of them, and every few hours is plenty in fast categories.
What a competitor's catalog tells you
WooCommerce is one of the most widely used e-commerce platforms, so many of your competitors probably run on it. Their public catalog is far more structured than it looks from the storefront: every product has a current price, a regular price, a sale price, a stock status and usually a SKU, and all of it is visible to any visitor.
Turning that into a reliable feed is the hard part. Themes differ, prices are stored in different currencies and units, variations hide inside parent products, and stores change over time. Our actors handle all of that and are maintained against WooCommerce changes, so you get clean rows instead of a parsing project.
Even a single snapshot is informative. Here are three real public WooCommerce stores on Oct 20, 2026: a 39-product drinkware shop, a 69-product online butcher and a 101-product outdoor-bottle brand.
On the day we checked, 13–36% of products were out of stock and 1–15% were on sale. Those are exactly the fields that change from one day to the next, and the changes are what you want alerts for.
What that's worth to different teams:
- E-commerce managers: match or hold prices on overlapping products, and push ads when a rival sells out.
- Category and merchandising teams: see new launches and discontinued lines as they happen, not at the next quarterly review.
- Agencies and analysts: run the same watch across dozens of stores for clients, with one schedule and one dataset.
- Brands with resellers: spot resellers undercutting your price policy.
Step 1: snapshot and diff on a schedule
Reading a catalog once is easy. The useful part is remembering last run's catalog and reporting only what changed. WooCommerce Product Feed & Catalog Monitor does exactly that:
- The first run for a store records a baseline and is never charged for "changes".
-
Every later run compares against the stored snapshot and emits one dataset row per change, typed
new,removed,price_changedorstock_changed.
{
"storeUrls": ["https://competitor-one.com", "https://competitor-two.com"],
"maxProductsPerStore": 1000,
"outputMode": "changes",
"stateName": "competitor-watch",
"maxChargeUsd": 2
}
A change row looks like this:
{
"recordType": "change",
"store": "https://competitor-one.com",
"changeType": "price_changed",
"name": "Ceramic Mug - 12oz",
"sku": "MUG-12",
"price": 1650,
"oldPrice": 1400,
"currency": "USD",
"stock_status": "instock",
"permalink": "https://competitor-one.com/product/ceramic-mug-12oz",
"detectedAt": "2026-10-16T09:00:00+00:00"
}
Keep stateName identical across runs. It names the key-value store that holds the snapshot. Change it only when you want a fresh baseline, for example when you start watching a different set of stores.
Schedule it. In Apify Console, go to Schedules → Create new. Pick the actor, or better, save the input above as a Task first, then set a cron expression:
-
0 7 * * *runs daily at 07:00, which is enough for most categories; -
0 */4 * * *runs every four hours, for fast-moving categories or during sale seasons.
What it costs
Pricing is pay-per-event:
| Event | Price |
|---|---|
| Run started | $0.001 |
| Product checked | $0.0002 ($0.20 per 1,000) |
| Change detected | $0.005 |
A 1,000-product competitor checked daily with about 10 changes a day costs roughly $0.25 a run, or about $7.50 a month. Three competitors of the three sizes we probed (39, 69 and 101 products) would cost about $0.04 a run combined before changes. To spend less, lower maxProductsPerStore or the schedule frequency. maxChargeUsd is a hard per-run cap, and stores that fail (no public API, network errors) return an error row that isn't charged.
Step 2: alerts with Zapier, Make or Apify integrations
Option A: Zapier
- Trigger: Apify → Finished Task Run. Connect your Apify account and pick the task from step 2.
-
Action: Apify → Fetch Dataset Items, using the
defaultDatasetIdfrom the trigger. -
Filter: only continue if
recordTypeexactly matcheschangeandchangeTypeexactly matchesprice_changed. Add another path forstock_changedornewif you want those too. -
Formatter → Numbers → Perform Math Operation: divide
priceandoldPriceby 100 to show dollars instead of cents. -
Action: Slack → Send Channel Message with the formatted values and the
permalink.
If a run returns many changes, Zapier sends one message per row by default. Use Formatter → Utilities → Line-item to Text to send a single digest message per run.
Option B: Make
- Apify → Watch Task Runs (an instant trigger; Make creates the webhook for you).
- Apify → Get Dataset Items, with Dataset ID =
defaultDatasetIdfrom module 1. - Add a filter between modules 2 and 3:
recordType = changeandchangeType = price_changed. - Google Sheets → Add a Row (a price-history log), and/or Slack → Create a Message.
Add a Router with one route per changeType. Send new products to a "competitor launches" channel and stock_changed to an out-of-stock channel.
Option C: no automation tool at all
Every Apify task has built-in integrations: Slack, email, Google Drive and webhooks. Open the task, go to Integrations, and add Slack or Send email triggered on Run succeeded. You won't get per-row filtering, but you get a free "the run finished, here's the dataset" notification.
Step 3: the code version
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("dheerajitbhu/woocommerce-catalog-monitor").call(run_input={
"storeUrls": ["https://competitor-one.com"],
"outputMode": "changes",
"stateName": "competitor-watch",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("recordType") == "change" and row["changeType"] == "price_changed":
old, new = row["oldPrice"] / 100, row["price"] / 100
pct = (new - old) / old * 100 if old else 0
print(f"{row['name']}: {old:.2f} -> {new:.2f} ({pct:+.1f}%) {row['permalink']}")
Scheduling, cloud state, many stores per run, error rows instead of crashes, per-run spend caps and the Zapier and Make integrations all come built in.
Which alerts are actually worth sending
An alert for every change becomes noise within a week. Pricing-strategy guides such as Valyupeak's WooCommerce price-tracking setup and Pricerr's monitoring guide make the same point: design alerts around decisions you'd actually act on.
- Price drops beyond a threshold on products you also sell. Valyupeak suggests something like 8–15% as the point where a deliberate response is warranted.
- Stock-outs on overlapping products. Hold your price and consider raising ad spend.
- New products from your main competitors, in a separate, lower-priority channel.
- Weekly digest for everything else. Put all changes in a Google Sheet and review it on Mondays.
Set a price floor before you let any of this drive automatic repricing. A competitor's clearance sale shouldn't set your price.
Caveats
- Public prices only. Member-only pricing, coupons applied at checkout and B2B price tables aren't in public catalog data.
- Currencies and minor units. Prices come back in the store's own currency and minor units. Convert before comparing across stores.
- Variable products. For products with variations (sizes, colours), the top-level price may not reflect every variation's price. Check the variations you care about if sizes are priced differently.
- Matching your catalog to theirs (which of their products equals which of yours) is a separate problem. SKUs rarely match across brands, so most teams keep a small mapping sheet for their key products.
- Be a good citizen. The actor reads catalogs lightly and politely. Daily or every few hours is plenty. Use the data in line with each store's terms.
FAQ
Is it legal to monitor a competitor's catalog?
The actor reads only the public catalog data the store shows any visitor, without login. You're still responsible for following each site's terms and local law, so treat this as public price intelligence, not a way into anything private.
How do I know if a store is on WooCommerce?
Just add its URL. Stores that can't be read come back as an error row and aren't charged.
Does it work for Shopify stores?
No, this actor is WooCommerce-only. Shopify has its own public storefront JSON, which our DriftGuard actor reads for a different job: checking your own Google Merchant Center feed.
How often should I run it?
Daily for most categories. Every 4 hours around big sale events or in fast-moving categories. Each run is charged per product checked, so frequency is the main cost lever.
What happens on the very first run?
It records the baseline snapshot and isn't charged for changes. Alerts start from the second run.
Can I watch several competitors at once?
Yes. Put them all in storeUrls. One run checks every store and diffs each against its own previous snapshot.
Can I monitor my own store with it?
Yes. Some merchants use it as a cheap audit log of their own price and stock changes.
Try it
WooCommerce Product Feed & Catalog Monitor on Apify: add your competitors' store URLs, keep stateName fixed, schedule it daily, and connect Slack. Questions? Email apify@integrationyard.com.
Data in this post: read-only checks of three public WooCommerce stores on Oct 20, 2026, plus the actor's published pricing.


Top comments (0)