Black Friday real-discount check sheet: weekly price snapshots from 28 October, lowest price seen, "was" price and real cut per product
What you get: one Google Sheet that tells you, on Black Friday (27 November 2026), whether each "sale" price is really lower than what the shop charged before. One row per product page: the price at each weekly snapshot from late October, the lowest price you saw, the Black Friday price, the shop's own "was" price, the real cut against your lowest snapshot, the claimed cut against the "was" price, and a Verdict column (real cut / real cut smaller than claimed / not lower than before / not read). Formulas are below. The example rows are made up.
The finished sheet
watch tab (example rows are made up)
| Product page | 28 Oct | 4 Nov | 11 Nov | 18 Nov | 25 Nov | Lowest seen | 27 Nov | "Was" shown | Real cut | Claimed cut | Verdict |
|---|---|---|---|---|---|---|---|---|---|---|---|
| example-shop.com/products/desk-lamp | 2,499 | 2,499 | 2,999 | 2,999 | 2,999 | 2,499 | 2,399 | 2,999 | 4% | 20% | real cut smaller than claimed |
| sample-store.in/product/kettle | 1,800 | 1,800 | 1,800 | 1,800 | 1,800 | 1,800 | 1,440 | 1,800 | 20% | 20% | real cut |
| demo-goods.com/products/backpack | 3,200 | 3,600 | 3,600 | 3,600 | 3,600 | 3,200 | 3,240 | 3,600 | -1% | 10% | not lower than before |
Who this is for
- Deal bloggers and newsletter writers who want to list only Black Friday offers that are lower than the price a few weeks earlier.
- Shoppers watching a handful of products in independent online shops before buying.
- Small shop owners selling into the EU who want to check their own sale labels against the 30-day prior-price rule before Black Friday.
A "was" price on a sale label is whatever the shop chose to show. The only way to know what it charged before is to have written the price down before. This sheet does that once a week, so the check on 27 November takes a minute.
Start by 28 October
Black Friday 2026 falls on Friday 27 November. Thirty days before that is Wednesday 28 October, so take your first snapshot on or before that day, then one a week: 28 Oct, 4 Nov, 11 Nov, 18 Nov, 25 Nov, and a last one on 27 Nov. Weekly snapshots can miss a short low price between two runs, so "Lowest seen" is the lowest price you recorded, not a full price history. Take snapshots more often if that matters to you.
Step 1: list the product pages (tab watch)
Put one product page URL per row in column A, exactly as the scraper writes it in its url field (open one result once to see the form, usually https://shop-domain/products/handle for Shopify). In row 1, from column B to F, type the names of the snapshot tabs you will create: s1028, s1104, s1111, s1118, s1125. In H1 type s1127.
Step 2: take a snapshot
With the product scraper
Open the E-commerce Product Data scraper on the Apify Store. It reads independent Shopify, WooCommerce and schema.org shops (not marketplaces), checks each shop's robots.txt and terms, and skips shops that forbid scraping. Give it the shops, not single products, with this input (JSON tab):
{
"startUrls": [
{ "url": "https://example-shop.com" },
{ "url": "https://sample-store.in" }
],
"maxProductsPerShop": 500,
"maxListingPages": 20,
"includeDescription": false
}
- Use the same input every week, so every snapshot covers the same products.
maxProductsPerShopdefaults to 100. Raise it if a shop has more products than that, or the product you watch may be left out.- Keep
includeDescriptionoff: you only need prices, and the CSV stays small.
When the run finishes, export the dataset as CSV, then in your sheet use File → Import → Upload, "Insert new sheet", and name the tab after the date, such as s1028. Keep the headers. The columns you need are url, price, compareAtPrice, onSale and inStock; the formulas find them by header name, so column order does not matter.
Free, without the scraper
Make the snapshot tab by hand with the headers url, price and compareAtPrice, open each product page on the day, and type what you see. Slower, but the same formulas work.
Step 3: the price formulas
In B2 (copy across to F2, then into H2), read the price of the product in A2 from the tab named in row 1:
=IFERROR(INDEX(INDIRECT("'"&B$1&"'!A:ZZ"),
MATCH($A2, INDEX(INDIRECT("'"&B$1&"'!A:ZZ"), 0, MATCH("url", INDIRECT("'"&B$1&"'!1:1"), 0)), 0),
MATCH("price", INDIRECT("'"&B$1&"'!1:1"), 0)), "")
A blank cell means the product was not in that snapshot (sold out and hidden, renamed, or the tab is not imported yet). Lowest seen in G2:
=IF(COUNT(B2:F2)=0, "", MIN(B2:F2))
"Was" shown in I2 is the same formula as H2 with "compareAtPrice" in place of "price": it is the crossed-out price the shop displays on Black Friday.
Step 4: real cut, claimed cut and Verdict
J2 real cut: =IF(AND(ISNUMBER(G2), ISNUMBER(H2)), 1-H2/G2, "") K2 claimed cut: =IF(AND(ISNUMBER(I2), ISNUMBER(H2)), 1-H2/I2, "")
Format J and K as percent. Verdict in L2:
=IF(A2="", "", IF(NOT(ISNUMBER(H2)), "not read", IF(NOT(ISNUMBER(G2)), "no earlier price", IF(H2>=G2, "not lower than before", IF(AND(ISNUMBER(K2), K2-J2>0.05), "real cut smaller than claimed", "real cut")))))
The 0.05 means a claimed cut more than five percentage points bigger than the real one is flagged; change it to suit. Filter column L to real cut for the offers worth sharing or buying.
What the rule says in the EU
Since 28 May 2022, Article 6a of the EU Price Indication Directive (98/6/EC, added by Directive (EU) 2019/2161) says that any announcement of a price reduction must show the prior price, and that the prior price is the lowest price the trader applied in a period of at least 30 days before the reduction. EU countries may set different rules for goods that spoil quickly, for goods on the market for less than 30 days, and for reductions that grow step by step. Each country enforces its own version, so a shop owner should check the national rules where it sells. This sheet is a record of what you saw, not a legal finding.
Check before you publish or buy
- The first snapshot is dated on or before 28 October, and every snapshot used the same input.
- The URL in column A matches the scraper's
urlfield exactly (no tracking parameters). - For a product with variants, you compared the same size or colour: each variant's own price is in the
variants/0/price,variants/1/price... columns, so use that header in the formula instead ofprice. - Blank cells are explained (not imported yet, sold out, or renamed) before you call a deal fake.
- Your post says "lowest price we recorded since 28 October", not "lowest price ever".
Partner programme opening soon
Partner programme opening soon: join the free waitlist. Planned terms are 50% of each referred sale (75% once you have 5+ paying customers), single level, paid through Gumroad only from revenue received.
Sources
- Product scraper input fields (
startUrls,maxProductsPerShopdefault 100,maxListingPages,includeDescription) and output fields (url,shop,title,price,compareAtPrice,currency,onSale,inStock,variants): Apify Store page (input schema and README of build 0.1.3) - Directive (EU) 2019/2161, Article 2, inserting Article 6a into Directive 98/6/EC (prior price = lowest price in at least the 30 days before a reduction; applies from 28 May 2022): EUR-Lex
Related
- Gift guide price and stock freshness sheet for Black Friday
- Gift guide product shortlist sheet
- 30-day lowest price log for your own shop (EU sale labels)
- Competitor store discount sheet for Black Friday
- Competitor Shopify price sheet
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.