AutomationFlowsSlack & Telegram › Track and Receive Upwork Job Alerts via Whatsapp and Google Sheets

Track and Receive Upwork Job Alerts via Whatsapp and Google Sheets

ByAsfandyar Malik @asfandyar-malik on n8n.io

Automatically scrape new Upwork job listings, save them to Google Sheets, and get real-time WhatsApp alerts when new matching jobs appear. This workflow helps freelancers and agencies track new opportunities instantly — without checking Upwork manually.

Cron / scheduled trigger★★★★☆ complexity17 nodesGoogle SheetsHTTP RequestWhatsApp
Slack & Telegram Trigger: Cron / scheduled Nodes: 17 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9713 — we link there as the canonical source.

This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.

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 →

Download .json
{
  "id": "I3L71E4b6bDkLCTo",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Upwork JOB Hunt with whatsapp alert",
  "tags": [],
  "nodes": [
    {
      "id": "344e2376-fbe3-4759-9ee2-0c7248a1ca0d",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        272,
        -32
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "fe41bc1e-bd4d-4769-bb96-118d9098b1e1",
      "name": "Append or update row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        960,
        128
      ],
      "parameters": {
        "columns": {
          "value": {
            "URL": "={{ $json.URL }}",
            "Date": "={{ $json.Date }}",
            "Found": "={{ $json.Found }}",
            "Score": "={{ $json.Score }}",
            "Title": "={{ $json.Title }}",
            "Salary": "={{ $json.Salary }}",
            "Status": "={{ $json.Status }}",
            "Message": "={{ $json.Message }}",
            "Location": "={{ $json.Location }}",
            "Experience": "={{ $json.Experience }}",
            "Description": "={{ $json.Description }}",
            "Payment Type": "={{ $json['Payment Type'] }}"
          },
          "schema": [
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Payment Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Payment Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Experience",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Experience",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Salary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Salary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Message",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Found",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Found",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "hire_percentage",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "hire_percentage",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "spending_history",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "spending_history",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "rating",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "score",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Title"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1_WNd8Pex9BkDj8HgyqceyBCyo5G6_a9_oscipZrWjWQ",
          "cachedResultUrl": "Put your Sheet",
          "cachedResultName": "Upwork Data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "649c9609-c934-4f11-8521-cf20d855f5dc",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        272,
        288
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "0c4f1f2e-f732-4516-ba86-728ed39b9cd9",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        1216,
        128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d78912c8-c63e-4f32-af19-60a568d02377",
              "name": "Job Tile",
              "type": "string",
              "value": "={{ $json.Title }}"
            },
            {
              "id": "7ade5447-cac2-4fc2-bff2-517a8583d11e",
              "name": "job posted",
              "type": "string",
              "value": "={{ $json.Date }}"
            },
            {
              "id": "caff77ba-6c86-4685-b752-bae8ed41e58f",
              "name": "Payment type",
              "type": "string",
              "value": "={{ $json['Payment Type'] }}"
            },
            {
              "id": "52215059-aa70-469b-8b09-f51ada9a5fa0",
              "name": "score",
              "type": "string",
              "value": "={{ $json.Score }}"
            },
            {
              "id": "89926694-3595-4d22-b6ea-00228fb38a11",
              "name": "budget",
              "type": "string",
              "value": "={{ $json.Salary }}"
            },
            {
              "id": "5e48ea5b-92ad-49ce-be07-2f377c073af9",
              "name": "url",
              "type": "string",
              "value": "={{ $json.URL }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "47c813a1-cfd5-45d5-a6a0-8efa15625eff",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        1392,
        128
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "5de2dab5-7ee1-4f72-a438-41a6ae346549",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.score }}",
              "rightValue": 70
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "f09379ec-d4aa-4b84-a50e-249b9fc12d21",
      "name": "Edit Fields2",
      "type": "n8n-nodes-base.set",
      "position": [
        1648,
        112
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "41636510-c2f4-4672-9824-86ae7382a73e",
              "name": "job",
              "type": "string",
              "value": "={{ $json['Job Tile'] }}"
            },
            {
              "id": "8a2c0c90-938d-4405-929d-6e735a3c58c2",
              "name": "job posted",
              "type": "string",
              "value": "={{ $json['job posted'] }}"
            },
            {
              "id": "2191f1cd-770e-49f6-abbb-38e1b33165be",
              "name": "payment type",
              "type": "string",
              "value": "={{ $json['Payment type'] }}"
            },
            {
              "id": "1849509f-54a4-45fc-86f8-505bed8def52",
              "name": "salary",
              "type": "string",
              "value": "={{ $('Edit Fields').item.json.budget }}"
            },
            {
              "id": "fb772e6f-2e63-412f-bce9-160a02c9ebd2",
              "name": "score",
              "type": "string",
              "value": "={{ $json.score }}"
            },
            {
              "id": "ed95e66a-31ee-4f19-b399-f24ebe3cce1f",
              "name": "url",
              "type": "string",
              "value": "={{ $json.url }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "be49df45-2e61-49bf-a30b-dbbd8324a29a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        -96
      ],
      "parameters": {
        "color": 6,
        "width": 800,
        "height": 96,
        "content": "# Upwork Job Scraper with Whatsapp Alert"
      },
      "typeVersion": 1
    },
    {
      "id": "9afa9ea5-bd58-4dee-95fd-c4e5b732fc81",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        272,
        128
      ],
      "parameters": {
        "path": "7f69e1de-e644-40a7-bb0b-288b096b2696",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8152087d-00ad-47ac-8dda-a765bf1c0d4f",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1888,
        352
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.4
    },
    {
      "id": "a1b60b55-9a1f-4b1c-bcdd-9dcccec3d1f3",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        512,
        128
      ],
      "parameters": {
        "url": "https://upwork-scraping-api.p.rapidapi.com/upwork/search-jobs",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "={{ $json.body.searchQuery }}"
            },
            {
              "name": "type",
              "value": "hourly, fixed"
            },
            {
              "name": "difficulty",
              "value": "entry, intermediate, expert"
            },
            {
              "name": "hours_per_week",
              "value": "less_than_30, more_than_30"
            },
            {
              "name": "client_hires",
              "value": "0, 1-9, 10+"
            },
            {
              "name": "client_location",
              "value": "={{ $json.body.locations[0] }}"
            },
            {
              "name": "min_hourly_rate",
              "value": "={{ $json.body.minRate }}"
            },
            {
              "name": "max_hourly_rate",
              "value": "={{ $json.body.maxRate }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "upwork-scraping-api.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": "Your API key"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8a0ccf26-ba6c-401a-9dd9-372fb3539600",
      "name": "Send message",
      "type": "n8n-nodes-base.whatsApp",
      "disabled": true,
      "position": [
        1888,
        144
      ],
      "parameters": {
        "textBody": "hy",
        "operation": "send",
        "additionalFields": {},
        "recipientPhoneNumber": ""
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1485fe97-a94f-4370-afd0-ec62bbe2cedf",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        -144
      ],
      "parameters": {
        "width": 336,
        "height": 640,
        "content": "# Triggers to  start the wokdlow\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f7f7b98e-2eeb-43f7-8da2-fc677c3199c5",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        48
      ],
      "parameters": {
        "color": 4,
        "width": 432,
        "height": 288,
        "content": "## Rapid Api For Scraping"
      },
      "typeVersion": 1
    },
    {
      "id": "e2fc5f7e-fb17-4645-a9f6-e00cf238c032",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        48
      ],
      "parameters": {
        "width": 272,
        "height": 288,
        "content": "## Save Results in Sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "e87b75da-0c4c-472b-83a4-7e29968f0879",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1184,
        48
      ],
      "parameters": {
        "color": 3,
        "width": 592,
        "height": 272,
        "content": "## Edit Field and the If Filter to pass the specific Information"
      },
      "typeVersion": 1
    },
    {
      "id": "9caf306a-ea94-471b-8d74-b99beb0ab5ad",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1808,
        -192
      ],
      "parameters": {
        "color": 5,
        "height": 704,
        "content": "## Send the Alert"
      },
      "typeVersion": 1
    },
    {
      "id": "a34422f4-bf0d-4c08-9c78-964e5dfafc41",
      "name": "HTTP Request1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1888,
        -48
      ],
      "parameters": {
        "url": "https://whin2.p.rapidapi.com/send",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "text",
              "value": "=New Job Alert make the Proposal ASAP\n\nJob Title : {{ $json.job }}\nPosted On : {{ $json['job posted'] }}\nBudget : {{ $json.salary }}\nJob Score : {{\u00a0$json.score\u00a0}}\nJob URL: {{ $json.url }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "whin2.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": "Your API Key"
            }
          ]
        }
      },
      "typeVersion": 4.2
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9626eeea-cd49-4e1a-856e-f3cb5c93a920",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Edit Fields2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields2": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send message",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP Request1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        []
      ]
    },
    "Respond to Webhook": {
      "main": [
        []
      ]
    },
    "Append or update row in sheet": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        []
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Automatically scrape new Upwork job listings, save them to Google Sheets, and get real-time WhatsApp alerts when new matching jobs appear. This workflow helps freelancers and agencies track new opportunities instantly — without checking Upwork manually.

Source: https://n8n.io/workflows/9713/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

⚠️ Heads up: this is satire. The "Hell Yeah!" workflow is a parody of "automate your whole life with AI agents" grindset content. The API endpoints are fictional and the function nodes are illustrativ

HTTP Request, Salesforce, Telegram +4
Slack & Telegram

This automated n8n workflow monitors API uptime by periodically checking API availability and sending instant WhatsApp alerts if any service goes down. It retrieves API details from a Google Sheet and

Google Sheets, HTTP Request, WhatsApp
Slack & Telegram

This workflow continuously monitors the Meta Ads Library for new creatives from a specific competitor pages, logs them into Google Sheets, and sends a concise Telegram notification with the number of

HTTP Request, Telegram, Google Sheets +1
Slack & Telegram

Enhance financial oversight with this automated n8n workflow. Triggered every 5 minutes, it fetches real-time bank transactions via an API, enriches and transforms the data, and applies smart logic to

HTTP Request, Email Send, Google Sheets +1
Slack & Telegram

This workflow automates competitive price intelligence using Bright Data's enterprise web scraping API. On a scheduled basis (default: daily at 9 AM), the system loops through configured competitor pr

HTTP Request, Google Sheets, Slack +1