Makani Tech: Build. Automate. Evolve.

Competitor Price Watch with n8n + Claude (free workflow)

How to track competitor prices daily and get one summary every morning

FreeWorkflowBy Kishan Makani · updated 19 October 2026 · 7 min read

ScheduleHTTP RequestClaudeGoogle SheetsSlack

Downloads

  • Download the n8n workflow (JSON)

    competitor-price-monitor-n8n-claude.json · n8n workflow · 20 steps · starts with Every day at 7 AM · uses Google Sheets, Anthropic, Slack, Gmail · 33 KB

    Import into n8n: Create Workflow, then the menu, then Import from File.

How to import it into n8n
  1. In n8n, create a new workflow.
  2. Open the ⋯ menu at the top right and choose Import from File, then pick the downloaded .json. (Or open the file, copy everything and paste it on the canvas.)
  3. Open each node with a warning and connect your own account: the file carries no passwords or keys.
  4. Run it once with Test workflow, check the result, then switch it to Active.

What it does

Every morning at 7 AM the workflow reads your Watchlist sheet and checks each competitor product page, one at a time. The page is fetched once like a normal browser visit, scripts and menus are stripped, and only the text around prices, offers and stock is kept. Claude reads that text and returns the selling price, MRP, any offer or coupon and stock status, or says it could not find them. n8n compares with yesterday, saves today's values to the Watchlist and adds a row to a Price history tab. When every page is done, only the changes are collected and a second Claude call writes one short Slack summary, with every product where a competitor is now cheaper than you. If Slack fails, the summary comes by email.

Who it is for

D2C brands, Shopify sellers and retailers who compete with a handful of other brand websites on the same products and today find out about price drops from customers.

What you need

  • An n8n account (n8n Cloud or self-hosted)
  • A Google Sheet with Watchlist and Price history tabs
  • An Anthropic API key for Claude
  • Slack with a #pricing channel, and Gmail as a fallback
  • A list of public competitor product page links (brand websites, not marketplaces that forbid scraping)

How the workflow runs, node by node

The slides show the same steps. Open the workflow in n8n and you will see a sticky note over each one.

Step 1 · Your watchlist, every morning

At 7 AM n8n reads your Watchlist sheet: competitor, product, page link, your price, and yesterday's price and offer. Paused rows are skipped, and pages are checked one at a time.

  • Every day at 7 AM: Runs every morning at 7 AM (set the workflow timezone to Asia/Kolkata).
  • Read watchlist: Reads your Watchlist tab: Competitor, Product, URL, Our price, Active, Last price, Last offer, Last in stock.
  • Active rows only: Skips rows with no link or with Active set to 'No', so you can pause a product without deleting it.
  • One page at a time: Checks one page per loop, so a slow or broken site never holds up the rest and no site gets many hits at once.

Step 2 · Fetch each page politely

Each public product page is fetched once, like a normal browser visit. Scripts and menus are stripped, and only the text around prices, offers and stock is kept. A page that fails is noted, not hammered.

  • Fetch product page: Fetches the public product page once, like a normal browser visit. Retries 3 times; if the page still fails, its error output notes it instead of stopping.
  • Note fetch failed: If a page cannot be fetched, keeps yesterday's values and records 'Fetch failed' so you can see which links need fixing.
  • Page to text: Pulls the page title and the visible text, without scripts, menus and footers.
  • Trim page text: Keeps only the text around ₹, MRP, offers and stock words (max 6,000 characters), so Claude reads a few lines instead of the whole page.

Step 3 · Claude reads price and offer

Claude reads the trimmed text and returns the selling price, MRP, any offer or coupon, and stock. If it lands on the wrong product or a captcha, it says so instead of guessing. n8n then compares with yesterday.

  • Read price with Claude: Reads the trimmed text and returns selling price, MRP, any offer or coupon, stock status and confidence. On a wrong product, captcha or 404 it reports confidence 0 instead of guessing.
  • Claude: Claude (claude-sonnet-5-5) at temperature 0, so answers stay consistent from run to run.
  • Price schema: Forces fixed fields (price, mrp, offer_text, coupon, in_stock, confidence).
  • Compare with yesterday: Compares today with yesterday's values and writes a plain change note: price change with %, new offer, or stock change. Low-confidence reads keep yesterday's numbers.

Step 4 · Every check is saved

Today's price, offer and stock go back into the Watchlist, and every check is added to a Price history tab. After a month you can see exactly when each competitor runs sales.

  • Save today's price: Writes today's price, offer, stock and status back into the Watchlist row, matched on URL.
  • Add to price history: Adds one row per check to the Price history tab. After a few weeks you can see when each competitor runs sales.

Step 5 · One message at 7 AM

Only the changes are collected. Claude writes one short morning summary: who changed what, and where they are now cheaper than you. It goes to Slack, or by email if Slack fails. Quiet days stay quiet.

  • Changes only: When every page is done, keeps only the rows where something changed. On quiet days nothing is posted.
  • Combine changes: Packs all of today's changes into one list for a single summary.
  • Write morning summary: Turns the list of changes into one short message: biggest change first, grouped by competitor, with every product where they are now cheaper than you.
  • Claude (summary): Claude (claude-sonnet-5-5) at temperature 0.3, so answers stay consistent from run to run.
  • Post morning summary: Posts the summary to #pricing. Its error output sends the same text by email instead.
  • Email summary instead: If Slack fails, emails you the same morning summary so you still see it.

Setup

  1. In n8n, create a new workflow, open the menu and choose Import from File, then pick the JSON file.
  2. Make a Google Sheet with a Watchlist tab (Competitor, Product, URL, Our price, Active, Last price, Last offer, Last in stock, Last checked, Status) and a Price history tab (Date, Product, Competitor, URL, Price, Offer, In stock, Our price, Changed, Change note). Paste its URL in the three sheet nodes.
  3. Add your competitor product links to the Watchlist, with your own price for the same product.
  4. Create an Anthropic credential on both Claude nodes.
  5. Connect Slack on Post morning summary and Gmail on Email summary instead (replace YOUR_EMAIL).
  6. In workflow settings, set the timezone to Asia/Kolkata.
  7. Click Execute workflow once. The first run only fills in today's prices. From the next morning you get changes. Then activate.

How to customise it

  • Run twice a day during sale seasons (Diwali, end of season) by adding a second time to the schedule.
  • Add an 'Alert below' column and post an instant Slack message when a competitor goes under that price.
  • Track your own product pages too, to catch wrong prices or 'out of stock' errors on your site.
  • Send the summary on WhatsApp to the owner with an approved utility template.
  • Pull weekly charts from the Price history tab with a Google Sheets chart or Looker Studio.

Guardrails

Nothing on your store changes automatically. The summary only informs you, and you decide.

  • Nothing on your store changes automatically. The summary only informs you.
  • Only public product pages are fetched, once a day, one at a time. Respect each site's terms of use, and do not watch marketplaces that forbid scraping.
  • Claude runs at temperature 0 and is told never to guess a price. Low-confidence reads keep yesterday's numbers and flag the row.
  • Failed pages are noted in the sheet instead of retried all day.
  • Only a small slice of page text is sent to Claude, never the whole page.

Troubleshooting

  • Status says 'Could not read price'. The price may load with JavaScript after the page opens. Try the product's JSON link (many Shopify stores support adding .json to a product URL) or remove the row.
  • Fetch failed: 403. The site blocks automated visits. Respect that and remove the row.
  • Every product shows a change on day one. The first run has nothing to compare with. Changes are reliable from the second day.
  • The summary is empty but prices changed. Check the Changed column in Price history says 'yes'. The Changes only filter reads that column.
  • Claude reads the wrong price (for example a related product). Make the Product name in the Watchlist specific (size, colour) so Claude can match the right one.

Want the members-only resources too?

A free account unlocks them all, including the ones shared in DMs.

Create a free account