Skip to main content

Web Scraping for Price Monitoring: Build an E-Commerce Price Tracker (2026)

· 3 min read
Yassine El Haddad
Software Developer & Automation Specialist

I build production AI agents, web scrapers, and automation pipelines. Most of what I publish here comes from the actual problems they run into: proxies that get banned, anti-bot stacks that fingerprint your client, RAG that drifts when the underlying data moves. Stack: Python, TypeScript, Go, FastAPI, LangChain, Crawlee, Playwright, deployed on AWS, GCP, and Cloudflare.

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:

  1. Trigger: HTTP Webhook (from Apify)
  2. HTTP: GET https://api.apify.com/v2/datasets/%7BdatasetId%7D/items?fpr=use-apify
  3. Iterator: Process each price record
  4. Airtable: Create record (product, price, date, URL)
  5. Filter: Check price < previous_price * 0.95 (>5% drop)
  6. Slack: Send alert if price drop detected
// Slack alert message
"Price drop alert: {product} is now ${price} on {url} (-{change}% from yesterday)"

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

ScalePages/dayApify cost/monthTotal
10 products × 3 sites30~$1Minimal
100 products × 5 sites500~$3–5Low
1,000 products × 5 sites5,000~$30–50Medium
10,000 products50,000~$300–500Use 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.

Common mistakes and fixes

Scraped prices include tax in some regions and not others.

Normalize prices in post-processing: always scrape from the same geo-targeted IP (e.g. US residential proxy for US pricing). Store pre-tax prices and apply tax logic in your analysis layer.

Price data appears stale even with daily scraping.

Many e-commerce sites serve cached or CDN responses. Add Cache-Control: no-cache to requests and rotate proxies to avoid getting cached responses per IP.

Price alerts fire too frequently on small fluctuations.

Add a threshold parameter: only alert when price changes by >5% from the rolling 7-day average. Store historical prices in a database to calculate this baseline.