HOW WE BUILT A BOT THAT TRACKS PRICE CHANGES ON AN E-COMMERCE SITE IN 15 MINUTES
Difference: A 3.2KB raw payload parser instead of a 120MB Chromium container.
HOW WE BUILT A BOT THAT TRACKS PRICE CHANGES ON AN E-COMMERCE SITE IN 15 MINUTES

Our journey to a zero-maintenance price tracker built on a single DOM hash check and an instant webhook, with no heavyweight headless browsers and no SaaS dashboards costing hundreds of dollars.
The Problem: Missing Price Changes Costs Real Revenue
In retail and e-commerce, hourly and even minute-by-minute price updates move sales volume directly. In the e-commerce operation we looked at, competitors' promotions were being noticed 40 minutes late on average. And when we surveyed the price-tracking SaaS tools on the market, the picture was a familiar one:
- Bloated cost: Licence models asking $149 a month to watch just 50 SKUs.
- Needless weight: Clunky architectures that spin up a full headless Chrome in the background just to read a single number.
- Late alerts: Sync loops that run every 6 hours instead of every 15 minutes.
“Watching only the relevant DOM node of the page, instead of running heavyweight browser engines, cut server costs by 98%.”
Architecture: A Single-Node DOM Watcher Instead of a Headless Browser
90% of the target sites render their product details with static SSR (Server-Side Rendering). The price tag sits at a known place in the DOM hierarchy: span.price__current-value. Rendering the whole page, fetching the images and executing the JavaScript is a pure waste of resources.
We built a micro-pipeline that downloads only the raw HTML stream (24KB of compressed data on average), parses the relevant selector and keeps a SHA-256 cryptographic digest (hash) of the resulting text in a local key-value table. The webhook fires the millisecond the hash changes.
Code: A Simple Webhook and Hash Check
# Incapon Micro-Crawler v1.0.4
async def check_price_diff(target_url, selector, cached_hash):
html = await fetch_lightweight(target_url)
node = html.select_one(selector)
if not node:
return "Node not found"
current_val = node.text.strip()
element_hash = sha256(current_val.encode("utf-8")).hexdigest()
if element_hash != cached_hash:
await webhook.send(
payload={"event": "price_drop", "value": current_val}
)
return element_hash
return cached_hash
Cron (15 min)
Cloudflare Worker
Edge Lambda
0.08 s execution
Slack / Webhook
Instant Alert
Unit Cost: Why Did We Spend Only $0.18?
At the heart of Incapon's craft philosophy lies unit cost transparency. If a piece of software charges you while it is not running, there is an inefficiency hiding in its architecture.
| Line Item | Usage | Amount |
|---|---|---|
| Edge Worker Invocations | 43,200 Requests / Month | $0.00 (Free Tier) |
| KV Hash Store | 250 Records (15KB) | $0.00 |
| Outbound Bandwidth | 1.03 GB Total Download | $0.18 |
| TOTAL MONTHLY OPERATING BILL | $0.18 |
Building and launching this system took exactly 15 minutes. Within the first 48 hours it caught a competitor's 20% flash sale, started at 03:00 at night, within a minute, and let the company tune its catalogue price in response.
NEXT POSTS
Paying only the cost instead of SaaS subscriptions: Unit cost transparency
Extracting data from PDF invoices: A guide to combining LLMs and regex
Got a Process Like This Too?
Tell us about the tedious manual task that costs your team at least 30 minutes every day; we will design a working in-browser micro tool for it in 48 hours.