AutomationFlowsWeb Scraping › Automate Job Opportunity Digests with Openrouter Gpt-5 and Email

Automate Job Opportunity Digests with Openrouter Gpt-5 and Email

ByJulian Kaiser @jksr on n8n.io

Automate your n8n community job board monitoring with this intelligent workflow that scrapes, analyzes, and delivers opportunities straight to your inbox. Perfect for freelancers, agencies, and developers looking to stay on top of n8n automation projects without manual checking.…

Cron / scheduled trigger★★★★☆ complexityAI-powered18 nodesHTTP RequestOutput Parser StructuredOpenRouter ChatChain LlmEmail Send
Web Scraping Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Chainllm → Emailsend 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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "dc1dcca4-8789-4403-841a-690878eb0a53",
      "name": "Each post",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        576,
        -96
      ],
      "parameters": {
        "url": "={{ $json[\"jobLink\"] }}",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 10,
              "batchInterval": 5000
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3b059cf0-931e-4ce1-8354-11382920d3d0",
      "name": "Extract title & description",
      "type": "n8n-nodes-base.html",
      "position": [
        864,
        -240
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "jobDescription",
              "attribute": "content",
              "cssSelector": "meta[property=\"og:description\"]",
              "returnValue": "attribute"
            },
            {
              "key": "jobTitle",
              "attribute": "content",
              "cssSelector": "meta[property=\"og:title\"]",
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6b041491-47c6-4194-98ab-c410631b16e7",
      "name": "Last 7 days",
      "type": "n8n-nodes-base.filter",
      "position": [
        352,
        32
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "551c6c94-a861-47b7-8850-32fadf883736",
              "operator": {
                "type": "dateTime",
                "operation": "after"
              },
              "leftValue": "={{ $json.date }}",
              "rightValue": "={{$now.minus({days: 7})}} "
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "16422542-708f-4af7-8ecc-b0633fa55beb",
      "name": "Get list page",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -320,
        32
      ],
      "parameters": {
        "url": "https://community.n8n.io/c/jobs/13",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "971564de-3d6b-4f55-bfd8-4c4c80635885",
      "name": "Extract posts",
      "type": "n8n-nodes-base.html",
      "position": [
        -96,
        32
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "jobLink",
              "attribute": "href",
              "cssSelector": ".raw-link",
              "returnArray": true,
              "returnValue": "attribute"
            },
            {
              "key": "date",
              "cssSelector": ".topic-list-item td:last-child",
              "returnArray": true
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d69d273d-f319-4473-8322-846bdd6c85b7",
      "name": "Merge objects",
      "type": "n8n-nodes-base.code",
      "position": [
        128,
        32
      ],
      "parameters": {
        "jsCode": "// Input data from previous node is available in items array\nconst jobLinks = items[0].json[\"jobLink\"];\nconst dates = items[0].json.date;\n\n// Create new array of merged objects\nconst merged = jobLinks.map((link, index) => ({\n  \"jobLink\": link,\n  \"date\": dates[index],\n  \"source\": \"n8n-forum\"\n}));\n\n// Return the merged data\nreturn merged.map(item => ({ json: item }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1237545b-bc8f-4e40-a1f9-be7715d88a1a",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        944,
        288
      ],
      "parameters": {
        "jsonSchemaExample": "{\n\t\"summary\": \"What the client is looking to build\"\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "86eb1d6b-5fe5-4468-995c-6890286d6432",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        816,
        288
      ],
      "parameters": {
        "model": "openai/gpt-5-mini",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d3bbfe52-65a6-489c-9cba-bd6cf79f0bf2",
      "name": "Generate Job Summary",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        800,
        64
      ],
      "parameters": {
        "text": "=<content> {{ $('Each post').item.json.data }} </content>",
        "messages": {
          "messageValues": [
            {
              "message": "=<prompt>\n    <purpose>\n        Based on this HTML your task is to provide a summary of what the client is looking to build with the automation software n8n\n    </purpose>\n\n    <instructions>\n        <instruction>Output in json format</instruction>\n        <instruction>Give a high level summary of what the client wants to build</instruction>\n        <instruction>Make sure to only distill the relevant text from all the HTML input</instruction>\n    </instructions>\n</prompt>"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "executeOnce": false,
      "typeVersion": 1.5
    },
    {
      "id": "f4ff7c72-e1e9-4473-9a4a-a9e48f464bd1",
      "name": "Combine Job Data & Summary",
      "type": "n8n-nodes-base.merge",
      "position": [
        1152,
        48
      ],
      "parameters": {
        "mode": "combine",
        "options": {
          "includeUnpaired": false
        },
        "combineBy": "combineByPosition",
        "numberInputs": 3
      },
      "typeVersion": 3
    },
    {
      "id": "84d23d82-e136-4465-8966-4fdbf107dded",
      "name": "Format Summary Output",
      "type": "n8n-nodes-base.code",
      "position": [
        1376,
        64
      ],
      "parameters": {
        "jsCode": "return $input.all().map((item) => ({...item.json, summary:item.json.output.summary, output: undefined}))\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d61c6515-a368-4ee5-bd4d-5508f2b5ff51",
      "name": "Aggregate All Jobs",
      "type": "n8n-nodes-base.code",
      "position": [
        1600,
        64
      ],
      "parameters": {
        "jsCode": "const items = $input.all().map((item) => {\n    const itemJson = item.json;\n    return {\n        ...itemJson\n    }\n})\n\nreturn {data: items}\n"
      },
      "typeVersion": 2
    },
    {
      "id": "2e493107-b36c-4908-b37e-9fe43133e3fd",
      "name": "Send Weekly Job Digest",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1824,
        64
      ],
      "parameters": {
        "html": "={{(() => {\n  const grouped = $json.data.sort((a,b) => new Date(b.date.replace(/\\s/, 'T')) - new Date(a.date.replace(/\\s/, 'T'))).reduce((acc, job) => {\n    const source = job.source === 'n8n-forum' ? 'n8n-forum' : \n                  job.source === 'make-forum' ? 'make-forum' : \n                  'reddit';\n    if (!acc[source]) acc[source] = [];\n    acc[source].push(job);\n    return acc;\n  }, {});\n  \n  return Object.entries(grouped).reduce((html, [source, jobs]) => \n    html + '<div class=\"section\"><h2>' + \n    (source === 'n8n-forum' ? 'n8n Forum Jobs' : \n     source === 'make-forum' ? 'Make Forum Jobs' : \n     'Reddit Jobs') + '</h2>' +\n    jobs.map(job => \n      '<div class=\"job-item\"><h3><a href=\"' + job.jobLink + '\">' + \n      job.jobTitle + '</a></h3><div class=\"date\">Posted: ' + \n      job.date + '</div><div class=\"source\">Source: ' + \n      (job.source === 'n8n-forum' ? 'n8n Forum' : \n       job.source === 'make-forum' ? 'Make Forum' : \n       'Reddit - ' + job.origin) + '</div><p class=\"summary\">' + \n      job.summary + '</p></div>'\n    ).join('') + '</div>',\n    '<!DOCTYPE html><html><head><style>body{font-family:Arial,sans-serif;line-height:1.6;color:#333;max-width:800px;margin:0 auto;padding:20px}.section{margin-bottom:30px}.job-item{border:1px solid #ddd;margin-bottom:20px;padding:15px;border-radius:5px}h2{color:#2c5282;border-bottom:2px solid #2c5282;padding-bottom:10px;margin-top:30px}h3{color:#2c5282;margin:0 0 10px}a{color:#2b6cb0;text-decoration:none}a:hover{text-decoration:underline}.date,.source{color:#666;font-size:0.9em;margin-bottom:8px}.summary{background:#f8f9fa;padding:10px;border-left:4px solid #4299e1;margin:10px 0}</style></head><body><h1>Latest Job Opportunities</h1><p>Generated on: ' + new Date().toLocaleString() + '</p>'\n  ) + '</body></html>';\n})()}}\n",
        "options": {},
        "subject": "Job Opportunities",
        "toEmail": "test@example.com",
        "fromEmail": "test@example.com"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "250a3bdf-9a6c-4c86-a837-1ba70c6c0161",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -656,
        -240
      ],
      "parameters": {
        "width": 320,
        "height": 224,
        "content": "## \ud83c\udfaf WORKFLOW START\nThis workflow scrapes job postings from the n8n community forum,\nuses AI to summarize each opportunity, and emails you a digest.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "caf3a804-e37d-4286-abb8-018933fd10b4",
      "name": "Run Weekly on Monday Morning",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -544,
        32
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * 1"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4b548276-a148-4678-820f-9eef6743f5ed",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        -240
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## \u23f1\ufe0f DATE FILTERING\nOnly processes jobs posted within the last 7 days.\nAdjust the filter condition to change this timeframe.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d3a054f0-121d-4120-b485-271e3119d5b3",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        784,
        432
      ],
      "parameters": {
        "width": 320,
        "height": 176,
        "content": "## \ud83e\udd16 AI EXTRACTION\nUses GPT-5-mini to read the job posting HTML and extract a clear summary \nof what the client wants to build. This makes scanning opportunities much faster!\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2d894203-70de-4283-86cd-fb4c50afa800",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1744,
        -176
      ],
      "parameters": {
        "width": 256,
        "height": 176,
        "content": "## \ud83d\udce7 EMAIL FORMATTING\nCreates a beautiful HTML email with jobs organized by source.\nUpdate the fromEmail and toEmail parameters to your addresses.\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Each post": {
      "main": [
        [
          {
            "node": "Extract title & description",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Job Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Last 7 days": {
      "main": [
        [
          {
            "node": "Combine Job Data & Summary",
            "type": "main",
            "index": 1
          },
          {
            "node": "Each post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract posts": {
      "main": [
        [
          {
            "node": "Merge objects",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get list page": {
      "main": [
        [
          {
            "node": "Extract posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge objects": {
      "main": [
        [
          {
            "node": "Last 7 days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate All Jobs": {
      "main": [
        [
          {
            "node": "Send Weekly Job Digest",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Job Summary": {
      "main": [
        [
          {
            "node": "Combine Job Data & Summary",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Format Summary Output": {
      "main": [
        [
          {
            "node": "Aggregate All Jobs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Job Summary",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Generate Job Summary",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Combine Job Data & Summary": {
      "main": [
        [
          {
            "node": "Format Summary Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract title & description": {
      "main": [
        [
          {
            "node": "Combine Job Data & Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Weekly on Monday Morning": {
      "main": [
        [
          {
            "node": "Get list page",
            "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

Automate your n8n community job board monitoring with this intelligent workflow that scrapes, analyzes, and delivers opportunities straight to your inbox. Perfect for freelancers, agencies, and developers looking to stay on top of n8n automation projects without manual checking.…

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

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Animal advocates & campaigners who want a weekly briefing on animal-related bills with clear, actionable steps—no manual research needed.

OpenRouter Chat, HTTP Request, Information Extractor +3
Web Scraping

This workflow is built for one core purpose: to maximize the return on your reading time. It turns your passive consumption of articles and highlights into an active system for generating original con

HTTP Request, Chain Llm, OpenRouter Chat
Web Scraping

Who is this for? Make.com consultants, automation specialists, and freelancers who want to catch new client opportunities without manually checking the forum.

Output Parser Structured, OpenRouter Chat, HTTP Request +2
Web Scraping

Scraping Articles Dev.to Prod. Uses itemLists, stickyNote, nocoDb, scheduleTrigger. Scheduled trigger; 44 nodes.

Item Lists, Noco Db, HTTP Request +2
Web Scraping

Automated SEO Audit in n8n – Your All-in-One Website Optimization Tool!

HTTP Request, Html Extract, Email Send +2