Build a no-code price-drop alert with Apify + n8n for any e-commerce site
In one line: Most e-commerce sites skip an official “price dropped” alert, and price-comparison sites don’t guarantee they track your exact SKU. Point an Apify product-search actor at your item on a schedule, let n8n’s Compare Datasets node diff today’s price against yesterday’s, and ping Slack the moment it falls — set up once, and you never have to open a tab to check prices again.
Why schedule your own scrape instead of waiting on a price-comparison site
If you want to know the moment a specific product drops in price, your realistic options are limited: check manually (easy to forget, easy to miss a short-lived flash sale), subscribe to a price-comparison site (convenient, but it only tracks whatever products and stores it has already indexed — not necessarily the exact one you want, and not necessarily in real time), or scrape it yourself. None of Taiwan’s three biggest general e-commerce sites — PChome 24h, momo, and Ruten — document a price-alert API or webhook. Their public pages only show the price at the moment you load them; knowing “yesterday vs. today” means recording at least two scrapes and diffing them yourself.
That’s the gap an Apify actor plus n8n fills: the actor turns “open the page, parse the price” into an API call; n8n glues “run on a schedule, compare to last time, alert on a drop” together with drag-and-drop nodes. Once it’s wired up, you stop manually checking. (The same “schedule → Apify → decide → notify” shape also works for social-listening alerts — see building a no-code forum sentiment pipeline.)
The three options, compared
| Manual price-checking | Price-comparison site | Scheduled scrape (this guide) | |
|---|---|---|---|
| Product coverage | Only what you remember to check | Whatever the site has indexed | Any keyword or product ID you specify |
| Multi-store comparison | Switch tabs yourself | Usually already merged | One schedule pulls PChome, momo, and Ruten together |
| Alerts on a drop | None — you have to remember to look | Some sites offer subscriptions | Custom threshold via an n8n IF node |
| Data ownership | None | Data lives on their platform | Raw JSON is yours; keep your own price history |
| Setup cost | None, but costs your time | Create an account | ~20–30 minutes to wire the n8n pipeline once |
Here’s how to build the “scheduled scrape” column.
What you’ll build
Schedule Trigger ──▶ Apify: run pchome-scraper / momo-scraper / ruten-scraper (search by keyword)
(daily) │
▼
Normalize fields (map Ruten's item_id onto product_id)
│
▼
Compare Datasets: "today" vs. "yesterday" (stored in a Google Sheet)
│
▼
Rows where price dropped ──▶ Slack alert
│
▼
Write today's prices back to the sheet as tomorrow's baseline
What you need
- An Apify account — free to start, pay-per-item after the free credits.
- n8n — self-host it for free (fair-code license), or use n8n Cloud, which has a free trial on its paid tiers.
- A Google Sheet to hold “the price we saw last time.”
Step 1 — Schedule Trigger
Add a Schedule Trigger node set to run once a day (say, 9am). Most sale cycles run in day-sized windows, so daily is usually enough; tighten it if you’re chasing a flash sale.
Step 2 — Pull today’s prices with the Apify node
Install the official Apify node (@apify/n8n-nodes-apify, maintained by Apify), and add your Apify API token as its credential (Apify Console → Settings → API & Integrations).
Add an Apify node, choose “Run Actor and get dataset items,” and pick pchome-scraper. Its input schema takes something like:
{
"mode": "search",
"keywords": ["Dyson V8"],
"priceMax": 500,
"maxItems": 20
}
Add two more Apify nodes the same way for momo-scraper (input shape is the same; mode is fixed to "search" on v1.0) and ruten-scraper (also mode: "search"), using the same keyword, then a Merge node to combine all three streams.
⚠️ Field names don’t line up.
pchome-scraperandmomo-scraperkey each product asproduct_id, butruten-scraperusesitem_id— the three actors were built independently and their fields were never forced to match. Add an Edit Fields (Set) node before the merge to copyitem_idintoproduct_id, or the next step won’t recognize them as the same product.
Step 3 — Read back yesterday’s prices
Add a Google Sheets node (operation: Get rows) to read the sheet where you’re storing “the price we saw last time” (it needs at least product_id, price, title, and product_url columns). This is the other side of the comparison.
Step 4 — Diff today vs. yesterday with Compare Datasets
Add n8n’s built-in Compare Datasets node: Input A is today’s merged data from Step 2, Input B is yesterday’s data from Step 3, and match them on product_id. The node splits its output into four branches — items only in A, only in B, unchanged in both, and different between the two — you want the “different” branch, which holds every product whose price actually moved.
Chain an IF node after it to keep only rows where today’s price is lower than yesterday’s (optionally require at least a 5% drop, to filter out noise).
Step 5 — Alert, then save today’s prices as tomorrow’s baseline
Send the rows that pass the IF node to a Slack node, with the message including the product title, old price, new price, percent drop, and the product_url. Whether or not anything dropped, add a Google Sheets node (operation: Update or append) to overwrite the sheet with today’s full price snapshot — that’s what tomorrow’s run needs to have a “yesterday” to compare against.
No dedicated node? Call the API directly with HTTP Request
If you’d rather skip the community node, call Apify’s REST API from n8n’s generic HTTP Request node instead:
POST https://api.apify.com/v2/acts/claude_code_reviewer~pchome-scraper/run-sync-get-dataset-items
Authorization: Bearer <YOUR_APIFY_TOKEN>
Content-Type: application/json
{ "mode": "search", "keywords": ["Dyson V8"], "priceMax": 500, "maxItems": 20 }
One limit worth knowing: this synchronous endpoint’s run must finish within 300 seconds, or it returns HTTP 408 — keep maxItems reasonable per call, or switch to the async start-run-then-fetch-items pattern for large pulls.
What it actually costs
All three actors are billed pay-per-event (PPE). Per the official docs, the platform automatically charges a one-time apify-actor-start event ($0.005) on every run — you never charge that one yourself. Data charges vary by mode, and the live pricing table is on each actor’s Store page:
| Event | Price | Applies to |
|---|---|---|
search-listing (per search result) | $0.002 | pchome-scraper, momo-scraper, ruten-scraper |
product-detail (per product detail page) | $0.008 | pchome-scraper, ruten-scraper (momo-scraper is search-only for now) |
For “3 keywords across 3 stores, 20 results per keyword, once a day,” that’s roughly 180 search results a day — about $0.36/day in search-listing charges, plus about $0.015/day across the three actors’ apify-actor-start events. Run it for a month and the total lands in the single digits to low tens of dollars, well under any paid price-tracking subscription. n8n is free self-hosted, Google Sheets is free, so nearly all of the real cost is the Apify side. Plug in your own keyword count and volume with the Apify cost calculator to estimate your own number.
Does this pattern hold outside Taiwan e-commerce?
Yes — the actor is the only thing that changes. The same Schedule → Apify → Compare Datasets → Slack shape works with any e-commerce actor Apify has that supports keyword search, including FairPrice for Singapore grocery SKUs. Swap the Apify node’s actor, re-check its input schema for the field names it actually uses, and the rest of the pipeline — dedupe, compare, alert — stays the same.
Three ways to start
From least effort to most freedom
Further reading
- Build a no-code forum sentiment pipeline with Apify + n8n + GPT: the same Schedule → Apify → decide → notify shape, applied to social-listening alerts instead of price drops.
- Hong Kong Rental Agent Gone Silent?: a different domain, same trick — schedule a scraper and diff its output across runs, this time to catch a stale listing instead of a price change.
FAQ
Do PChome, momo, and Ruten really have no official price-drop alert? Their public product pages only show the current price — there’s no documented price-history or drop-alert API on any of the three. Catching a change means recording at least two scrapes yourself and comparing them, which is exactly what this pipeline automates.
Does this only work for Taiwan e-commerce sites? No — swap the Apify actor. The same Schedule to Apify to Compare Datasets to Slack shape works for any e-commerce site Apify has a search-mode scraper for, including Singapore’s FairPrice groceries.
Why doesn’t momo-scraper have a product-detail mode? As of v1.0, momo-scraper only supports search mode — its input schema doesn’t expose a detail mode yet. The price, original price, and discount fields returned by search mode are already enough for the drop comparison in this pipeline.
Do all three actors use the same product ID field? No. pchome-scraper and momo-scraper use product_id, but ruten-scraper uses item_id (see the field-mapping note in Step 2). Align the field names before merging, or the Compare Datasets node won’t match the same product across runs.
Is this legal to scrape? We only scrape public product pages, never login-walled data. Check the terms of service and local regulations that apply to your own use case before running this at scale.
Chad runs 40+ published Apify actors, including the pchome-scraper, momo-scraper, and ruten-scraper used here. Every pricing figure above comes straight from each actor’s Store page and Apify’s own pay-per-event docs; n8n node behavior and limits link to n8n’s and Apify’s official documentation.