Weekday competitor price and promo watch with Airtop

Every weekday at 8am, check each competitor's product page in a real browser, log every reading to Google Sheets, and Slack the team only when a price, promo, or stock status actually moves.

Agentic Task
AirtopGoogle SheetsSlackMarketingResearch & MonitoringNotifications & Alerts
PromptCreate

Every weekday at 8am, watch competitor pricing and promotions using an Airtop cloud browser and post one consolidated Slack alert only when something material actually changes.

Trigger: cron, every weekday (Monday to Friday) at 8am.

Step 1 — read the tracked list. Use Google Sheets Get Values on the Competitors tab. Each row has three columns: competitor name, product-page URL, and expected price. Skip the header row.

Step 2 — read the recent history. Use Google Sheets Get Values on the Price History tab and keep the last recorded reading per competitor in memory (competitor name, price, promo banner, stock status, timestamp). This is what today's readings will be diffed against.

Step 3 — capture today's readings with Airtop. Create one Airtop session with Create Session, then for each row in the Competitors list: use Create Window with the competitor's product-page URL, then run Query Page against that window with a structured output schema of shape { currentPrice: number|null, currency: string|null, promoBannerText: string|null, stockStatus: 'in_stock'|'low_stock'|'out_of_stock'|'unknown' }. Wait for the page to fully render before querying. Close the window when done. Terminate the session at the end of the run so credits don't keep burning.

Step 4 — log every reading. For each competitor, use Google Sheets Append Values to add one row to the Price History tab with columns: timestamp (ISO 8601, UTC), competitor name, product URL, current price, currency, promo banner text (empty string if none), stock status, and a short 'notes' column (leave empty unless the page failed to load or the price could not be read). Append every reading, even when nothing changed — the tab is the audit trail.

Step 5 — reason across the batch to decide whether to alert. For each competitor, compare today's reading to the last previously recorded reading in Price History. Flag a competitor as material if any of the following is true:

  • the current price is more than 5% below the last recorded price for that competitor,

  • a promo banner appeared that was not present in the last reading (banner text went from empty to non-empty, or the text substantively changed),

  • stock status flipped to out_of_stock on a competitor whose row in the Competitors tab is a headline SKU.

Step 6 — post the consolidated Slack alert. If at least one competitor is material, use Slack Send a Message to #competitive-intel with a single message that includes one bullet per flagged competitor. Each bullet should say what changed in plain language (old value → new value or 'new promo: <banner text>' or 'out of stock'), and include the product-page URL as the source. If a reading failed to load, mention it briefly at the bottom of the same message so someone can fix the tracked URL. If nothing is material, do not post anything — stay silent on quiet days.

Business rules and nuance:

  • Only ever post one Slack message per run, never one per competitor.

  • When a competitor has no prior reading in Price History (first run), append the reading but do not treat it as a change.

  • Normalize prices to a number before comparing (strip currency symbols, commas, thousands separators). If the currency changed between readings, note it and skip the % comparison.

  • Treat any Query Page result with meta.status of 'failure' as a failed reading — log with a notes value and do not compare.

  • Always terminate the Airtop session at the end so it doesn't keep billing.

Additional information

What does this prompt do?
  • Every weekday at 8am, reads your list of tracked competitors and product page URLs from a Google Sheet.
  • Opens each product page in a real cloud browser so pages that block plain scrapers still render, then pulls the current price, any promo banner text, and stock status into a structured reading.
  • Appends every reading, with a timestamp, to a rolling Price History tab so you always have a full audit trail.
  • Compares today's readings against the last recorded values and posts a single consolidated Slack alert only when a competitor drops price more than 5% versus its last reading, launches a new promo banner, or goes out of stock on a headline SKU.
What do I need to use this?
  • An Airtop account so pages render in a real browser and structured details can be pulled with a schema.
  • A Google account with a spreadsheet that has a Competitors tab (name, product URL, expected price) and a Price History tab for the log.
  • A Slack workspace and a #competitive-intel channel (or any channel you pick) for the alerts.
How can I customize it?
  • Change the schedule — every morning, twice a day, or only Mondays and Thursdays.
  • Tune the alert thresholds — swap the 5% price drop for a dollar amount, add price-increase alerts, or widen the definition of a material promo.
  • Point it at a different Slack channel, or route different competitors to different channels.

Frequently asked questions

Why use a real cloud browser instead of a plain HTTP scraper?
Most modern product pages render prices with JavaScript, hide behind bot protection, or personalize the layout. A cloud browser loads the page like a real shopper would, so the price, promo banner, and stock badge come through even on pages that would return empty markup to a plain scraper.
How does the workflow know a change is material?
It compares each new reading to the last row for that competitor in the Price History tab. A price drop of more than 5%, a new promo banner appearing, or a headline SKU flipping to out of stock all count. On days when nothing crosses those thresholds, no Slack message is sent.
Will this get me blocked from competitor sites?
You're loading one page per competitor once a day, which looks like a normal shopper visit. If a specific competitor is aggressive about blocking, the cloud browser supports proxies and profiles you can turn on for just that page.
What if a page layout changes and the price can't be read?
The reading for that competitor is flagged as missing in the Price History log and the agent surfaces it in the Slack alert so someone can update the tracked URL. Other competitors still get logged normally.
Can I track more than a handful of competitors?
Yes. Add as many rows to the Competitors tab as you want to track — the workflow loops through the full list each morning.

Stop refreshing competitor product pages by hand.

Wake up to one Slack alert on the days that matter, and a full price history in your sheet on every other day.