Agrégateur et notificateur d'offres d'emploi Upwork

Intermédiaire

Ceci est unOther, AIworkflow d'automatisation du domainecontenant 13 nœuds.Utilise principalement des nœuds comme Set, Gmail, HttpRequest, GoogleSheets, Agent, combinant la technologie d'intelligence artificielle pour une automatisation intelligente. Recherche automatisée d'emplois : agrégation des opportunités Upwork et notifications IA

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "Q4LhFRDraaQuorBs",
  "meta": {
    "instanceId": "84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db",
    "templateCredsSetupCompleted": true
  },
  "name": "Upwork Job Aggregator & Notifier",
  "tags": [],
  "nodes": [
    {
      "id": "834d0a42-1398-4cd4-aaf3-b1164e00b4a8",
      "name": "Déclencheur Quotidien d'Offres Upwork",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a0d54dfe-fc68-4020-b2ed-d191a57d5897",
      "name": "Récupérer les Offres Upwork (Apify)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        220,
        0
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/actor-tasks/<YOUR_TASK_ID>/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>",
        "method": "POST",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "a9812fc7-0fa5-492a-91aa-392d0c8ee43b",
      "name": "Formater les Champs d'Offre",
      "type": "n8n-nodes-base.set",
      "position": [
        440,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "24bd782a-a34f-4b98-8d8f-21763181677b",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "ee879b3d-339a-44c2-9e11-f653edab2e7f",
              "name": "url",
              "type": "string",
              "value": "={{ $json.url }}"
            },
            {
              "id": "b5ff7975-667b-4997-ac8f-acbe9a3b3b85",
              "name": "description",
              "type": "string",
              "value": "={{ $json.description }}"
            },
            {
              "id": "29051fc3-e4f8-4e39-a024-d7b943271acc",
              "name": "budget",
              "type": "string",
              "value": "={{ $json.budget }}"
            },
            {
              "id": "a6492128-a58a-4735-b427-12265f81da3a",
              "name": "datePosted",
              "type": "string",
              "value": "={{ $json.datePosted }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a996aa35-8f0d-4e1a-997b-4aadd402f65c",
      "name": "Enregistrer les Offres dans la Feuille Google",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        740,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "url": "={{ $json.url }}",
            "title": "={{ $json.title }}",
            "budget": "={{ $json.budget }}",
            "datePosted": "={{ $json.datePosted }}",
            "description": "={{ $json.description }}"
          },
          "schema": [
            {
              "id": "title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "budget",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "budget",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "datePosted",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "datePosted",
              "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/1dEU6uMB4ehiGXjIExjtFQHvUjANRODawKMBGKDaTcEc/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1dEU6uMB4ehiGXjIExjtFQHvUjANRODawKMBGKDaTcEc",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dEU6uMB4ehiGXjIExjtFQHvUjANRODawKMBGKDaTcEc/edit?usp=drivesdk",
          "cachedResultName": "Upwork Scraper"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "v021NCWuTwSSSXPP",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "e0cd68e5-4d6d-479a-8a48-1faccc9f3ff7",
      "name": "Résumer les Annonces d'Offres",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        960,
        0
      ],
      "parameters": {
        "text": "=Provide a summary of the upwork jobs. It should be in email format\n\nTitle: {{ $json.title }}\nURL: {{ $json.url }}\nDescription:{{ $json.description }}\nBudget:{{ $json.budget }}\nDate posted: {{ $json.datePosted }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "30002e32-6046-4e5c-a27f-a0d58f380ae9",
      "name": "Envoyer l'Email de Résumé des Offres",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1500,
        0
      ],
      "webhookId": "6937d724-5ede-4c56-83fd-fde84496eabd",
      "parameters": {
        "sendTo": "shahkar.genai@gmail.com",
        "message": "={{ $json.output.Summary }}",
        "options": {},
        "subject": "={{ $json.output.subject }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "YMHjS2nJsRGP7svY",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "a1fb5d66-b780-4b6b-96be-3391b6196301",
      "name": "Résumeur d'Offres OpenAI",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        900,
        260
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "wYwTjEv45IzlAOAu",
          "name": "OpenAi account 2"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f79a7336-80fc-4832-862b-51d0d737d5a3",
      "name": "Analyser la Sortie du Résumé",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1160,
        260
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"subject\": \"Upwork Job Opportunity: Webflow Expert Needed for Portfolio Website\",\n  \"Summary\": \"The client is seeking a designer with strong experience in Webflow to create a responsive and elegant portfolio site.\"\n}\n"
      },
      "typeVersion": 1.2
    },
    {
      "id": "85465ead-0a06-455c-9308-866c092d8ef5",
      "name": "Note Adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -60,
        -560
      ],
      "parameters": {
        "color": 3,
        "width": 640,
        "height": 760,
        "content": "### 🔁 **Section 1: Job Fetch & Preparation**\n\n📦 **Group Name**: `📥 Fetch & Prepare Upwork Jobs`\n\n#### ✅ **Included Nodes:**\n\n1. `🕒 Daily Upwork Job Trigger`\n2. `🌐 Fetch Upwork Jobs (Apify)`\n3. `🛠️ Format Job Fields`\n\n#### 📋 **What this group does:**\n\nThis group is responsible for automatically triggering the job search, pulling fresh job data from Upwork (via Apify), and formatting that data into a clean, structured format.\n\n#### 📌 **Highlights:**\n\n* Uses Apify’s `run-sync-get-dataset-items` to ensure you get fresh job results in one go.\n* Ensures only the required fields (like title, URL, budget) are passed forward.\n* Keeps your data clean and minimal for logging and summarization.\n\n---"
      },
      "typeVersion": 1
    },
    {
      "id": "3699ba73-75ee-4bf2-91eb-8d0d05143321",
      "name": "Note Adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        680,
        -620
      ],
      "parameters": {
        "color": 5,
        "width": 620,
        "height": 1040,
        "content": "### 📊 **Section 2: Data Logging & Summary Generation**\n\n📦 **Group Name**: `🧾 Log & Summarize Jobs`\n\n#### ✅ **Included Nodes:**\n\n1. `📈 Log Jobs to Google Sheet`\n2. `🤖 Summarize Job Listings`\n\n   * `🧠 OpenAI Job Summarizer`\n   * `📄 Parse Summary Output`\n\n#### 📋 **What this group does:**\n\nThis group handles the dual responsibility of:\n\n* Persistently logging all job entries to a **Google Sheet**\n* Generating a human-friendly **natural language summary** of the fetched jobs using the OpenAI model and parsing the result into clean output\n\n#### 💡 **Why this matters:**\n\n* Keeps historical records in Sheets ✅\n* Makes email digest more meaningful and less overwhelming for the reader 🧠\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2289feb5-9ab1-4dbb-a77e-f4742f0f341d",
      "name": "Note Adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1400,
        -420
      ],
      "parameters": {
        "color": 6,
        "width": 340,
        "height": 600,
        "content": "## 📤 **Section 3: Job Summary Notification**\n\n📦 **Group Name**: `✉️ Notify via Email`\n\n#### ✅ **Included Node:**\n\n1. `📧 Send Job Summary Email`\n\n#### 📋 **What this group does:**\n\nSends a **summary email** to the desired recipient(s) with the content generated by the AI agent.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "95727922-4856-4481-acff-519638ac5d23",
      "name": "Note Adhésive9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1520,
        -560
      ],
      "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": "c161b105-70a6-431a-91e2-9031ccba8fe4",
      "name": "Note Adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1520,
        -220
      ],
      "parameters": {
        "color": 4,
        "width": 1289,
        "height": 3058,
        "content": "# ✅ n8n Automation: \"Upwork Job Aggregator & Notifier\"\n\n> **Purpose**: Automatically fetch job postings from Upwork with specific keywords, save them in Google Sheets, summarize them using AI, and email the results daily (or at any interval you want).\n\n---\n\n## 🧱 HIGH-LEVEL OVERVIEW\n\n| Feature         | Description                                          |\n| --------------- | ---------------------------------------------------- |\n| 🕐 Trigger      | Scheduled (e.g., every 6 hours)                      |\n| 🌐 Source       | [Apify](https://apify.com) actor for Upwork scraping |\n| 📄 Storage      | Google Sheets                                        |\n| 🧠 Summary      | OpenAI model with structured output                  |\n| 📬 Notification | Gmail with formatted job summary                     |\n\n---\n\n## 🧠 GROUP 1: 📥 Fetch & Prepare Upwork Jobs\n\n### 🟢 Nodes:\n\n1. `🕒 Daily Upwork Job Trigger`\n\n   * **Type**: Cron Trigger\n   * **Purpose**: Runs the flow automatically at your set interval (e.g., every 6 hours or daily)\n\n2. `🌐 Fetch Upwork Jobs (Apify)`\n\n   * **Type**: HTTP Request\n   * **Method**: POST\n   * **URL**: `https://api.apify.com/v2/actor-tasks/<TASK_ID>/run-sync-get-dataset-items?token=<API_TOKEN>`\n   * **Purpose**: Calls your Apify Upwork Scraper task to get the latest job listings\n   * **Output**: JSON array of job objects\n\n3. `🛠️ Format Job Fields`\n\n   * **Type**: Edit Fields (Set or Function Node)\n   * **Purpose**: Extracts needed job fields like `title`, `url`, `description`, `budget`, and `datePosted`\n   * **Reason**: Makes data uniform for Sheet storage and AI summary\n\n---\n\n## 📊 GROUP 2: 🧾 Log & Summarize Jobs\n\n### 🟢 Nodes:\n\n4. `📈 Log Jobs to Google Sheet`\n\n   * **Type**: Google Sheets → Append Sheet\n   * **Sheet Setup**: Must have headers like `Title`, `URL`, `Description`, `Budget`, `Date`\n   * **Purpose**: Appends each new job as a row in the sheet for historical tracking\n\n5. `🤖 Summarize Job Listings` (AI Agent node group)\n\n   * **Type**: Tools Agent (LangChain / OpenAI Integration)\n   * **Connected Sub-Nodes**:\n\n     * `🧠 OpenAI Job Summarizer` (OpenAI Chat Model)\n\n       * **Prompt** example:\n\n         ```\n         You are an assistant summarizing freelance job postings. Summarize each job in 1-2 lines. Include title, budget, and a short description.\n         ```\n     * `📄 Parse Summary Output` (Structured Output Parser)\n\n       * **Purpose**: Converts the AI response into structured n8n items\n   * **Input**: Job data from Google Sheets\n   * **Output**: A clear, natural language summary of all jobs\n\n---\n\n## 📤 GROUP 3: ✉️ Notify via Email\n\n### 🟢 Node:\n\n6. `📧 Send Job Summary Email`\n\n   * **Type**: Gmail → Send Message\n\n   * **Authentication**: Google OAuth2\n\n   * **To**: Yourself or your team\n\n   * **Subject**: `\"🚀 New Upwork Jobs Found!\"`\n\n   * **Body**:\n\n     ```\n     Hello,\n\n     Here’s a summary of the latest Upwork jobs matching your criteria:\n\n     {{summary from AI}}\n\n     ➕ View full job list here: [Google Sheet Link]\n\n     Best,  \n     Your Automation Bot 🤖\n     ```\n\n   * **Error Handling**: Add an IF node to prevent email if no jobs were returned (optional)\n\n---\n\n## 🗂 Suggested Color-Coded Groups in n8n:\n\n| Group                          | Nodes                                | Color     | Description                     |\n| ------------------------------ | ------------------------------------ | --------- | ------------------------------- |\n| 📥 Fetch & Prepare Upwork Jobs | Trigger, HTTP Request, Format Fields | 🟢 Green  | Gets data and prepares it       |\n| 🧾 Log & Summarize Jobs        | Google Sheets, AI Agent, Parser      | 🟡 Yellow | Logs + creates smart summaries  |\n| ✉️ Notify via Email            | Gmail                                | 🔴 Red    | Notifies you with clean summary |\n\n---\n\n## 🚀 ADVANTAGES\n\n✅ Completely automated\n✅ Saves all job history\n✅ AI-enhanced summaries\n✅ Instant email alerts\n✅ Easy to expand or customize\n\n---\n\n## 🧩 Bonus Enhancements (Optional)\n\n| Idea                      | Description                                                   |\n| ------------------------- | ------------------------------------------------------------- |\n| 🔍 Add keyword filters    | Add filters before saving to Sheets (e.g., only “React” jobs) |\n| 🕵️‍♂️ Prevent duplicates | Store job IDs and check before saving                         |\n| 📣 Add Slack alerts       | Add Slack node for team notification                          |\n| 📊 Dashboard              | Build Google Data Studio report over the Sheet                |\n\n---\n\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {
    "Fetch Upwork Jobs (Apify)": [
      {
        "json": {
          "url": "https://www.upwork.com/job/Looking-Webflow-Expert-Build-Portfolio-Website_~01abcd123456efghij",
          "title": "Looking for a Webflow Expert to Build a Portfolio Website",
          "budget": "$300",
          "datePosted": "2025-06-03T08:45:00Z",
          "description": "Need a designer with strong Webflow experience to create a responsive and elegant portfolio site."
        }
      },
      {
        "json": {
          "url": "https://www.upwork.com/job/React-Developer-Needed-SaaS-Dashboard_~0123abcd4567efghij",
          "title": "React Developer Needed for SaaS Dashboard",
          "budget": "$500",
          "datePosted": "2025-06-03T06:30:00Z",
          "description": "Looking for an experienced React developer to work on our SaaS product dashboard UI. Experience with Tailwind is a plus."
        }
      },
      {
        "json": {
          "url": "https://www.upwork.com/job/Copywriter-Landing-Page-Finance_~0a1b2c3d4e5f67890",
          "title": "Copywriter for Landing Page Content (Finance Industry)",
          "budget": "$150",
          "datePosted": "2025-06-02T21:15:00Z",
          "description": "We need SEO-optimized copy for a fintech landing page. Prior experience in finance writing preferred."
        }
      }
    ]
  },
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "8c929fc6-2198-4adf-89c3-ff0a2b296fdd",
  "connections": {
    "a9812fc7-0fa5-492a-91aa-392d0c8ee43b": {
      "main": [
        [
          {
            "node": "a996aa35-8f0d-4e1a-997b-4aadd402f65c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f79a7336-80fc-4832-862b-51d0d737d5a3": {
      "ai_outputParser": [
        [
          {
            "node": "e0cd68e5-4d6d-479a-8a48-1faccc9f3ff7",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "a1fb5d66-b780-4b6b-96be-3391b6196301": {
      "ai_languageModel": [
        [
          {
            "node": "e0cd68e5-4d6d-479a-8a48-1faccc9f3ff7",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "e0cd68e5-4d6d-479a-8a48-1faccc9f3ff7": {
      "main": [
        [
          {
            "node": "30002e32-6046-4e5c-a27f-a0d58f380ae9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "834d0a42-1398-4cd4-aaf3-b1164e00b4a8": {
      "main": [
        [
          {
            "node": "a0d54dfe-fc68-4020-b2ed-d191a57d5897",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a996aa35-8f0d-4e1a-997b-4aadd402f65c": {
      "main": [
        [
          {
            "node": "e0cd68e5-4d6d-479a-8a48-1faccc9f3ff7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a0d54dfe-fc68-4020-b2ed-d191a57d5897": {
      "main": [
        [
          {
            "node": "a9812fc7-0fa5-492a-91aa-392d0c8ee43b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire - Autres, Intelligence Artificielle

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds13
Catégorie2
Types de nœuds9
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Auteur
Yaron Been

Yaron Been

@yaron-nofluff

Building AI Agents and Automations | Growth Marketer | Entrepreneur | Book Author & Podcast Host If you need any help with Automations, feel free to reach out via linkedin: https://www.linkedin.com/in/yaronbeen/ And check out my Youtube channel: https://www.youtube.com/@YaronBeen/videos

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34