Shopify Competitors · Catalog Changes by Store URL
Pricing
from $2.80 / 1,000 catalog changes
Shopify Competitors · Catalog Changes by Store URL
Schedule public Shopify shops. Get one row per change: new variants, price drops, sold out or back in stock. First run saves a baseline — not a catalog dump. No login. No Shopify admin.
Pricing
from $2.80 / 1,000 catalog changes
Rating
0.0
(0)
Developer
Corentin Robert
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Watch public Shopify shops and get one row per catalog move — new variants, price drops, price increases, sold out, back in stock. Not another full catalog dump you re-export every morning.
Paste a collection, a product, or a shop home. The Actor photographs the public storefront on the first run, then only writes what changed. Optionally ping Slack or Telegram when something moved.
No login. No Shopify Admin. No API key. No proxy.
Built for: DTC / brand ops · e-com agencies · merchandisers · marketplace sourcing · founders watching 1–2 rivals without a BI stack
What does Shopify Catalog Watch do?
It opens the same public catalog shoppers see on a Shopify storefront (*.myshopify.com or a custom domain on Shopify), compares it to the last snapshot, and writes a dataset row when a variant appeared, disappeared, changed price, or flipped public availability.
| This Actor | Not this Actor |
|---|---|
| Deltas vs last run | Full catalog dump every time |
| Public price and available | Warehouse qty, cost, metafields, Admin |
| Collection / product / home URLs | Pages, blogs, cart, Instagram (ignored) |
| Slack or Telegram when it moved | A chat flood on quiet days |
Need the whole catalog as rows (not the diff)? Use Shopify Catalog · Products by Store URL.
Why schedule this instead of re-scraping the shop?
Competitor dumps are expensive and noisy. You already know the assortment. You want what moved overnight: a new SKU, a 15% drop, a restock.
- First run = baseline (one billed snapshot per shop / collection). The Actor remembers the catalog.
- Later runs = change rows only. A quiet day is a cheap start, not 2,000 variant rows.
- Schedule daily in Apify Console. Same input every time. Snapshots live in a named key-value store (
shopify-catalog-watch). - Integrations: Dataset → Google Sheets / Make / n8n, or a Slack / Telegram ping from the run itself.
Who is this for?
| You are… | Typical goal | Suggested setup |
|---|---|---|
| Brand / DTC ops | Catch a competitor promo the same day | 3–10 rival URLs, schedule daily, price 5% |
| E-com agency | Tell a client “what moved overnight” | One shop per client, Slack webhook, Changes view |
| Merchandiser | New SKUs on a reference store | Collection URL, default 0% price |
| Marketplace / sourcing | Back in stock on a target brand | Shop home, schedule twice a day |
| Founder doing it yourself | Watch 1–2 shops without a BI stack | Default input, first run = baseline |
What you get by default: a baseline on the first run, then deltas. Public price and availability — not warehouse quantity or cost.
What data can it extract?
| Category | Fields |
|---|---|
| Change | changeType — baseline, added, removed, price_drop, price_up, out_of_stock, back_in_stock, promo_on, promo_off |
| Shop | hostname, shopUrl, watchKind, watchUrl |
| Product | title, productTitle, sku, handle, variantId, productUrl |
| Price | previousPrice, currentPrice, priceChangePercent, currency |
| List / sale | previousCompareAtPrice, currentCompareAtPrice (Shopify compare-at) |
| Stock signal | previousAvailable, currentAvailable (public available only) |
| When | scrapedAt |
Two events on the same variant can produce two rows (e.g. drop + sold out). Filter changeType in the dataset.
Not extracted (and not invented): Admin inventory, cost, drafts, password-protected shops, non-Shopify sites.
How to watch Shopify competitor catalogs
Three minutes to the first photograph:
- Open the Actor Input tab.
- Paste a public URL, e.g.
https://enky.com/collections/workspace(collection),/products/…, or the shop home. Pages, blogs and Instagram are ignored. - Leave Alert on price moves from (%) at 0 (any price move) or set 5 for real discounts only.
- Leave Send alerts to = Dataset only for the first run.
- Click Start. Read the log: baseline saved.
- Schedule the same input daily. Next runs write change rows. Download JSON / CSV / Excel from the Dataset tab — Changes view hides the baseline.
Slack — Incoming Webhook only
- Slack → Apps → Incoming Webhooks → Add to a channel (e.g.
#competitors). - Copy the URL that starts with
https://hooks.slack.com/services/…. - Set Send alerts to = Slack. Open the Slack section and paste that URL.
Telegram — bot token + chat ID
- Open @BotFather →
/newbot→ copy the token (123456:ABC…). - Message your bot
/start. - Get your numeric chat ID from @userinfobot (a group ID is often negative).
- Set Send alerts to = Telegram. Open the Telegram section and paste token + chat ID.
The first run pings a short “watching — N products” so you know the channel works. Quiet days do not ping. A sale with hundreds of SKUs is summarized: counts by type, top 12 by % move, then “+N more in the dataset (all rows billed)”.
Input
See the Input tab for the live form. Slack and Telegram sit in collapsed sections — open only the channel you picked. Apify cannot hide fields dynamically.
Dataset only (default)
{"startUrls": ["https://enky.com/collections/workspace"],"priceDropPercent": 0,"notifyVia": "none"}
Slack when the catalog moved
{"startUrls": ["https://www.jimmyfairly.com/"],"priceDropPercent": 5,"notifyVia": "slack","slackWebhookUrl": "https://hooks.slack.com/services/T000/B000/XXX"}
Telegram when the catalog moved
{"startUrls": ["https://enky.com/collections/workspace"],"priceDropPercent": 0,"notifyVia": "telegram","telegramBotToken": "123456:ABC…","telegramChatId": "123456789"}
| Parameter | Type | Default | Fill when |
|---|---|---|---|
startUrls | string[] | — | Always. Public collection / product / home URLs |
priceDropPercent | integer | 0 | Always. 0 = any price change; 5 = ±5% or more |
notifyVia | string | none | Always. none · slack · telegram |
slackWebhookUrl | string | — | Slack only (hooks.slack.com/services/…) |
telegramBotToken | string | — | Telegram only (@BotFather) |
telegramChatId | string | — | Telegram only (@userinfobot or group id) |
Choosing Slack without a webhook (or Telegram without token + chat ID) stops the run with a clear error.
Output example
Download from the Dataset tab in JSON, CSV, Excel, or HTML. Changes = spreadsheet of moves. All fields includes baselines.
Price drop
{"changeType": "price_drop","hostname": "www.jimmyfairly.com","shopUrl": "https://www.jimmyfairly.com","watchKind": "shop","title": "Aviator · Black","sku": "AV-BK","previousPrice": 129,"currentPrice": 99,"previousCompareAtPrice": 129,"currentCompareAtPrice": 129,"currency": "EUR","priceChangePercent": -23.26,"previousAvailable": true,"currentAvailable": true,"productUrl": "https://www.jimmyfairly.com/products/aviator","scrapedAt": "2026-08-20T12:00:00.000Z"}
First run (baseline) — one row per watch, then schedule:
{"changeType": "baseline","hostname": "enky.com","watchKind": "collection","watchUrl": "https://enky.com/collections/workspace","productCount": 8,"variantCount": 12}
During the run, Key-Value Store → RUN_LOG is the plain-language progress log. OUTPUT is the count summary.
How much does it cost to watch Shopify catalogs?
Pay-per-event on the Apify Store: you pay for the baseline photograph and then for each change row, not for the full catalog on every schedule.
| Event | FREE tier | When |
|---|---|---|
| Actor start | ~$0.00005 | Every run (× GB RAM, min 1) |
baseline-store | $0.01 | First snapshot of one shop / collection |
catalog-change (primary) | $0.004 | One change vs last snapshot |
Quick examples (event charges, FREE, rounded):
| Scenario | Approx. |
|---|---|
| First run, 1 collection | Start + $0.01 |
| Next day, 12 drops + 3 new SKUs | 15 × $0.004 ≈ $0.06 |
| Quiet day, 0 changes | Start only |
A shop that is not Shopify, or that hides the public product feed, is skipped — not billed as catalog-change. Slack / Telegram pings are not extra PPE events.
Your Apify plan and compute (CU) may add separate platform charges — see Apify pricing and the run usage tab. Set a maximum cost per run in Console if you want a hard cap.
HTTP-only, 512 MB default. Typical one-collection run is seconds to a few minutes, not hours.
Ready-made examples
Pre-configured Actor tasks. The Store Examples tab appears once the Actor is public (publish a task).
| Example | Best for |
|---|---|
| Baseline one competitor shop | First photograph |
| Daily 5% drops on one shop | Promo watch |
| Two Shopify competitors | Small set |
| New SKUs only | Assortment, less price noise |
FAQ
Is this an official Shopify app?
No. It reads the public storefront a shopper can open. It does not use the Admin API.
Do I need a proxy?
No. Public Shopify JSON is not blocked by default. There is no proxy field in the form.
What URLs work?
/collections/{handle}, /products/{handle}, /collections/…/products/…, or the shop home. Locale prefixes like /en-us/ are stripped. /pages/, /blogs/, /cart, and social links are ignored.
Why is the first run empty of “changes”?
That is the baseline. Schedule the next run. Resetting the photograph is API-only (resetBaseline: true) after a huge seasonal swap.
Why fewer products than the website?
Drafts, hidden channels, or shops that disable /products.json (and collection JSON) cannot be listed. The run logs the skip.
Will Slack / Telegram spam me?
Only on baseline confirmation and when at least one change exists. No ping on a quiet schedule. A 400-SKU sale is one message: type counts + top 12 + “+388 more in the dataset (all rows billed)”.
Can I watch several shops in one run?
Yes. Paste several URLs. Each collection / product / home is its own snapshot.
Is it legal?
Only public storefront data is extracted. You are responsible for the shop’s terms and your jurisdiction. This is not Shopify Admin data. Personal data is uncommon here (SKUs and prices); if a product title includes a person’s name, treat it under GDPR like any other public scrape. See Apify on the legality of web scraping.
Local development
cd shopify-catalog-change-monitornpm cinpm testapify run --purge --input-file=./input.json
storage/ is local-only. The named snapshot store is created next to the run storage so a second local run can diff.
Support
Questions, custom watches (password shops, Admin, extra fields), or a private Slack format: corentin@outreacher.fr. Use the Issues tab on the Actor page for bugs.
Programmatic runs: API tab on the Actor (same JSON as Input).
Ready? Paste a collection URL, leave alerts on Dataset only, click Start, then schedule daily — add Slack or Telegram when the baseline looks right.