AutomationFlowsData & Sheets › Automated Job Market Tracker: Upwork Scraper to Google Sheets Workflow

Automated Job Market Tracker: Upwork Scraper to Google Sheets Workflow

ByYaron Been @yaron-nofluff on n8n.io

This cutting-edge n8n automation is a sophisticated job market intelligence tool designed to transform freelance job tracking into a seamless, data-driven process. By intelligently connecting Apify, data processing, and Google Sheets, this workflow: Discovers Job Opportunities:…

Cron / scheduled trigger★★★☆☆ complexity8 nodesHTTP RequestGoogle Sheets
Data & Sheets Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★☆☆ Added:

This workflow corresponds to n8n.io template #4734 — 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": "s1PkxgZZchk3npwR",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Upwork Jobs to google sheets",
  "tags": [],
  "nodes": [
    {
      "id": "e08c753e-7d88-4f0b-889e-100291f0a3c7",
      "name": "Check Upwork Jobs - Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "ffcc4ad0-7787-40a6-a78d-d3a03b1dc23b",
      "name": "Fetch Upwork Jobs using Apify",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        260,
        0
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/actor-tasks/<TASK_ID>/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {}
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "4d0d8fb6-ad2e-4dff-8d04-b100721e33ee",
      "name": "Format scrape Data",
      "type": "n8n-nodes-base.set",
      "position": [
        660,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "404d06e0-d3a0-448d-98f5-35fe87405e87",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "1d0e9a1d-e5f9-413b-9ab4-f20ae7260b65",
              "name": "description",
              "type": "string",
              "value": "={{ $json.description }}"
            },
            {
              "id": "c8d60809-8747-4321-ac97-a44a12ae91d5",
              "name": "postedDate",
              "type": "string",
              "value": "={{ $json.postedDate }}"
            },
            {
              "id": "e55fbecc-a984-49b7-80a7-8c7a6d10b32a",
              "name": "skills",
              "type": "array",
              "value": "={{ $json.skills }}"
            },
            {
              "id": "45f77f6b-c436-490c-8970-c9cb8b9949ea",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c1f6c43c-f962-48f7-818b-638105720cad",
      "name": "Log Jobs to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        960,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "link": "={{ $json.link }}",
            "title": "={{ $json.title }}",
            "skills": "={{ $json.skills }}",
            "postedDate": "={{ $json.postedDate }}",
            "description": "={{ $json.description }}"
          },
          "schema": [
            {
              "id": "title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "postedDate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "postedDate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "skills",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1u9TeIArgJPwLn-MV77-lwDwNiZ8qZscZnkuK1xev6YA/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1u9TeIArgJPwLn-MV77-lwDwNiZ8qZscZnkuK1xev6YA",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1u9TeIArgJPwLn-MV77-lwDwNiZ8qZscZnkuK1xev6YA/edit?usp=drivesdk",
          "cachedResultName": "Upwork job scraper"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "0e05d038-bb10-4cd2-847c-c38ecafe47f4",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        -1420
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 1620,
        "content": "## \ud83c\udf10 **Section 1: Data Scraping Automation**\n\n> \ud83e\udde0 *\u201cTell me what\u2019s trending!\u201d*\n\n### \ud83d\udd01 Nodes Combined:\n\n* \ud83d\udd52 `Check Upwork Jobs - Trigger`\n* \ud83c\udf10 `Fetch Upwork Jobs from Apify`\n\n---\n\n### \u2699\ufe0f What This Section Does:\n\nThis section automates the process of **scraping fresh job listings from Upwork** using Apify.\n\n### \ud83e\udde9 Step-by-Step Breakdown:\n\n#### \ud83d\udd52 1. `Check Upwork Jobs - Trigger`\n\n\ud83d\udd70 **Trigger Type**: Scheduled\nThis node automatically **starts the workflow at specific times** (e.g., every hour, daily, etc.).\n\n\ud83d\udccc **Why this matters**:\nYou don\u2019t have to manually run anything! Just set it once, and n8n will check for new job listings on its own \u2014 like a robot assistant.\n\n---\n\n#### \ud83c\udf10 2. `Fetch Upwork Jobs from Apify`\n\n\ud83d\udce4 **HTTP Request** \u2192 **Apify API**\n\nThis node sends a `POST` request to [Apify](https://apify.com), where you've configured a **web scraping actor** to collect data from **Upwork job listings**.\n\n\ud83d\udce5 **Response**: A JSON array of job data, including:\n\n* \ud83d\udccc `title` \u2013 What the job is about\n* \ud83d\udcdd `description` \u2013 A short job overview\n* \ud83c\udfaf `skills` \u2013 Required skills\n* \ud83d\uddd3 `postedDate` \u2013 When it was posted\n* \ud83d\udd17 `link` \u2013 Direct link to the job\n\n\u2705 **Why Apify?**\nBecause Upwork\u2019s API is **not public**, Apify acts as your friendly bot that **scrapes the job board safely and returns structured data**.\n\n\ud83d\udca1 **Pro Tip**: You can customize your Apify actor to filter by keyword (e.g., `AI`, `Python`, `Design`, etc.).\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d5ef38cd-796c-48bf-ac16-7180b22dea39",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        620,
        -1500
      ],
      "parameters": {
        "color": 6,
        "width": 480,
        "height": 1700,
        "content": "## \ud83d\udcca **Section 2: Data Transformation & Logging**\n\n> \ud83e\udde0 *\u201cLet\u2019s clean this up and put it somewhere useful.\u201d*\n\n### \ud83d\udd01 Nodes Combined:\n\n* \u270f\ufe0f `Format Job Data`\n* \ud83d\udcc4 `Log Jobs to Google Sheets`\n\n---\n\n### \ud83e\udde9 Step-by-Step Breakdown:\n\n#### \u270f\ufe0f 3. `Format Job Data`\n\n\ud83e\uddf9 **Field Cleaner / Formatter**\n\nThis node helps you:\n\n* Extract only **relevant fields** from the Apify response\n* Optionally **rename or restructure fields** (like mapping `postedDate` to `Date Posted`)\n* Prepare the data in a clean format so it's ready for Google Sheets\n\n\ud83d\udccc Example Output:\n\n```json\n{\n  \"Job Title\": \"Build AI chatbot\",\n  \"Skills\": \"LangChain, Python\",\n  \"Posted Date\": \"2025-06-06\",\n  \"Link\": \"https://upwork.com/jobs/...\"\n}\n```\n\n\ud83d\udca1 **Why This Matters**: Raw data isn\u2019t always useful. This node ensures that what goes into Google Sheets is **clean, consistent, and human-readable**.\n\n---\n\n#### \ud83d\udcc4 4. `Log Jobs to Google Sheets`\n\n\ud83d\udcd1 **Append Data to Sheet**\n\nThis node takes the formatted job data and **adds it to a Google Sheet** row by row.\n\n\ud83d\udccc Each job becomes a row with columns:\n\n| Job Title    | Skills            | Posted Date | Link                                                    |\n| ------------ | ----------------- | ----------- | ------------------------------------------------------- |\n| Build AI Bot | Python, LangChain | 2025-06-06  | [https://upwork.com/jobs/](https://upwork.com/jobs/)... |\n\n\u2705 **Why Use Google Sheets?**\n\n* You can **analyze market trends** easily\n* Share with your team\n* Build charts, dashboards, or even connect to Looker Studio\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8af7a509-a4a9-480b-b687-49a3056e27e1",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        -1400
      ],
      "parameters": {
        "color": 4,
        "width": 1300,
        "height": 320,
        "content": "=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
      },
      "typeVersion": 1
    },
    {
      "id": "773ea8c5-702e-4080-818b-12f0dc93579f",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        -1060
      ],
      "parameters": {
        "color": 4,
        "width": 1289,
        "height": 3058,
        "content": "## \ud83c\udf10 **Section 1: Data Scraping Automation**\n\n> \ud83e\udde0 *\u201cTell me what\u2019s trending!\u201d*\n\n### \ud83d\udd01 Nodes Combined:\n\n* \ud83d\udd52 `Check Upwork Jobs - Trigger`\n* \ud83c\udf10 `Fetch Upwork Jobs from Apify`\n\n---\n\n### \u2699\ufe0f What This Section Does:\n\nThis section automates the process of **scraping fresh job listings from Upwork** using Apify.\n\n### \ud83e\udde9 Step-by-Step Breakdown:\n\n#### \ud83d\udd52 1. `Check Upwork Jobs - Trigger`\n\n\ud83d\udd70 **Trigger Type**: Scheduled\nThis node automatically **starts the workflow at specific times** (e.g., every hour, daily, etc.).\n\n\ud83d\udccc **Why this matters**:\nYou don\u2019t have to manually run anything! Just set it once, and n8n will check for new job listings on its own \u2014 like a robot assistant.\n\n---\n\n#### \ud83c\udf10 2. `Fetch Upwork Jobs from Apify`\n\n\ud83d\udce4 **HTTP Request** \u2192 **Apify API**\n\nThis node sends a `POST` request to [Apify](https://apify.com), where you've configured a **web scraping actor** to collect data from **Upwork job listings**.\n\n\ud83d\udce5 **Response**: A JSON array of job data, including:\n\n* \ud83d\udccc `title` \u2013 What the job is about\n* \ud83d\udcdd `description` \u2013 A short job overview\n* \ud83c\udfaf `skills` \u2013 Required skills\n* \ud83d\uddd3 `postedDate` \u2013 When it was posted\n* \ud83d\udd17 `link` \u2013 Direct link to the job\n\n\u2705 **Why Apify?**\nBecause Upwork\u2019s API is **not public**, Apify acts as your friendly bot that **scrapes the job board safely and returns structured data**.\n\n\ud83d\udca1 **Pro Tip**: You can customize your Apify actor to filter by keyword (e.g., `AI`, `Python`, `Design`, etc.).\n\n---\n\n## \ud83d\udcca **Section 2: Data Transformation & Logging**\n\n> \ud83e\udde0 *\u201cLet\u2019s clean this up and put it somewhere useful.\u201d*\n\n### \ud83d\udd01 Nodes Combined:\n\n* \u270f\ufe0f `Format Job Data`\n* \ud83d\udcc4 `Log Jobs to Google Sheets`\n\n---\n\n### \ud83e\udde9 Step-by-Step Breakdown:\n\n#### \u270f\ufe0f 3. `Format Job Data`\n\n\ud83e\uddf9 **Field Cleaner / Formatter**\n\nThis node helps you:\n\n* Extract only **relevant fields** from the Apify response\n* Optionally **rename or restructure fields** (like mapping `postedDate` to `Date Posted`)\n* Prepare the data in a clean format so it's ready for Google Sheets\n\n\ud83d\udccc Example Output:\n\n```json\n{\n  \"Job Title\": \"Build AI chatbot\",\n  \"Skills\": \"LangChain, Python\",\n  \"Posted Date\": \"2025-06-06\",\n  \"Link\": \"https://upwork.com/jobs/...\"\n}\n```\n\n\ud83d\udca1 **Why This Matters**: Raw data isn\u2019t always useful. This node ensures that what goes into Google Sheets is **clean, consistent, and human-readable**.\n\n---\n\n#### \ud83d\udcc4 4. `Log Jobs to Google Sheets`\n\n\ud83d\udcd1 **Append Data to Sheet**\n\nThis node takes the formatted job data and **adds it to a Google Sheet** row by row.\n\n\ud83d\udccc Each job becomes a row with columns:\n\n| Job Title    | Skills            | Posted Date | Link                                                    |\n| ------------ | ----------------- | ----------- | ------------------------------------------------------- |\n| Build AI Bot | Python, LangChain | 2025-06-06  | [https://upwork.com/jobs/](https://upwork.com/jobs/)... |\n\n\u2705 **Why Use Google Sheets?**\n\n* You can **analyze market trends** easily\n* Share with your team\n* Build charts, dashboards, or even connect to Looker Studio\n\n\ud83d\udca1 **Bonus Tip**: Add filters or conditional formatting to highlight certain keywords or top-paying jobs!\n\n---\n\n## \ud83c\udfaf Why This Workflow is Powerful (Even for Beginners)\n\n\u2705 **No coding required** \u2013 You\u2019re using no-code tools like n8n, Apify, and Google Sheets\n\u2705 **Automated** \u2013 Runs while you sleep \ud83c\udf19\n\u2705 **Real-time market insights** \u2013 Know what clients are looking for (great for freelancers, agencies, product devs)\n\u2705 **Extendable** \u2013 Add Telegram alerts, Airtable dashboards, or link it with Notion or CRMs!\n\n---\n\n## \ud83d\udccc What You Can Do Next:\n\n| Task                      | Tool                              | Outcome                                   |\n| ------------------------- | --------------------------------- | ----------------------------------------- |\n| \u2705 Add deduplication logic | Google Sheets or n8n `IF` node    | Avoid storing duplicate jobs              |\n| \u2705 Filter by skill/keyword | Apify task input                  | Focus on niche markets                    |\n| \u2705 Connect to Airtable     | Replace Sheets with Airtable node | Richer dashboards and tagging             |\n| \u2705 Set alerts              | Email/Telegram node               | Be the first to apply or inform your team |\n\n---\n\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ad7a638f-061a-4ab9-aa96-9d2b13f67c5c",
  "connections": {
    "Format scrape Data": {
      "main": [
        [
          {
            "node": "Log Jobs to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Upwork Jobs - Trigger": {
      "main": [
        [
          {
            "node": "Fetch Upwork Jobs using Apify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Upwork Jobs using Apify": {
      "main": [
        [
          {
            "node": "Format scrape Data",
            "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.

Pro

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

About this workflow

This cutting-edge n8n automation is a sophisticated job market intelligence tool designed to transform freelance job tracking into a seamless, data-driven process. By intelligently connecting Apify, data processing, and Google Sheets, this workflow: Discovers Job Opportunities:…

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

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

This workflow automates tax compliance by aggregating multi-channel revenue data, calculating jurisdiction-specific tax obligations, detecting anomalies, and generating submission-ready reports for ta

Gmail, Google Sheets, Airtable +1
Data & Sheets

Blog Automation Pipeline A — Content Generation. Uses googleSheets, httpRequest. Scheduled trigger; 28 nodes.

Google Sheets, HTTP Request
Data & Sheets

This n8n workflow automatically finds apartments for rent in Germany, filters them by your city, rent budget, and number of rooms, and applies to them via email. Each application includes: A personali

HTTP Request, Google Drive, Email Send +1
Data & Sheets

The automation process consists of four main steps: Get Longform: Retrieve the long-form video data (e.g., from Google Sheets). Analyze Longform: Use Clap to analyze the video and generate short clips

Google Sheets, HTTP Request
Data & Sheets

This n8n workflow automates the end-to-end client onboarding process: capturing client details, validating emails, assigning tiers, generating welcome packs, creating tasks, notifying teams, archiving

Google Sheets, Gmail, Airtable +5