{
  "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
          }
        ]
      ]
    }
  }
}