Web Scraping for Price Monitoring: Build an E-Commerce Price Tracker (2026)
Price monitoring is one of the highest-ROI applications of web scraping. Retailers, brands, and e-commerce teams use it to:
- Track competitor pricing in real time
- Automatically match or undercut competitor prices
- Identify price drops for affiliate marketing alerts
- Monitor MAP (Minimum Advertised Price) compliance
This guide builds a complete price tracker: scraping with Apify, storage in a database, and alerting via Make.com.
Architecture Overview
[Apify Actor: Scrape product prices]
↓ (runs on schedule)
[Apify Dataset: Store raw data]
↓ (API webhook on completion)
[Make.com: Receive webhook, process data]
↓
[PostgreSQL/Airtable: Store time-series prices]
↓ (check price change > threshold)
[Slack/Email: Alert team on price change]
Step 1: Define Your Products to Track
Create a product list with URLs:
[
{
"product": "Sony WH-1000XM5",
"sku": "B09K3ZXSGH",
"competitors": [
"https://www.amazon.com/dp/B09K3ZXSGH",
"https://www.bestbuy.com/site/6517780.p",
"https://www.walmart.com/ip/123456789"
]
}
]
Step 2: Scrape Prices with Apify
Use Apify to scrape product pages. Either use a pre-built Actor (Amazon, Best Buy, etc.) or write a custom CheerioCrawler:
import { Actor } from 'apify';
import { CheerioCrawler } from 'crawlee';
await Actor.init();
const { products } = await Actor.getInput();
const urls = products.flatMap(p =>
p.competitors.map(url => ({ url, userData: { product: p.product, sku: p.sku } }))
);
const crawler = new CheerioCrawler({
async requestHandler({ $, request }) {
const { product, sku } = request.userData;
// Generic price extraction — adjust selectors per site
const priceText = (
$('[data-testid="price"]').first().text() ||
$('.price').first().text() ||
$('[itemprop="price"]').first().attr('content') ||
''
).replace(/[^0-9.]/g, '');
const price = parseFloat(priceText) || null;
await Actor.pushData({
product,
sku,
url: request.url,
price,
currency: 'USD',
scraped_at: new Date().toISOString(),
});
},
});
await crawler.run(urls);
await Actor.exit();
Step 3: Schedule Daily Runs
In Apify Console → Schedules → New:
- Cron:
0 8 * * *(8 AM UTC daily) - Actor: your price monitor Actor
- Input: your product list
- Webhook: trigger Make.com on completion
Step 4: Store History in a Database
Use Apify's webhook to push data to Make.com, then to Airtable or PostgreSQL:
Make.com scenario:
- Trigger: HTTP Webhook (from Apify)
- HTTP: GET
https://api.apify.com/v2/datasets/%7BdatasetId%7D/items?fpr=use-apify - Iterator: Process each price record
- Airtable: Create record (product, price, date, URL)
- Filter: Check
price < previous_price * 0.95(>5% drop) - Slack: Send alert if price drop detected
// Slack alert message
"Price drop alert: {product} is now ${price} on {url} (-{change}% from yesterday)"
Step 5: Visualize Price Trends
With historical data in Airtable or PostgreSQL, build a simple price chart:
import pandas as pd
import matplotlib.pyplot as plt
# Load from database
df = pd.read_sql("SELECT product, price, scraped_at FROM prices WHERE sku = 'B09K3ZXSGH'", conn)
df['scraped_at'] = pd.to_datetime(df['scraped_at'])
# Plot price over time by source
for url, group in df.groupby('url'):
plt.plot(group['scraped_at'], group['price'], label=url.split('/')[2])
plt.title('Price History: Sony WH-1000XM5')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.savefig('price_chart.png')
Cost Estimate
| Scale | Pages/day | Apify cost/month | Total |
|---|---|---|---|
| 10 products × 3 sites | 30 | ~$1 | Minimal |
| 100 products × 5 sites | 500 | ~$3–5 | Low |
| 1,000 products × 5 sites | 5,000 | ~$30–50 | Medium |
| 10,000 products | 50,000 | ~$300–500 | Use Apify Scale plan |
For Amazon specifically, proxy costs are higher due to anti-bot measures. Use Apify's residential proxies which are included in the platform subscription.
