Shopify Competitors · Catalog Changes by Store URL avatar

Shopify Competitors · Catalog Changes by Store URL

Pricing

from $2.80 / 1,000 catalog changes

Go to Apify Store
Shopify Competitors · Catalog Changes by Store URL

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

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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 ActorNot this Actor
Deltas vs last runFull catalog dump every time
Public price and availableWarehouse qty, cost, metafields, Admin
Collection / product / home URLsPages, blogs, cart, Instagram (ignored)
Slack or Telegram when it movedA 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 goalSuggested setup
Brand / DTC opsCatch a competitor promo the same day3–10 rival URLs, schedule daily, price 5%
E-com agencyTell a client “what moved overnight”One shop per client, Slack webhook, Changes view
MerchandiserNew SKUs on a reference storeCollection URL, default 0% price
Marketplace / sourcingBack in stock on a target brandShop home, schedule twice a day
Founder doing it yourselfWatch 1–2 shops without a BI stackDefault 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?

CategoryFields
ChangechangeTypebaseline, added, removed, price_drop, price_up, out_of_stock, back_in_stock, promo_on, promo_off
Shophostname, shopUrl, watchKind, watchUrl
Producttitle, productTitle, sku, handle, variantId, productUrl
PricepreviousPrice, currentPrice, priceChangePercent, currency
List / salepreviousCompareAtPrice, currentCompareAtPrice (Shopify compare-at)
Stock signalpreviousAvailable, currentAvailable (public available only)
WhenscrapedAt

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:

  1. Open the Actor Input tab.
  2. Paste a public URL, e.g. https://enky.com/collections/workspace (collection), /products/…, or the shop home. Pages, blogs and Instagram are ignored.
  3. Leave Alert on price moves from (%) at 0 (any price move) or set 5 for real discounts only.
  4. Leave Send alerts to = Dataset only for the first run.
  5. Click Start. Read the log: baseline saved.
  6. 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

  1. Slack → AppsIncoming Webhooks → Add to a channel (e.g. #competitors).
  2. Copy the URL that starts with https://hooks.slack.com/services/….
  3. Set Send alerts to = Slack. Open the Slack section and paste that URL.

Telegram — bot token + chat ID

  1. Open @BotFather/newbot → copy the token (123456:ABC…).
  2. Message your bot /start.
  3. Get your numeric chat ID from @userinfobot (a group ID is often negative).
  4. 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"
}
ParameterTypeDefaultFill when
startUrlsstring[]Always. Public collection / product / home URLs
priceDropPercentinteger0Always. 0 = any price change; 5 = ±5% or more
notifyViastringnoneAlways. none · slack · telegram
slackWebhookUrlstringSlack only (hooks.slack.com/services/…)
telegramBotTokenstringTelegram only (@BotFather)
telegramChatIdstringTelegram 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.

EventFREE tierWhen
Actor start~$0.00005Every run (× GB RAM, min 1)
baseline-store$0.01First snapshot of one shop / collection
catalog-change (primary)$0.004One change vs last snapshot

Quick examples (event charges, FREE, rounded):

ScenarioApprox.
First run, 1 collectionStart + $0.01
Next day, 12 drops + 3 new SKUs15 × $0.004$0.06
Quiet day, 0 changesStart 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).

ExampleBest for
Baseline one competitor shopFirst photograph
Daily 5% drops on one shopPromo watch
Two Shopify competitorsSmall set
New SKUs onlyAssortment, 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.


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-monitor
npm ci
npm test
apify 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.