Are the prices in your buying guides still right? A Google Sheet that checks every recommended product's price and stock before Black Friday
What you get: one Google Sheet that tells you, before Black Friday, which product picks in your buying guides and gift guides are out of date. The links tab has one row per product you recommend: the article it sits in, the product page, the price you wrote, the price on the shop today, how far it moved, whether it is in stock, and a Fix column that says exactly what to do: ok, update price, sold out: swap pick, not found: check link or on sale now: mention it. The articles tab counts the fixes per article, so you edit the posts with the most problems first. Formulas are below. The example rows are made up.
The finished sheet
links tab (example rows are made up)
| Article | Product page | Price in article | Price today | Was (compare-at) | Change | In stock | Fix |
|---|---|---|---|---|---|---|---|
| Best oak chopping boards | https://shop-a.example/products/oak-board-large | 45.00 | 45.00 | 0% | TRUE | ok | |
| Best oak chopping boards | https://shop-b.example/product/end-grain-board/ | 60.00 | 72.00 | 20% | TRUE | update price | |
| Gifts for home cooks | https://shop-c.example/products/linen-apron | 28.00 | 21.00 | 28.00 | -25% | TRUE | on sale now: mention it |
| Gifts for home cooks | https://shop-a.example/products/knife-roll | 55.00 | 55.00 | 0% | FALSE | sold out: swap pick | |
| Gifts for home cooks | https://shop-d.example/products/salt-cellar | 18.00 | not found: check link |
articles tab
| Article | Picks | Fixes | Edit first? |
|---|---|---|---|
| Gifts for home cooks | 3 | 3 | yes |
| Best oak chopping boards | 2 | 1 |
Who this is for
Bloggers, newsletter writers and small review sites that recommend products from independent shops: "best of" lists, gift guides and comparison posts. Prices and stock change all year, and most of all in November. A reader who clicks a pick at the price you quoted and finds a higher price or a sold-out page stops trusting the rest of the guide. Checking every link by hand takes hours; this sheet does it in one run.
Step 1: list your picks in a tab named links
Put one row per recommended product, with these headers in row 1: Article (A), Product page (B), Price in article (C). Use the plain product page address, without tracking parameters, so it matches what the scraper returns. If you write the same product into two articles, give it two rows.
Step 2: get today's price and stock into a tab named scrape
With the product data scraper
Open the E-commerce Product Data Scraper (Shopify, WooCommerce, any shop) on the Apify Store and paste the product pages from column B as start URLs. Single product pages are fine, and so are mixed shops:
{
"startUrls": [
{ "url": "https://shop-a.example/products/oak-board-large" },
{ "url": "https://shop-b.example/product/end-grain-board/" }
],
"maxProductsPerShop": 100,
"includeDescription": false
}
- You pay only for products delivered.
includeDescriptionis off because the sheet needs only price, compare-at price and stock. - The scraper follows each shop's robots.txt and reads its terms page. Shops whose terms forbid automated access are skipped and not charged, and big marketplaces such as Amazon, eBay and Etsy are refused. Check prices on those by hand or with the marketplace's own tools. The run's Storage → Key-value store →
SHOPS_SUMMARYshows each shop's status.
Export the dataset as CSV, then in your sheet use File → Import → Upload, "Insert new sheet", and name the tab scrape. Keep the headers; the formulas find url, price, compareAtPrice and inStock by name, so column order does not matter.
Free, without the scraper
Make a scrape tab with the headers url, price, compareAtPrice and inStock (TRUE or FALSE), open each product page and type what you see. Slower, but the same formulas work.
Step 3: the formulas in the links tab
Put these in row 2 and fill down.
| Column | Formula (row 2) |
|---|---|
| D Price today | =IFERROR(INDEX(FILTER(scrape!A:Z, scrape!1:1="price"), MATCH(B2, INDEX(FILTER(scrape!A:Z, scrape!1:1="url")), 0)), "") |
| E Was (compare-at) | =IFERROR(INDEX(FILTER(scrape!A:Z, scrape!1:1="compareAtPrice"), MATCH(B2, INDEX(FILTER(scrape!A:Z, scrape!1:1="url")), 0)), "") |
| F Change | =IF(OR(D2="", C2=""), "", D2/C2-1) (format as %) |
| G In stock | =IFERROR(INDEX(FILTER(scrape!A:Z, scrape!1:1="inStock"), MATCH(B2, INDEX(FILTER(scrape!A:Z, scrape!1:1="url")), 0)), "") |
| H Fix | =IF(B2="", "", IF(D2="", "not found: check link", IF(G2=FALSE, "sold out: swap pick", IF(AND(E2<>"", E2>D2), "on sale now: mention it", IF(ABS(F2)>=0.05, "update price", "ok"))))) |
The 5% in the Fix formula is a starting point: change it to whatever gap you think readers would notice. "not found" means the scraper returned no product for that address. Open the link: the product may be gone, the shop may have changed its address, or the shop was skipped (see SHOPS_SUMMARY). A price in a different currency from the one you wrote also shows up as a big change, so compare like with like.
Step 4: the articles tab
- A2:
=UNIQUE(FILTER(links!A2:A, links!A2:A<>"")) - B2 Picks:
=COUNTIF(links!A:A, A2) - C2 Fixes:
=COUNTIFS(links!A:A, A2, links!H:H, "<>ok") - D2 Edit first?:
=IF(C2>=2, "yes", "")
Sort by Fixes, largest first, and work down the list.
What to do with each fix
- update price: change the number in the article, or write "around" and the date you checked.
- sold out: swap pick: replace it with your runner-up, or say it is sold out and when you last saw it in stock.
- on sale now: mention it: say the sale price and that sales end; do not promise a date the shop has not published.
- not found: check link: fix or remove the link so readers do not land on an error page.
Run it again a week before Black Friday and once more on the day. Each run replaces the scrape tab, and the links tab updates by itself.
Partner programme
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. Join the partner waitlist.
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.