This workflow corresponds to n8n.io template #17155 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Competitor Pricing Page Monitor",
"nodes": [
{
"id": "230a72c3-1390-4540-9188-7a7737e88e07",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-880,
-320
],
"parameters": {
"width": 480,
"height": 784,
"content": "## Competitor Pricing Page Monitor\n\n### How it works\n\nThis workflow monitors a competitor pricing page once per day at 7AM. It compares the live page against a stored baseline, checks for API or comparison errors, and then determines whether the pricing page changed. It sends Slack alerts for detected price changes or comparison failures, while the no-change path ends without action.\n\n### Setup steps\n\n- Install the `n8n-nodes-snapshot-site` community node (Settings \u2192 Community nodes \u2192 Install \u2192 `n8n-nodes-snapshot-site`) \u2014 verified by n8n.\n- Configure the daily schedule trigger for the desired timezone and run time.\n- Set up the snapshot comparison node with the competitor pricing page URL and its baseline snapshot or comparison settings.\n- Connect valid Slack credentials and choose the channels/messages for price-change and comparison-failure alerts.\n- Verify the error and change-detection conditions match the response fields returned by the snapshot comparison service.\n\n### Customization\n\nAdjust the monitored URL, baseline snapshot, schedule frequency, Slack channels, and the sensitivity or matching rules used to decide whether a pricing page change is significant."
},
"typeVersion": 1
},
{
"id": "77a463cf-563c-40e1-ba8d-7651683fe77c",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-96
],
"parameters": {
"color": 7,
"width": 512,
"height": 304,
"content": "## Schedule and compare\n\nStarts the workflow every morning and runs the live pricing page comparison against the saved baseline snapshot."
},
"typeVersion": 1
},
{
"id": "5a5c3a46-ee74-4d44-96f6-768aa62a6d4a",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
272,
-112
],
"parameters": {
"color": 7,
"width": 480,
"height": 512,
"content": "## Handle compare errors\n\nChecks whether the snapshot comparison returned an API or comparison error and sends a Slack failure notification on the lower error branch."
},
"typeVersion": 1
},
{
"id": "afca5010-f7ba-47c6-b753-d465e59376a0",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
-320
],
"parameters": {
"color": 7,
"width": 480,
"height": 512,
"content": "## Report pricing result\n\nEvaluates successful comparison results, posts a Slack alert when the pricing page changed, or ends quietly when no change is detected."
},
"typeVersion": 1
},
{
"id": "cron-daily-trigger",
"name": "When Every Day at 7AM",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-280,
40
],
"parameters": {
"rule": {
"interval": [
{
"field": "days",
"daysInterval": 1,
"triggerAtHour": 7
}
]
}
},
"typeVersion": 1.2
},
{
"id": "compare-baseline-vs-live",
"name": "Compare Current vs Baseline",
"type": "n8n-nodes-snapshot-site.snapshotSite",
"onError": "continueErrorOutput",
"maxTries": 3,
"position": [
40,
40
],
"parameters": {
"afterUrl": "https://competitor.example.com/pricing",
"beforeUrl": "https://your-storage.example.com/baselines/competitor-pricing-baseline.png",
"operation": "compare",
"threshold": 0.05,
"afterOptions": {
"fullSize": true
},
"beforeOptions": {
"fullSize": true
}
},
"credentials": {
"snapshotSiteApi": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 5000
},
{
"id": "if-api-error",
"name": "Check for API Error",
"type": "n8n-nodes-base.if",
"position": [
320,
40
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.error === true }}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "if-price-page-changed",
"name": "Check for Page Changes",
"type": "n8n-nodes-base.if",
"position": [
832,
-32
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{$json.summary.mismatchPercentage}}",
"value2": 0,
"operation": "larger"
}
]
}
},
"typeVersion": 1
},
{
"id": "slack-price-change-detected",
"name": "Notify Price Change on Slack",
"type": "n8n-nodes-base.slack",
"position": [
1104,
-160
],
"parameters": {
"text": "=\ud83d\udcb0 *Competitor pricing page changed* \u2014 {{ $json.after.source }} mismatch *{{ $json.summary.mismatchPercentage }}%* ({{ $json.summary.mismatchPixels.toLocaleString() }} px)\n<{{ $json.diff.link }}|View diff> \u00b7 <{{ $json.before.link }}|Baseline> \u00b7 <{{ $json.after.link }}|Live capture>",
"select": "channel",
"resource": "message",
"channelId": {
"__rl": true,
"mode": "name",
"value": "#competitor-watch"
},
"operation": "post",
"otherOptions": {
"unfurl_links": false,
"unfurl_media": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "noop-no-change",
"name": "No Change",
"type": "n8n-nodes-base.noOp",
"position": [
1104,
48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "slack-compare-failed",
"name": "Notify Comparison Failure on Slack",
"type": "n8n-nodes-base.slack",
"position": [
600,
240
],
"parameters": {
"text": "=\ud83d\udd34 Compare call failed: {{ $json.error?.message || $json.message }}",
"select": "channel",
"resource": "message",
"channelId": {
"__rl": true,
"mode": "name",
"value": "#competitor-watch-alerts"
},
"operation": "post",
"otherOptions": {
"unfurl_links": false,
"unfurl_media": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"timezone": "UTC",
"executionOrder": "v1",
"executionTimeout": 300,
"saveManualExecutions": true
},
"connections": {
"Check for API Error": {
"main": [
[
{
"node": "Notify Comparison Failure on Slack",
"type": "main",
"index": 0
}
],
[
{
"node": "Check for Page Changes",
"type": "main",
"index": 0
}
]
]
},
"When Every Day at 7AM": {
"main": [
[
{
"node": "Compare Current vs Baseline",
"type": "main",
"index": 0
}
]
]
},
"Check for Page Changes": {
"main": [
[
{
"node": "Notify Price Change on Slack",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change",
"type": "main",
"index": 0
}
]
]
},
"Compare Current vs Baseline": {
"main": [
[
{
"node": "Check for API Error",
"type": "main",
"index": 0
}
],
[
{
"node": "Notify Comparison Failure on Slack",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
slackApisnapshotSiteApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow runs daily and uses Snapshot Site to compare a stored baseline screenshot against a live competitor pricing page, then posts change alerts or failure notifications to Slack. Runs every day at 7:00 AM (UTC) on a scheduled trigger. Calls Snapshot Site to capture the…
Source: https://n8n.io/workflows/17155/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow fully automates your team's daily standup process using Slack for communication, Notion for structured data storage, and Redis for real-time session management.
debug. Uses httpRequest, slack, redis, mailgun. Scheduled trigger; 60 nodes.
Seller Follow-Up Engine (Enhanced). Uses httpRequest, slack. Scheduled trigger; 44 nodes.
This workflow is an automated employee time tracking and reporting system that monitors weekly work hours via TMetric, then delivers personalized summaries directly to each team member on Slack. It co