# Black Friday Price Tracker: Watch 2026 Prices Daily

> Build a Black Friday 2026 price tracker for Amazon, Walmart and Target: a product watchlist, an October baseline, a schedule to Cyber Monday, and export.

- URL: https://datatooly.xyz/guides/black-friday-price-tracker/
- Author: Omar Eldeeb (https://datatooly.xyz/about/)
- Published: 2026-10-20
- Updated: 2026-10-20
- Free tool: [E-commerce price tracker — scrape product prices, stock and variants](https://datatooly.xyz/ecommerce-price-tracker/)
- Tags: ecommerce, python, webscraping, datascience

A Black Friday price tracker is a list of product URLs that a scraper checks on a schedule, saving every price it sees. For Black Friday 2026 (Friday, November 27), start the daily baseline by late October, check more often from mid-November, and every few hours from Thanksgiving to Cyber Monday (November 30). Turn on monitor mode so each run flags `price-down`, `price-up` and stock changes.

This guide builds that tracker for the US retailers people watch most, with real input and output from runs on 2026-10-20. It uses [E-commerce Product Scraper Pro](https://apify.com/constructive_calm/ecommerce-product-scraper-pro?fpr=v77kxu), an Apify actor I built, but the plan (what to watch, when to start, how often to check) applies to any tool.

## Which US retailers you can track

The actor's README has a supported-sites matrix. For a US Black Friday watchlist, it comes down to this:

| Retailer | Status in the actor | How it's reached | Traffic fee |
|---|---|---|---|
| Amazon (`amazon.com`) | supported | datacenter | none |
| Walmart (`walmart.com`) | supported | datacenter | none |
| Target (`target.com`) | supported | datacenter (crawler user agent) | none |
| Any Shopify or WooCommerce store (brand stores) | supported | datacenter | none |
| Macy's, Staples, Ulta, Ashley, Meijer | best-effort | varies (Macy's is residential) | per MB where residential |
| Wayfair, Bloomingdale's, Sephora | best-effort | browser | per render + per MB |
| Best Buy, Home Depot, Lowe's, Costco, Kohl's, Nordstrom, eBay, Newegg | **unsupported** | not fetched | none (status row only) |

The big three are all datacenter sites, so a run pays only the start fee and the per-product events. For stores in the unsupported row, the [Google Shopping price comparison guide](https://datatooly.xyz/guides/black-friday-google-shopping-price-comparison/) shows how to see their prices through Google Shopping instead.

## Step 1: build the watchlist

Use product page URLs, not search pages. A search page returns whatever ranks that day, so you can't compare day to day. The short, stable URL forms work best:

- Amazon: `https://www.amazon.com/dp/<ASIN>`
- Walmart: `https://www.walmart.com/ip/<slug>/<item id>`
- Target: `https://www.target.com/p/<slug>/-/A-<TCIN>`

Pick the exact model you'd buy. If you want "a 65-inch TV", pick three or four specific models across retailers rather than a category page.

**Decide the list before you start, and don't edit it mid-season.** Monitor mode stores its comparison state under the exact set of input URLs (and proxy country). Change one URL and the next run starts a fresh baseline in which every product is `new`. If you need to add products later, put them in a second task.

## Step 2: the input

```json
{
  "detailsUrls": [
    { "url": "https://www.amazon.com/dp/B07CMS5Q6P" },
    { "url": "https://www.walmart.com/ip/LEGO-Classic-Medium-Creative-Brick-Box/41004055" },
    { "url": "https://www.target.com/p/lego-star-wars-advent-calendar-2026-75456/-/A-95046358" }
  ],
  "monitorMode": true,
  "onlyChanges": true,
  "maxProductResults": 50
}
```

- `monitorMode` compares every product with the previous run of this list and sets `changeType` to `new`, `price-down`, `price-up`, `back-in-stock`, `out-of-stock`, `changed` or `unchanged`, with `previousPrice`, `priceChange` and `priceChangePct`.
- `onlyChanges` writes only new or changed products. Unchanged ones aren't written and are billed at the lower "product checked" price instead of "product scraped".
- `maxProductResults` is a safety cap. In monitor mode it counts every product checked, unchanged ones included, so set it above your list size.

If you'd rather fill in a form, the free [e-commerce price tracker](https://datatooly.xyz/ecommerce-price-tracker/) page builds this input for you and shows a fixed example of the output (not live prices).

## Step 3: run it once and read the result

This script starts a run, prints what changed, and lists any input that didn't deliver:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

watchlist = [
    "https://www.amazon.com/dp/B07CMS5Q6P",
    "https://www.walmart.com/ip/LEGO-Classic-Medium-Creative-Brick-Box/41004055",
    "https://www.target.com/p/lego-star-wars-advent-calendar-2026-75456/-/A-95046358",
]

run = client.actor("constructive_calm/ecommerce-product-scraper-pro").call(run_input={
    "detailsUrls": [{"url": u} for u in watchlist],
    "monitorMode": True,
    "onlyChanges": True,
    "maxProductResults": 50,
})

# 1. Products that are new or changed since the previous run of this exact list
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f'{row["changeType"]:<14}{row["site"]:<11}{row["price"]:>8} {row["currency"]}  '
          f'was={row["originalPrice"]}  previous={row["previousPrice"]}  {row["name"][:40]}')

# 2. Inputs that did not deliver (delisted, blocked, unsupported): one status row each
status_id = run["storageIds"]["datasets"]["status"]
for s in client.dataset(status_id).iterate_items():
    if s["outcome"] != "ok":
        print("CHECK", s["outcome"], s["errorDescription"], s["inputUrl"])

summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")["value"]
print(summary["statusMessage"])
```

The first run of a list is the baseline, so every product is `new`. Output from 2026-10-20, with one extra Target URL added to show what a delisted product looks like:

```text
new           target        30.99 USD  was=44.99  previous=None  LEGO Star Wars Advent Calendar 2026 7545
new           walmart-us    21.42 USD  was=34.99  previous=None  LEGO Classic Medium Creative Brick Box ,
new           amazon-us     29.99 USD  was=49.99  previous=None  Logitech G305 Lightspeed Wireless Gaming
CHECK not-found The page does not exist (http-404). https://www.target.com/p/apple-airpods-pro-2nd-generation/-/A-85978612
3/4 product(s) delivered, 1 failed. Per-input details: Status dataset / OUTPUT record.
```

Run the three-product list again and nothing is printed except `0/3 product(s) delivered, 3 unchanged (not output).` The run was billed one start event and three "product checked" events.

Two fields matter most for Black Friday. `price` is the price the page shows, as a number. `originalPrice` is the "was" price, only when the page shows one higher than `price`. It's the retailer's claim, not a price history, so don't read `was=49.99` as proof the item ever sold at $49.99. That check is what the baseline is for, and the [fake Black Friday discounts guide](https://datatooly.xyz/guides/spot-fake-black-friday-discounts/) does it with code.

## Step 4: schedule the season

Save the input as a task in the Apify Console, then add schedules. Apify schedules take cron expressions and a timezone, and daylight-saving shifts are handled. With the timezone set to `America/New_York`:

| Window (2026) | Why | Cron | Runs |
|---|---|---|---|
| Oct 21 – Dec 7, daily 07:00 | Baseline, then the post-season rebound | `0 7 * * *` | 48 |
| Nov 13 – Nov 24, extra 19:00 run | Early "Black Friday" events. In 2025 Walmart's first event started Nov 14 and Amazon's Black Friday Week Nov 20 | `0 19 13-24 11 *` | 12 |
| Nov 25 – Nov 30, every 3 hours | Thanksgiving week through Cyber Monday | `0 */3 25-30 11 *` | 48 |

The run counts were checked with a cron parser in that timezone. The hours never collide, which matters: two runs of the same list at the same minute would both compare against the same previous run. Delete the schedules after December 7, or they'll keep running.

2026 deal dates aren't announced yet. In 2025, Walmart published its Black Friday event dates on October 27, so expect announcements from late October and adjust the middle row when they arrive. The [Thanksgiving to Cyber Monday timeline](https://datatooly.xyz/guides/thanksgiving-black-friday-price-drop-timeline/) covers what happened on each day in 2025.

## What it costs

The actor is pay per event, priced by Apify plan tier. From the README's table, for datacenter sites like these three:

| Event | FREE | GOLD |
|---|---|---|
| Actor start (per run, 1 GB) | $0.005 | $0.005 |
| Product scraped (new or changed, written) | $0.0048 | $0.0008 |
| Product checked (unchanged, with `onlyChanges`) | $0.0012 | $0.0002 |

Each run costs the start fee plus one event per product. The cheapest run is one where nothing changed, and the dearest is one where everything did. The real cost is in between, usually near the low end, because most prices don't move on most days.

- **25 products, daily only (48 runs):** FREE 48 × ($0.005 + 25 × $0.0012) = **$1.68** up to 48 × ($0.005 + 25 × $0.0048) = **$6.00**. GOLD $0.48 to $1.20.
- **100 products, all three schedules (108 runs):** FREE 108 × $0.125 = **$13.50** up to 108 × $0.485 = **$52.38**. GOLD 108 × $0.025 = **$2.70** up to 108 × $0.085 = **$9.18**.

Apify's free plan gives $5 of usage every month, no credit card required. The actor has no free trial of its own, so the platform credit is what covers a first test. Set a maximum cost per run in the run options and the actor stops below it.

## Step 5: export the history

Each run has its own dataset, so the price history is spread over many runs. This script collects every product row from a task's successful runs into one CSV:

```python
import csv
import os
import sys
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
TASK_ID = sys.argv[1]            # your saved task's ID or "username~task-name"
FIELDS = ["scrapedAt", "site", "url", "name", "price", "originalPrice",
          "currency", "inStock", "seller", "changeType", "previousPrice"]

runs = client.task(TASK_ID).runs().list(status="SUCCEEDED").items
with open("price_history.csv", "w", newline="", encoding="utf-8") as f:
    out = csv.DictWriter(f, fieldnames=FIELDS, extrasaction="ignore")
    out.writeheader()
    n = 0
    for run in runs:
        for row in client.dataset(run["defaultDatasetId"]).iterate_items():
            if row.get("recordType") == "product":
                out.writerow(row)
                n += 1
print(f"{len(runs)} runs, {n} product rows -> price_history.csv")
```

On our daily test task (three products, monitor mode off) it printed `5 runs, 15 product rows -> price_history.csv`. With `onlyChanges` on, the CSV holds only new and changed rows. A product missing from a run means it was unchanged, so carry its last price forward when you analyse the file. The fake-discount and timeline guides both do this.

For alerts instead of a CSV, the [price drop alerts guide](https://datatooly.xyz/guides/price-drop-alerts-email-slack/) connects the same task to email or Slack.

## Things that will trip you up

- **Delisted and blocked products.** A Black Friday SKU can vanish or redirect. Read the Status dataset (step 3 does), not just the run status: a run can succeed with zero rows.
- **Manual test runs count.** Any run of the exact same URL list becomes the "previous run" for the next one, including a test you start by hand.
- **Member and in-store prices.** The actor sees what a signed-out shopper sees online. Prime-exclusive, Walmart+ early-access and Target Circle prices may not be in `price`, and in-store prices can differ.
- **Multi-packs and variants.** Compare `unitPrice` when a listing switches pack size, and check `variants[]` when the colour you want is priced differently from the default.
- **Lightning-style deals.** A deal that lasts a few hours can fall between two 3-hourly runs. The [Cyber Monday deal tracker guide](https://datatooly.xyz/guides/cyber-monday-deal-tracker/) works through hourly cadence and its cost.

For the whole retail calendar beyond Black Friday week, see the [holiday sales calendar and price tracking guide](https://datatooly.xyz/guides/holiday-sales-calendar-price-tracking/).

*Disclosure: I built the actor and this site. The plan above (watchlist, early baseline, schedule) works with any scraper or a spreadsheet.*

Sources: [E-commerce Product Scraper Pro README](https://apify.com/constructive_calm/ecommerce-product-scraper-pro?fpr=v77kxu) (supported sites, pricing table), [Apify docs: Schedules](https://docs.apify.com/platform/schedules?fpr=v77kxu), [Walmart 2025 Black Friday Deals events announcement](https://corporate.walmart.com/news/2025/10/27/walmart-announces-2025-black-friday-deals-events-wrapped-in-the-magic-of-whoknewville), [Amazon: When is Black Friday 2025](https://www.aboutamazon.com/news/retail/when-is-black-friday-2025).

## Quick answers

### When should I start tracking prices before Black Friday?

At least 30 days before, so by late October for Black Friday on November 27, 2026. You need a month of ordinary prices to judge a sale price against, and several big retailers started Black Friday-branded deals in mid-November in 2025.

### Can I track Black Friday prices on Best Buy, Home Depot or Costco?

Not with this actor: Best Buy, Home Depot, Lowe's, Costco, Kohl's, Nordstrom and eBay are on its unsupported list, so those URLs get a status row and are never billed. Google Shopping results often list offers from those stores, so the Google Shopping mode is the workaround.

### Does a price tracker see Prime-only or Walmart+ early-access prices?

It reads the page a signed-out shopper sees. Member-only prices, such as Prime-exclusive deals or Walmart+ early access, may not appear in the scraped price, so treat them as a separate check.

### How much does a Black Friday price tracker cost to run on Apify?

It's pay per event. A 25-product watchlist checked daily from October 21 to December 7 (48 runs) costs between $1.68 and $6.00 at the FREE-tier prices and $0.48 to $1.20 at GOLD, depending on how many prices change. Apify's free plan includes $5 of usage every month.

## Related guides

- [Retail Sales Calendar 2026-2027: When to Track Prices](https://datatooly.xyz/guides/holiday-sales-calendar-price-tracking/)
- [Amazon Price History Without Keepa: Build Your Own](https://datatooly.xyz/guides/amazon-price-history-without-keepa/)
- [Amazon Price Scraper: Prices by ASIN on Any Marketplace](https://datatooly.xyz/guides/amazon-price-scraper-asin/)
- [Back in Stock Alert Scraper: Products, Sizes, Colours](https://datatooly.xyz/guides/back-in-stock-alert-scraper/)
- [Back to School Price Tracker: Tax Holidays & Laptops](https://datatooly.xyz/guides/back-to-school-price-tracker/)
- [Compare Black Friday Prices Across Stores (Google Shopping)](https://datatooly.xyz/guides/black-friday-google-shopping-price-comparison/)
- [Boxing Day Sales Tracker UK 2026: Prices in GBP](https://datatooly.xyz/guides/boxing-day-sales-price-tracker-uk/)
- [Christmas Price Tracker: When to Buy Gifts Cheapest](https://datatooly.xyz/guides/christmas-price-tracker/)
- [Competitor Price Monitoring: Scraper Setup and Cost](https://datatooly.xyz/guides/competitor-price-monitoring-scraper/)
- [Cyber Monday Price Tracker: Hourly Checks for Nov 30](https://datatooly.xyz/guides/cyber-monday-deal-tracker/)
- [Grocery Price Tracker: Build a Basket Index in Python](https://datatooly.xyz/guides/grocery-price-tracker-scraper/)
- [MAP Monitoring: Find Minimum Advertised Price Violations](https://datatooly.xyz/guides/map-price-monitoring/)
- [Price Drop Alerts to Slack or Email with a Scraper](https://datatooly.xyz/guides/price-drop-alerts-email-slack/)
- [Prime Day Price Tracker: ASINs, Big Deal Days, 2027](https://datatooly.xyz/guides/prime-day-price-tracker/)
- [Ramadan Sale Price Tracker 2027: Noon & Amazon UAE](https://datatooly.xyz/guides/ramadan-eid-sales-price-tracking/)
- [Scrape Product Prices with Python from JSON-LD](https://datatooly.xyz/guides/scrape-product-prices-json-ld-python/)
- [Scrape Product Reviews from Walmart, Target and Amazon](https://datatooly.xyz/guides/scrape-product-reviews-walmart-target-amazon/)
- [Scrape Product Variants: Sizes, Colors and Price per SKU](https://datatooly.xyz/guides/scrape-product-variants-sizes-colors/)
- [Fake Black Friday Deals: Check the Real Discount](https://datatooly.xyz/guides/spot-fake-black-friday-discounts/)
- [Apify E-commerce Scraping Tool Alternative: Same Input](https://datatooly.xyz/guides/switch-from-apify-ecommerce-scraping-tool/)
- [When Do Black Friday Prices Drop? The 2026 Timeline](https://datatooly.xyz/guides/thanksgiving-black-friday-price-drop-timeline/)
- [Walmart and Target Price Scraper: Search and Product Pages](https://datatooly.xyz/guides/walmart-target-price-scraper/)
- [White Friday & 11.11 Tracker: Noon and Amazon UAE Prices](https://datatooly.xyz/guides/white-friday-11-11-noon-amazon-uae-prices/)
- [Shopify products.json Pagination: 250 Limit and the 25,000 Cap](https://datatooly.xyz/guides/shopify-products-json-pagination/)
- [AI Share of Voice: Measure It in ChatGPT and Perplexity](https://datatooly.xyz/guides/ai-share-of-voice-chatgpt-perplexity/)
