Watch competitor prices and alert Slack on changes

Every four hours, check each product URL in your sheet, compare to the last known price, and ping Slack when anything moves more than a few percent.

Deterministic Code
Google SheetsScrapingBeeSlackOperationsMarketingResearch & MonitoringNotifications & AlertsData Sync

Build a code-based workflow that watches a Google Sheet of competitor product prices on a recurring schedule and alerts Slack when prices move.

Trigger: cron, every 4 hours.

Inputs the workflow needs: the Google Sheets spreadsheet id, the name of the watch list tab, the name of the history tab, the Slack channel id that should receive alerts, and a percent change threshold with a default of 5.

The watch list tab has one row per product with three columns: product URL, the CSS selector for the price element on that product's page, and the last known price as a number.

On every run, do the following in order:

1. Use Google Sheets Get Values to read every row of the watch list tab.

2. For each row, call ScrapingBee Extract Structured Data with CSS/XPath, passing the row's product URL and the row's CSS selector as a single extract rule, to fetch the current price text. Parse that text into a number by stripping currency symbols, thousands separators, and whitespace, and normalising the decimal mark. If the scrape fails or no numeric price can be parsed, skip that row entirely (do not update its last known price, do not log it).

3. Compute the percent change between the parsed new price and the row's last known price. If the absolute percent change is greater than or equal to the threshold, mark the row as crossed.

4. For every crossed row, use Google Sheets Append Values to append a row to the history tab with these columns: product URL, ISO 8601 timestamp of the run, old price, new price, and percent change (signed).

5. If at least one row crossed the threshold, use Slack Send a Message to post a single summary message to the configured channel. List each crossed product on its own line with the product URL, the old price, the new price, and the signed percent change. Use an up or down arrow to indicate direction. If no rows crossed, skip Slack entirely and post nothing.

6. For every row where the scrape succeeded and produced a numeric price (crossed or not), use Google Sheets Update Values to overwrite the last known price column on that row with the new price, so the next run compares against the most recent value.

Determinism matters: same inputs should produce the same writes. No LLM judgement calls. The CSS selector per row is what lets one workflow handle heterogeneous storefronts.

Additional information

What does this prompt do?
  • Reads the list of competitor product URLs you keep in a Google Sheet and pulls the live price for each one, on a four hour schedule.
  • Compares the latest price to the last known price and flags anything that moved more than your chosen threshold (5 percent by default).
  • Posts one clean Slack message that lists every flagged product with the old price, the new price, and the percent change.
  • Writes a row to a separate history tab for every change so you build an audit trail you can chart later.
  • Stays silent on runs where nothing crossed the threshold, so the channel never fills with noise.
What do I need to use this?
  • A Google Sheet with one row per product. Three columns: the product URL, the CSS selector that points to the price element on that page, and the last known price.
  • A second tab in the same sheet to hold the change history.
  • A ScrapingBee account for the actual page fetch and price extraction.
  • A Slack workspace and the channel that should receive the alerts.
How can I customize it?
  • The alert threshold. Default is 5 percent; raise it for noisy categories or drop it to catch smaller moves.
  • How often the watcher runs. Every four hours by default; easy to make it hourly, twice a day, or once a week.
  • The Slack channel that receives the alerts.
  • Which tab holds the watch list and which tab holds the history, in case you want to keep them in separate sheets.

Frequently asked questions

How do I add or remove products from the watch list?
Just add or delete rows in the Google Sheet. The workflow re-reads the full list at the start of every run, so changes take effect on the next scheduled run with no redeploy.
What if I'm watching products on lots of different storefronts?
That's the whole point of the selector column. Each row has its own CSS selector for the price element, so you can mix Shopify stores, Amazon listings, and bespoke storefronts in the same sheet without writing a new workflow per site.
Will Slack get spammed if a lot of prices change at once?
No. Every flagged product is rolled into one summary message per run, and the workflow stays completely silent on runs where nothing crossed your threshold.
Why a Google Sheet instead of a database?
Most pricing and merchandising teams already live in spreadsheets. Adding a product is just pasting a URL and a selector, and the history tab gives you a free audit trail you can pivot or chart however you like.
What happens if a competitor changes their page and the selector breaks?
The scrape returns no value for that row, the workflow skips it without overwriting the last known price, and you fix the selector in the sheet. The next run picks up the change automatically.

Stop refreshing competitor pricing pages by hand.

Connect Google Sheets, ScrapingBee, and Slack once, and Geni checks every product in your sheet four times a day.