Google Sheets + Telegram: price changes sent to you
Your prices move, competitors adjust, and somehow you find out hours later. Not because you’re asleep at the wheel, but because checking ten product pages (then updating a spreadsheet) is slow, boring, and weirdly easy to “do tomorrow.”
Ecommerce managers feel it when margins get squeezed. Growth marketers notice it when promos stop converting. And founders running lean? They end up doing the checking themselves. This Sheets Telegram alerts automation catches price changes for you and pings you in Telegram, usually before your next meeting.
Below you’ll see exactly what the workflow monitors, what gets logged, and how it keeps a clean “baseline” price so your alerts stay trustworthy.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Telegram: price changes sent to you
flowchart LR
subgraph sg0["Daily 8 AM Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Daily 8 AM Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Fetch Product List from Sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Process Each Product in Batc..", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Pause Between Requests", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Load Product Page HTML"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>Extract Current Price from H.."]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Normalize Price Values"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Compute Price Change"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Clean Up Parsed Fields"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Price Changed?", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Build Telegram Alert Message"]
n11@{ icon: "mdi:database", form: "rounded", label: "Log Price History to Sheet", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Pause Before Updating Sheet", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Update Last Price in Master ..", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send Price Alert via Telegram"]
n9 --> n10
n9 --> n11
n0 --> n1
n7 --> n8
n8 --> n9
n4 --> n5
n4 --> n2
n6 --> n7
n3 --> n4
n11 --> n12
n12 --> n13
n10 --> n14
n1 --> n2
n14 --> n2
n5 --> n6
n2 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n9 decision
class n1,n11,n13 database
class n4 api
class n6,n7,n8,n10 code
classDef customIcon fill:none,stroke:none
class n4,n5,n6,n7,n8,n10,n14 customIcon
The Problem: Price Monitoring Turns Into a Daily Time Sink
Manually tracking competitor prices sounds simple until you do it for a week. You open a sheet, click a URL, wait for a page to load, hunt for the price, then copy it back (hopefully in the right row). Repeat for every product. Then someone asks, “When did it change?” and you realize you didn’t keep history, only the latest number. Or worse, the “latest number” is wrong because a currency symbol or comma broke your copy-paste.
It adds up fast. Here’s where it breaks down in real teams.
- Checking 20 products across multiple sites can eat about an hour every morning, and that’s before you even react.
- Without a baseline and a history log, you argue about what changed instead of acting on it.
- Copy-paste errors sneak in, which means you end up mistrusting the sheet you built.
- By the time you spot a price drop, the window to match it (or counter it) may already be closing.
The Solution: Daily Price Checks Logged in Sheets, Alerts in Telegram
This n8n workflow runs on a schedule (once a day at 8 AM, by default), reads your product list from Google Sheets, and checks each product URL for the current price. It goes one item at a time and pauses briefly between requests, so you’re less likely to get blocked by the website you’re monitoring. After it scrapes the price from the page, it normalizes the number, compares it to the last known price in your sheet, and calculates the price change percentage. If a change is detected, it sends you a clean Telegram alert (“Price Drop” or “Price Hike”), logs the event to a separate history tab, then updates your “master” sheet so tomorrow’s run compares against the new baseline.
The workflow starts with your Google Sheet as the source of truth. It checks each URL via HTTP, extracts and cleans the price, then uses an If check to decide what happens next. When a price changed, you get a Telegram message plus a row in your tracking tab, and the master sheet gets updated after a short pause.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 25 competitor product pages. Manually, even a quick check is maybe 2 minutes per page once you include loading, finding the right variant, and updating the row, which is roughly 50 minutes per day. With this workflow, your “work” is adding URLs to the master sheet (5 minutes once a week) and reading Telegram alerts. The run itself takes time in the background because of the built-in 20-second delay per item, but you’re not doing it. That’s close to an hour back on the days you used to check.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store your product list and baseline.
- Telegram to receive alerts in real time.
- Telegram Bot token + chat_id (get them from BotFather and your Telegram chat).
Skill level: Beginner. You’ll connect accounts, paste a Sheet ID, and verify one CSS selector.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run kicks things off. The workflow triggers once a day at 08:00 server time (you can change that to match your morning routine).
Your sheet provides the targets. n8n reads the “product_data” (or “master”) tab that includes each product_url and the last known price you want to compare against.
Each product page is checked carefully. The workflow processes one URL at a time, waits about 20 seconds between requests, then loads the page via HTTP and extracts the current price from the HTML using your CSS selector. A couple of quick cleanup steps normalize the number and calculate the difference.
Only real changes create noise. An If check flags rows where the price_changed field is true. When that happens, n8n writes a history row to the “price_tracking” tab (timestamp, old, new, percent change) and sends a Telegram message. After a short wait, it updates the master sheet so tomorrow’s baseline is correct.
You can easily modify the schedule time to run more often based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run every morning using the schedule trigger.
- Add and open Scheduled Morning Start.
- Set the schedule rule to run daily at
8(hour) to match the existing configuration. - Connect Scheduled Morning Start to Retrieve Product Sheet Rows.
Step 2: Connect Google Sheets
Pull the product URLs and prices from your spreadsheet, then prepare updates back to your master and history sheets.
- Open Retrieve Product Sheet Rows and set Document to
[YOUR_ID]and Sheet toproduct_data. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Product Sheet Rows.
- Open Append Price History and confirm Operation is
append, Document is[YOUR_ID], and Sheet isprice_tracking. - Ensure column mappings use expressions like
{{$json.last_price}},{{$json.current_price}}, and the timestamp formatting expression already present in Append Price History. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Price History and Update Master Price.
- Open Update Master Price and confirm Operation is
update, matching on product_url with mappings{{$json.current_price}}and{{$json.product_url}}.
Step 3: Set Up Product Iteration and Scraping
Loop through each product, delay between requests, and fetch the product page HTML for price extraction.
- Connect Retrieve Product Sheet Rows to Batch Iterate Products to start the batch loop.
- In Delay Between Calls, set Amount to
20(seconds) to throttle requests. - Open Request Product Page and set URL to
{{ $json.product_url }}. - Enable Send Headers and set Headers (JSON) to the provided browser-like user agent and accept headers.
- Connect Delay Between Calls to Request Product Page to enforce the wait between calls.
- Note the parallel execution: Request Product Page outputs to both Parse Current Price and Batch Iterate Products in parallel.
Step 4: Set Up Price Parsing and Calculation
Extract price from HTML, normalize values, and compute the delta for change detection.
- In Parse Current Price, set Operation to
extractHtmlContentand confirm the CSS selector.price__regular > span.price-item--regularmaps tocurrent_price. - Open Normalize Price Numbers and confirm it references the original row with
$items("Delay Between Calls")[0].jsonand parses the numeric price. - Open Calculate Price Delta and confirm it computes
price_changedandprice_diff_pctbased onlast_pricevscurrent_price. - Open Sanitize Parsed Fields and keep the cleaned output fields (product_url, last_price, current_price, price_changed, price_diff_pct, timestamp).
- Connect Parse Current Price → Normalize Price Numbers → Calculate Price Delta → Sanitize Parsed Fields → Price Change Check.
Step 5: Configure Alerts and Sheet Updates
Send Telegram alerts on price changes and log changes to Google Sheets with a controlled update delay.
- In Price Change Check, keep the condition
{{ $json.price_changed }}equalstrue. - Note the parallel execution: Price Change Check outputs to both Compose Telegram Alert and Append Price History in parallel.
- Open Compose Telegram Alert and confirm the message formatting includes the URL, prices, and percentage change.
- Open Dispatch Telegram Alert and set Text to
{{$json["message"]}}and Chat ID to[YOUR_ID]. - Credential Required: Connect your telegramApi credentials in Dispatch Telegram Alert.
- Open Wait Before Sheet Update and set Unit to
minutesand Amount to1. - Connect Append Price History → Wait Before Sheet Update → Update Master Price.
- Ensure Dispatch Telegram Alert reconnects to Batch Iterate Products so the loop continues after alerting.
Step 6: Test and Activate Your Workflow
Run a manual test to confirm price parsing, alerts, and sheet updates before enabling the daily schedule.
- Click Execute Workflow to run a manual test from Scheduled Morning Start.
- Verify that Request Product Page returns HTML and Parse Current Price extracts
current_price. - Confirm Append Price History writes a new row and Update Master Price updates the matching
product_url. - Trigger a known price change and verify Dispatch Telegram Alert sends a message to your Telegram chat.
- Once successful, toggle the workflow to Active so Scheduled Morning Start runs daily.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials page and confirm the account still has access to the spreadsheet.
- If you’re using Wait nodes or external loading, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses, especially after “Request Product Page.”
- CSS selectors drift when a site changes its layout. If alerts stop (or look wrong), inspect the product page again and update the selector in “Parse Current Price.”
Frequently Asked Questions
About 15 minutes if your sheet tabs are ready.
No. You’ll mostly connect accounts and paste your Sheet ID. The only “technical” piece is confirming a CSS selector for the price on the page.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in website access (some sites block scraping) but there are no required paid APIs in this specific workflow.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s a common tweak. Change the time in the “Scheduled Morning Start” trigger to run more often, then adjust the “Delay Between Calls” wait so you don’t hammer a site. You can also split your product list into multiple sheets (by competitor or category) and run separate schedules for each.
Usually it’s a bad bot token or the wrong chat_id. Regenerate the token in BotFather if needed, then confirm your bot has been added to the group (or started in a 1:1 chat) so it’s allowed to post. If it used to work and stopped, check the Telegram node credentials inside n8n and re-save them.
Dozens per run is realistic for most small teams.
For website price scraping plus conditional logic, n8n is usually the more practical choice because you can control delays, parse HTML, and branch your logic without fighting platform limits. Zapier and Make are great for app-to-app syncing, but scraping often becomes brittle or requires paid add-ons. Another difference is cost behavior: with self-hosted n8n you’re not paying per task the same way, which matters when you monitor lots of URLs. That said, if you only need a simple “row changed → send message” flow, Zapier or Make can be quicker to click together. If you want a second opinion on your exact use case, Talk to an automation expert.
Once this is running, price monitoring stops being a chore you postpone. You’ll just get the signal, plus the history to back it up, and move.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.