# Compare Black Friday Prices Across Stores (Google Shopping)

> Compare Black Friday prices across stores with Google Shopping: every seller's offer for one product, condition and shipping, automated per keyword.

- URL: https://datatooly.xyz/guides/black-friday-google-shopping-price-comparison/
- 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, google

To compare Black Friday prices across stores, search the exact model on Google Shopping for your country and read every seller's offer for that product: price, condition (new, refurbished or used), delivery and any was-price. Drop refurbished, used and bundle listings first, or the cheapest row is usually not the item you want. To do this for many products, scrape it per keyword and sort.

Google Shopping is the one place where Best Buy, Lowe's, Newegg and independent sellers appear next to Walmart and Target. This guide shows what that view returns, using real runs of [E-commerce Product Scraper Pro](https://apify.com/constructive_calm/ecommerce-product-scraper-pro?fpr=v77kxu)'s Google Shopping mode on 2026-10-18 and 2026-10-20, and the traps in comparing those rows.

## Why Google Shopping for a cross-store comparison

Scraping each store's product pages gives you exact, per-store prices, and the [Black Friday price tracker guide](https://datatooly.xyz/guides/black-friday-price-tracker/) does that for Amazon, Walmart and Target. But several big US electronics and home retailers block scrapers: Best Buy, Home Depot, Lowe's, Costco and Newegg are all on the actor's unsupported list. Google Shopping's seller lists still include many of them. In our Sony WH-1000XM5 runs, the merchants were Best Buy, Sony, Lowe's, Target, Newegg sellers, an eBay seller, Woot, Macy's and others.

The tradeoff: Google's view is a summary of merchants' offers, not the stores' own pages. Use it to find which store is cheapest, then confirm on that store's page.

## The modes

The actor has three working Google Shopping modes:

| `scrapeModeSearchEngine` | What you get | Google requests | Billed per |
|---|---|---|---|
| `Google Listing` | One row per product on the results page: price, merchant, was-price, badge, delivery | 1 per keyword | search-engine request + product row |
| `Products` | The same, plus each product's Google page: description, typical price range, number of offers | 1 + 1 per product | search-engine requests + product row |
| `Sellers` | Every store selling each product: merchant, price, old price, condition, delivery, returns, coupon, offer link | 1 + 1 per product | search-engine requests + seller entry |

`Reviews` isn't available: Google loads reviews in the browser only, so that mode returns an explanatory status row. Other limits from the README: up to 50 keywords per run, one search per keyword in the `countryCode` market (default `us`, with optional `citySearchEngine` and `regionSearchEngine`), and long titles may be cut off (`titleTruncated` tells you). An answer for the wrong country gets one retry, then it's reported as blocked and not billed.

## Every seller for one product

The input for the Sellers mode:

```json
{
  "searchEngineKeyword": "Sony WH-1000XM5",
  "scrapeModeSearchEngine": "Sellers",
  "countryCode": "us",
  "maxSearchEngineProducts": 4,
  "maxSearchEngineSellersPerProduct": 5,
  "maxSearchEngineResults": 20
}
```

This is what it returned on 2026-10-18 (run `FiUR4s8DgTfDEE02e`). Each result row has a `sellers[]` array; here they're flattened, with offer links removed:

| Result | Seller | Price | Was | `condition` | `badge` | Delivery |
|---|---|---|---|---|---|---|
| 1 | Best Buy | $228.00 | $398 | — | — | Free delivery by Tue |
| 1 | Sony | $228.00 | $400 | — | — | Free delivery between Tue – Wed |
| 1 | Lowe's | $299.00 | — | — | — | Free delivery between Oct 19 – 26 |
| 1 | Target | $398.99 | — | — | — | Free delivery between Wed – Sat |
| 2 | Target | $189.99 | — | `refurbished` | Refurbished | Free delivery between Wed – Sat |
| 3 | `Newegg.com - Sybershop` | $279.00 | — | — | — | Free delivery |
| 3 | Electronic Express | $319.30 | $459 | `used` | — | Delivery $0.01 |
| 3 | eBay - (seller name omitted) | $397.37 | — | — | — | Free delivery by Oct 27 |
| 4 | Target | $189.99 | — | `refurbished` | Refurbished | Free delivery by Sat |

Result 1 also carried Google's price insight, `"priceInsight": "Typically $199–$300"`, with `offersCount: 4` and `lowestOfferPrice: 228`. The run billed 4 search-engine requests (one results page and three product pages; result 4 had no product page) and 9 seller entries.

What the table teaches:

- **The cheapest row was refurbished.** Target's $189.99 was "Target Certified Refurbished". The actor moves Google's "Refurbished", "Used" and "Pre-owned" badges out of the merchant name into `badge`, and normalises them into `condition`. Electronic Express's offer was titled "OPEN BOX" and came through as `condition: "used"`.
- **The row price isn't the best offer.** Result 1's headline price was Best Buy at $254.99, but its seller list had Best Buy and Sony at $228. Use `lowestOfferPrice` or the `sellers[]` prices, not the row price.
- **Was-prices are claims.** $398 against a typical range of $199–$300 is a list price. The [fake Black Friday discounts guide](https://datatooly.xyz/guides/spot-fake-black-friday-discounts/) shows how to check a discount against real price history.

## The script

This flattens the seller lists, drops refurbished and used offers, sorts by price, and marks offers whose seller list is incomplete:

```python
import os
from apify_client import ApifyClient

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

run_input = {
    "searchEngineKeyword": "Sony WH-1000XM5",
    "scrapeModeSearchEngine": "Sellers",
    "countryCode": "us",
    "maxSearchEngineProducts": 3,
    "maxSearchEngineSellersPerProduct": 5,
    "maxSearchEngineResults": 15,
}

run = client.actor("constructive_calm/ecommerce-product-scraper-pro").call(run_input=run_input)

offers = []
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row.get("recordType") != "search-result":
        continue
    for s in row["sellers"]:
        offers.append({
            "product": row["title"][:38],
            "catalogId": row.get("catalogId"),
            "seller": s["merchantName"],
            "price": s["price"],
            "was": s["originalPrice"],
            "condition": s["condition"] or "new",
            "shipping": s["shipping"],
            # False = Google's product page didn't load; this is the results card's own offer only
            "complete": row["sellersComplete"],
        })

new_only = sorted((o for o in offers if o["condition"] == "new"), key=lambda o: o["price"])
for o in new_only:
    flag = "" if o["complete"] else "  <- card offer only, seller list incomplete"
    print(f'{o["price"]:>8.2f}  {o["seller"][:24]:<24} was={o["was"]}  {o["shipping"]}  [{o["product"]}]{flag}')
incomplete = {o["product"] for o in offers if o["complete"] is False}
print(len(offers), "offers,", len(offers) - len(new_only), "refurbished/used dropped,",
      len(incomplete), "product(s) with an incomplete seller list")
```

Output on 2026-10-20 (run `MBIjWDijo2XqByL8G`; `pip install apify-client`, `APIFY_TOKEN` set):

```text
  228.00  Best Buy                 was=None  Free delivery by Thu  [Sony WH-1000XM5 Wireless Noise Canceli]
  228.00  Sony                     was=None  Free delivery between Wed - Thu  [Sony WH-1000XM5 Wireless Noise Canceli]
  299.00  Lowe's                   was=None  Free delivery between Oct 21 – 28  [Sony WH-1000XM5 Wireless Noise Canceli]
  398.99  Target                   was=None  Free delivery between Thu - Mon  [Sony WH-1000XM5 Wireless Noise Canceli]
7 offers, 3 refurbished/used dropped, 0 product(s) with an incomplete seller list
```

The three dropped offers were two Target Certified Refurbished listings at $189.99 and a pre-owned listing from `mercari.com` at $125.90, the cheapest offer in the run. The run billed 3 search-engine requests and 7 sellers.

### When Google's product page doesn't load

Sellers mode makes one extra Google request per product, for the product page that lists the stores. Google sometimes leaves that page hanging. When it does, the row still arrives: its only seller is the offer from the results card (the store and price Google showed on the results page), and `sellersComplete` is `false`. That row is billed as one seller, and the failed product page isn't billed. After 3 product-page failures in a row, the actor pauses product pages and continues with card offers, trying a product page again every 10 products and on each new keyword. The keyword's status row counts the products that came from the card.

In the actor's cloud tests, most runs had complete seller lists, like the run above, and it took 1.0–1.5 Google attempts per billed request. A `sellersComplete: false` row is a real offer, but a cheaper store may be missing from it. The script marks those offers; to leave them out of the comparison, filter with `[o for o in new_only if o["complete"] is not False]`. A result that is one store's own offer with no Google product page has `sellersComplete: true`, because that single store is the full list.

## The quick version: one request per keyword

`Google Listing` reads only the results page, so it's one Google request per keyword. Same script shape, different mode:

```python
import os
from apify_client import ApifyClient

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

run = client.actor("constructive_calm/ecommerce-product-scraper-pro").call(run_input={
    "searchEngineKeyword": "Sony WH-1000XM5",
    "scrapeModeSearchEngine": "Google Listing",
    "countryCode": "us",
    "maxSearchEngineProducts": 10,
})

rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for r in sorted(rows, key=lambda r: r["price"] or 1e9):
    print(f'{r["price"]:>8.2f}  {str(r["merchant"])[:22]:<22} was={r["originalPrice"]}  '
          f'badge={r["badge"]}  condition={r["condition"]}  {r["title"][:40]}')
```

Output on 2026-10-20:

```text
  184.99  Entrepreneur           was=None  badge=LOW PRICE  condition=None  Sony WH-1000XM5 Wireless Headphones
  189.99  Target                 was=None  badge=Refurbished  condition=refurbished  Sony Wh-1000XM5 Noise-Canceling Wireless
  189.99  Target                 was=None  badge=Refurbished  condition=refurbished  Refurbished Sony WH-1000XM5 Bluetooth Wi
  227.99  Woot                   was=None  badge=Pre-owned  condition=used  Sony WH-1000XM5 Wireless Active Noise Ca
  269.99  Best Buy               was=398  badge=32% OFF  condition=None  Sony WH-1000XM5 Wireless Noise Canceling
  280.99  Best Buy               was=None  badge=None  condition=None  Sony WH 1000XM5 Noise Canceling Wireless
  284.00  Gadgets Online NZ      was=None  badge=None  condition=None  Sony WH-1000XM5 Wireless Noise-Canceling
  298.00  ListenUp               was=398  badge=25% OFF  condition=None  Sony WH-1000XM5 Wireless Noise Canceling
  339.99  Best Buy               was=400  badge=15% OFF  condition=None  Sony WH-1000XM5 Wireless Noise Canceling
  399.99  Macy's                 was=None  badge=None  condition=None  Sony WH-1000XM5 Wireless Noise Canceling
```

That run billed one search request and ten product rows. Of the ten rows, three were refurbished or pre-owned, and three of the Best Buy and Macy's rows were bundles: the full titles say "Pro Stand Kit", "with Truly Wireless Earbuds Bundle" and "JBL T110 in Ear Headphones". The cheapest new row came from a merchant named "Entrepreneur" with a "LOW PRICE" badge. Check an unfamiliar seller before you trust its price.

The Best Buy row with Google catalog ID `17755277695162489284` was $254.99 on October 18 and $269.99 on October 20, against the same $398 was-price. To track a product on Google Shopping over time, join snapshots on `catalogId` (or `itemKey`), not on the title.

## What it costs

From the README's pay-per-event table, using the two real runs above:

| Run | FREE | GOLD |
|---|---|---|
| Listing, 1 keyword, 10 rows | $0.005 + $0.0045 + 10 × $0.0048 = **$0.0575** | $0.005 + $0.0035 + 10 × $0.0008 = **$0.0165** |
| Sellers, 1 keyword, 4 requests, 9 sellers | $0.005 + 4 × $0.0045 + 9 × $0.0024 = **$0.0446** | $0.005 + 4 × $0.0035 + 9 × $0.0008 = **$0.0262** |

The $0.005 is the per-run start fee. Several keywords in one run share it: put up to 50 keywords, one per line, in `searchEngineKeyword`. Failed or blocked Google requests aren't billed. Apify's free plan includes $5 of usage every month, and the actor has no free trial of its own.

## A checklist for a fair comparison

1. **Search the model number**, not a description. "WH-1000XM5" beats "Sony noise cancelling headphones", which returns the XM4, XM6 and accessories.
2. **Filter `condition`** to new (null) and check `badge` for "Refurbished", "Pre-owned" and similar labels.
3. **Drop bundles** by title: "bundle", "kit", "with", a second product name.
4. **Add delivery.** `shipping` / `delivery` is text ("Free delivery", "Delivery $0.01"), so parse fees before you compare.
5. **Expect tax at checkout.** US offer prices generally don't include sales tax.
6. **Pin the market.** Set `countryCode` (and optionally city and region). Prices and stores differ by country.
7. **Confirm on the store's page** through the offer link before you buy. Google's offer data can lag a store's live price, especially on Black Friday when prices change several times a day.
8. **Check `sellersComplete`** in Sellers mode. A `false` row carries only the results-card offer, so don't call its store the cheapest without a complete list.

For Black Friday week, run the same keywords every few hours from Thanksgiving to Cyber Monday; the [Cyber Monday deal tracker guide](https://datatooly.xyz/guides/cyber-monday-deal-tracker/) works out schedule costs. For tracking competitors' prices all year, see [competitor price monitoring](https://datatooly.xyz/guides/competitor-price-monitoring-scraper/), and for the whole sales calendar, the [holiday sales calendar and price tracking guide](https://datatooly.xyz/guides/holiday-sales-calendar-price-tracking/). The free [e-commerce price tracker](https://datatooly.xyz/ecommerce-price-tracker/) page builds input for store pages.

*Disclosure: I built the actor and this site. The comparison checklist works the same if you read Google Shopping by hand.*

Sources: [E-commerce Product Scraper Pro README](https://apify.com/constructive_calm/ecommerce-product-scraper-pro?fpr=v77kxu) (modes, limits, pricing), runs `FiUR4s8DgTfDEE02e` (2026-10-18), `G6rHaICs9Fc0Kd2MI` and `MBIjWDijo2XqByL8G` (2026-10-20, build 0.1.16) of that actor.

## Quick answers

### How do I compare Black Friday prices across stores?

Search the exact model number on Google Shopping for your country, open the product's list of stores, and compare the offers for new items, including delivery. To do it for many products, scrape the same view per keyword and filter out refurbished, used and bundle listings before sorting by price.

### Why is a Google Shopping price lower than the store's own website?

Often it isn't the same item: the cheapest rows are frequently refurbished, open-box, pre-owned or a different bundle. Google's offer data can also lag the store's page, so check the offer link before you buy.

### Can I see Best Buy or Home Depot prices if a scraper can't reach their sites?

Through Google Shopping, often yes. In our runs, Google Shopping listed Best Buy, Lowe's, Newegg and eBay sellers alongside Target and Walmart, even though E-commerce Product Scraper Pro doesn't scrape those stores' own pages.

### Does Google Shopping show prices including tax and shipping?

It shows delivery as a separate note, such as "Free delivery" or a fee, and the offer price usually doesn't include US sales tax, which depends on where you live. Compare price plus delivery, and expect tax at checkout.

## 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/)
- [Black Friday Price Tracker: Watch 2026 Prices Daily](https://datatooly.xyz/guides/black-friday-price-tracker/)
- [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/)
