Google Sheets + Gmail: competitor price alerts
Your pricing shouldn’t depend on someone remembering to “check competitors” every morning. But that’s how it usually goes. Tabs everywhere, numbers copied into a sheet, and then the “wait… was it $49 yesterday or $59?” moment.
This is where Sheets price alerts save you: e-commerce operators feel it first, but pricing analysts and agency teams managing client catalogs run into the same mess. You get clean change logs in Google Sheets plus a Gmail alert when a competitor moves, so you can respond before margin takes a hit.
Below, you’ll see how the automation runs in n8n, what results to expect, and what you’ll need to set it up without turning it into a “new ongoing project.”
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Gmail: competitor price alerts
flowchart LR
subgraph sg0["Check Pricing Every Day Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Check Pricing Every Day", pos: "b", h: 48 }
n1["<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/>Fetch Page via Bright Data"]
n2["<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 HTML Content"]
n3["<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/>Format & Isolate Price Block"]
n4@{ icon: "mdi:database", form: "rounded", label: "Read Last Saved Price", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has Price Changed?", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "No Change Detected – Stop", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Update Stored Price", pos: "b", h: 48 }
n8@{ icon: "mdi:message-outline", form: "rounded", label: "Send Price Change Alert Email", pos: "b", h: 48 }
n5 --> n6
n5 --> n7
n7 --> n8
n2 --> n3
n4 --> n5
n0 --> n1
n1 --> n2
n3 --> n4
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 n5 decision
class n4,n7 database
class n1 api
class n3 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3 customIcon
The Problem: Competitor prices change while you’re busy
Competitor monitoring sounds simple until you actually do it. One person checks a product page, another updates a spreadsheet, and by the time you notice a drop, you’ve already burned a day of sales at the wrong price. Or worse, you match a price that was a temporary promo and you’re the one stuck with thinner margins. Then there’s the messy part: pages change layout, numbers show “from $X,” and suddenly your sheet is full of half-truths you can’t trust.
It adds up fast. Here’s where it usually breaks down.
- Someone has to manually open the same competitor pages every day, and it quietly turns into about 2 hours a week.
- Price history gets logged inconsistently, which means you can’t tell if a move is a trend or just noise.
- You find out late because you only notice changes when you remember to look.
- A single copy-paste mistake (or comma/decimal mismatch) can trigger a bad pricing decision.
The Solution: Daily scraping + change detection + Gmail alerts
This n8n workflow monitors competitor product pages on a schedule, extracts the current price, compares it to the last recorded value, and then takes action only when something actually changed. It starts with a daily trigger, pulls the competitor page (using an HTTP request that can be routed through a scraping provider like Bright Data to avoid blocks), and parses the HTML markup to locate the price. Next, it standardizes that value (so “$49.00” and “49” don’t get treated as different) and loads the prior price from Google Sheets. If the number moved, it writes the new value back to the sheet and sends you a Gmail alert with the details. If nothing changed, it stops immediately.
The workflow begins on a schedule, then scrapes and parses pricing data from a competitor URL. After a quick comparison against your stored baseline in Google Sheets, it either logs the update and emails you, or it halts with no noise.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 10 products across 3 competitors. Manually, even a quick check is maybe 3 minutes per page, which is about 90 minutes every day (and that’s if nothing breaks). With this workflow, you spend about 10 minutes once to add URLs and map the price selector, then the daily run is hands-off. You only touch it when Gmail pings you, which for many catalogs is a few alerts a week, not 30 page checks a day.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing price history and baselines.
- Gmail to send price-change alerts to your team.
- Bright Data credentials (get them from your Bright Data dashboard) if competitor sites block scraping.
Skill level: Intermediate. You’ll copy the workflow into n8n, connect accounts, and adjust how the price is detected on your specific pages.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule starts the check. The workflow runs from a Schedule Trigger (for example, every morning before your first order rush), so you’re not relying on a calendar reminder.
The competitor page is retrieved and parsed. n8n pulls the pricing page via HTTP Request, then an HTML parsing step reads the markup and hands the relevant chunk to a small code step that isolates the actual price value.
Today’s price is compared to your last recorded price. Google Sheets is used as the “memory.” The workflow loads the prior value, then an If condition decides if the price changed enough to matter (based on your logic).
Updates are logged and alerts are sent. If the price is different, the new record is written to Google Sheets and a Gmail alert goes out with the product and the old vs. new price. If nothing changed, it stops right there.
You can easily modify the schedule and the alert rules 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 daily at the specified hour using the schedule-based trigger.
- Add and open Daily Pricing Trigger.
- Set the Rule to run at
triggerAtHour: 9. - Connect Daily Pricing Trigger to Retrieve Pricing Page.
Step 2: Connect Google Sheets
Configure the spreadsheet nodes that read and update your pricing history.
- Open Load Prior Prices and select the spreadsheet
Competitor price analyzerand sheetSheet1. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Open Write Updated Prices and confirm Operation is set to
update. - Verify Columns mapping uses expressions like
{{ $json.Basic }},{{ $json.Grow }},{{ $json.Advanced }},{{ $json.Plus }}, and{{ $json.row_number }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
Step 3: Set Up Pricing Page Retrieval and Parsing
Pull the competitor pricing page and extract the relevant HTML content.
- Open Retrieve Pricing Page and set URL to
https://api.brightdata.com/requestand Method toPOST. - Set Specify Body to
jsonand enable Send Body and Send Headers. - Paste the JSON Body exactly as
{ "zone": "n8n_unblocker", "url": "https://www.shopify.com/uk/pricing", "country": "us", "format": "raw", "headers": { "User-Agent": "Mozilla/5.0", "Accept": "text/html" } }. - Set the Authorization header to
Bearer [CONFIGURE_YOUR_TOKEN]. - Open Parse Page Markup and set Operation to
extractHtmlContent. - Add extraction values: Plan name with CSS Selector
h3(return array), and Pricing with CSS Selectorspan(return array).
[CONFIGURE_YOUR_TOKEN] in Retrieve Pricing Page will cause authorization failures.Step 4: Set Up Price Processing
Normalize extracted data into a structured plan-to-price map.
- Open Isolate Price Details and keep the provided JavaScript intact to map
Basic,Grow,Advanced, andPlusprices. - Confirm the regex logic is present:
/\$[\d,]+USD\/month/and the cleaning step strips$and commas. - Connect Parse Page Markup to Isolate Price Details, then to Load Prior Prices.
Step 5: Configure Conditional Logic and Updates
Compare current prices with stored values and decide whether to update and alert.
- Open Detect Pricing Changes and verify the conditions compare current and prior values using expressions such as
{{ $('Isolate Price Details').item.json.Basic }}equals{{ $json.Basic }}, and repeat forGrow,Advanced, andPlus. - Connect the true output of Detect Pricing Changes to Halt When Unchanged.
- Connect the false output of Detect Pricing Changes to Write Updated Prices so only changes trigger updates.
- Ensure Write Updated Prices connects to Email Price Alert.
Step 6: Configure Email Notifications
Send an alert when pricing changes are detected.
- Open Email Price Alert and set Send To to your alert address, replacing
[YOUR_EMAIL]. - Keep the Subject as
Competitor Pricing Page Has Changed. - Ensure the Message includes the timestamp expression
{{ $now }}for auditability. - Credential Required: Connect your gmailOAuth2 credentials.
Step 7: Test and Activate Your Workflow
Validate the flow end-to-end, then enable daily monitoring.
- Manually execute Daily Pricing Trigger to run the workflow once.
- Confirm Retrieve Pricing Page returns HTML content and Parse Page Markup outputs arrays for
Plan nameandPricing. - Verify Isolate Price Details outputs numeric values and that Detect Pricing Changes routes correctly to Halt When Unchanged or Write Updated Prices.
- Check that Write Updated Prices updates the correct row and Email Price Alert sends the message when changes occur.
- Activate the workflow to enable daily monitoring.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials page and confirm the connected Google account still has edit access to the sheet.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Bright Data or your target site can throttle requests, which shows up as random 403/429 errors in the HTTP Request node. Check the execution log for response codes, then slow the schedule or rotate proxy settings.
Frequently Asked Questions
About 30 minutes if you already have the URLs and your Google connections ready.
No. You might edit a small snippet or selector, but it’s mostly copy-paste and testing.
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 Bright Data costs if you use it for scraping.
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, but you’ll change the last mile. Keep the same scrape-and-compare logic, then swap the Gmail node for a “daily digest” path that writes changes to a summary tab and emails once a week. Common customizations include different schedules per competitor, alerting only when the change is bigger than your threshold, and tracking multiple SKUs per page.
Usually it’s permissions or an expired OAuth connection. Reconnect Google Sheets in n8n credentials, then confirm the same Google account can edit the target spreadsheet. Also check that your sheet name and column headers still match what the workflow expects. If you renamed tabs, the “Load Prior Prices” step can’t find the right place to read from.
On n8n Cloud Starter, you can run a few thousand executions a month, which is plenty for a small catalog. If you self-host, there’s no execution cap (it mainly depends on your server and how often you scrape). Practically, most teams start with 20–50 URLs, make sure extraction is stable, then scale from there.
Often, yes, because scraping + parsing + conditional logic gets awkward (and pricey) in simpler automation tools. n8n handles branches, code cleanup, and “stop when unchanged” logic without turning your bill into a surprise. The self-host option is also a big deal if you want to monitor lots of URLs daily. Zapier or Make can still be fine for basic “sheet changed → email” flows, but they’re not built for HTML extraction. If you want a second opinion, Talk to an automation expert and you’ll get a straight recommendation.
Once this is running, you stop “checking prices” and start reacting to real signals. The workflow handles the repetitive stuff, and your spreadsheet finally becomes reliable.
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.