GmailからSlack:OpenRouter使用のAIスコア付きUpworkワークリマインダー
中級
これはPersonal Productivity, AI Summarization分野の自動化ワークフローで、14個のノードを含みます。主にSet, Gmail, Slack, Filter, Markdownなどのノードを使用。 GmailからSlackへ:OpenRouterを使用したAI評価のUpwork案件通知
前提条件
- •Googleアカウント + Gmail API認証情報
- •Slack Bot Token または Webhook URL
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"meta": {
"instanceId": "9192ad8880fb52b25f18408be81eae9d996a6784a1da3c68d52d3b7ef01d482b",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "0dc258f0-4d50-4bbf-9063-b252f597c245",
"name": "Markdownに変換",
"type": "n8n-nodes-base.markdown",
"position": [
440,
-20
],
"parameters": {
"html": "={{ $('Get Filtered Messages').item.json.textAsHtml }}",
"options": {},
"destinationKey": "markdown"
},
"typeVersion": 1
},
{
"id": "fced2dd2-720f-4534-a459-94f6cd13314b",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
748,
200
],
"parameters": {
"options": {}
},
"credentials": {
"openRouterApi": {
"id": "muXopBcyQsze8BOD",
"name": "OpenRouter | Paper Jam"
}
},
"typeVersion": 1
},
{
"id": "4b04a2bf-29a6-42f6-8e72-c264f092780e",
"name": "既読にする",
"type": "n8n-nodes-base.gmail",
"position": [
220,
-20
],
"webhookId": "212c90ed-2d69-4f54-9f96-7009214490d7",
"parameters": {
"messageId": "={{ $json.id }}",
"operation": "markAsRead"
},
"credentials": {
"gmailOAuth2": {
"id": "dZkZW7tKXuK6yfDP",
"name": "Gmail | Paper Jam"
}
},
"typeVersion": 2.1
},
{
"id": "5c208e16-c987-4bf0-b3f6-27d560b3ce5e",
"name": "フィルタリングされたメッセージを取得",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
0,
-20
],
"parameters": {
"simple": false,
"filters": {
"q": "from:(donotreply@upwork.com) subject:(New job:)"
},
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyX",
"unit": "minutes",
"value": 10
}
]
}
},
"credentials": {
"gmailOAuth2": {
"id": "dZkZW7tKXuK6yfDP",
"name": "Gmail | Paper Jam"
}
},
"typeVersion": 1.2
},
{
"id": "6674d03e-91ca-4c6b-8091-b956920e7d9a",
"name": "Slackアラートを送信",
"type": "n8n-nodes-base.slack",
"position": [
1860,
-20
],
"webhookId": "f0b47490-d6ac-40ce-9f4f-8c115d6ef51b",
"parameters": {
"text": "=🚨 *New Upwork Job Opportunity!*\n----\n\n*{{ $json.job.jobName.toUpperCase() }}*\n_{{ $json.job.descriptionSnippet }}..._\n\n🗺️ {{ $json.job.country }}\n{{ $json.output.paymentVerified ? \"✅ Payment verified\" : \"❌ Payment not verified\" }}\n🕧 {{ $json.job.jobType }} | {{ $json.job.price }}\n🏷️ {{ $json.job.tags.map(tag => `\\`${tag}\\``).join(', ') }}\n⭐ {{ $json.job.clientRating }}\n💰 {{ $json.job.amountSpent }}\n🏆 {{ $json.job.experienceLevel }}\n📆 Posted {{ $json.job.postedAt }}\n\n----\n*AI EVALUATION*\nScore: *{{ $json.evaluation.score }}*\n_{{ $json.evaluation.reasoning }}_\n---\n\n_View this job:_ {{ $json.job.jobDetailUrl }}\n\n",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C090EHUFGEN",
"cachedResultName": "testing"
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"id": "awboaOk6Kh1kQZ7N",
"name": "Slack | Paper Jam"
}
},
"typeVersion": 2.3
},
{
"id": "0b9a8a79-3639-4a83-ac4d-9bbd22adef5e",
"name": "OpenRouter Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1124,
200
],
"parameters": {
"options": {}
},
"credentials": {
"openRouterApi": {
"id": "muXopBcyQsze8BOD",
"name": "OpenRouter | Paper Jam"
}
},
"typeVersion": 1
},
{
"id": "e282e1a2-70c7-40ca-a394-33e33976f855",
"name": "フィールドを編集",
"type": "n8n-nodes-base.set",
"position": [
1440,
-20
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "43e777e8-2442-4cc9-8b58-65f1e8f591e5",
"name": "evaluation",
"type": "object",
"value": "={{ $json.output }}"
},
{
"id": "a2c26763-047f-4360-984a-272b88fe3bcc",
"name": "job",
"type": "object",
"value": "={{ $('Job Data Extractor').item.json.output }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "37767da3-90bc-42c5-8fe4-a8d45be89cf3",
"name": "付箋",
"type": "n8n-nodes-base.stickyNote",
"position": [
-60,
-240
],
"parameters": {
"color": 7,
"width": 660,
"height": 460,
"content": "## Fetch and format emails\n\nHere we use a Gmail search query to find all Upwork job alerts, and format the message body for LLM analysis. An Upwork Freelancer Plus subscription is required in order to receive job alerts.\n\nIMPORTANT: We're polling Gmail for new messages every 10 minutes. This will use a workflow execution each time. You may want to adjust this frequency based on the amount of workflow executions you want to use."
},
"typeVersion": 1
},
{
"id": "96107c5a-8311-4836-a51e-09ce43994892",
"name": "付箋1",
"type": "n8n-nodes-base.stickyNote",
"position": [
640,
-240
],
"parameters": {
"color": 7,
"width": 320,
"height": 460,
"content": "## Extract data from job\n\nPull out job information like country, price, etc."
},
"typeVersion": 1
},
{
"id": "a8e422da-0984-4090-abde-eb2344dc2b28",
"name": "付箋2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1000,
-240
],
"parameters": {
"color": 7,
"width": 340,
"height": 460,
"content": "## Score the skillset match\n\nREQUIRED: Replace the placeholder text in the prompt between the <my_profile> tags with your own freelancer profile. Be as detailed as possible to achieve the best results."
},
"typeVersion": 1
},
{
"id": "51b4e572-fe95-41ca-8ef1-e6638d6cbe8c",
"name": "スコアでフィルタリング",
"type": "n8n-nodes-base.filter",
"position": [
1640,
-20
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ab20e70f-c9e3-4873-ab6a-e975dffefa35",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.evaluation.score }}",
"rightValue": 7
}
]
}
},
"typeVersion": 2.2
},
{
"id": "bf621b43-05bd-47c2-bd29-4484400dff62",
"name": "Opportunity Scorer",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
1040,
-20
],
"parameters": {
"text": "=**Situation**\nYou are an expert job matching analyst specializing in freelance opportunities. You'll evaluate the compatibility between my professional profile (skills, experience, and preferences) and Upwork job listings to determine how well we match.\n\n**Task**\nAnalyze the provided Upwork job details against my skills and preferences, then generate a comprehensive match score on a scale of 1-10, where 10 indicates an exceptional match and 1 indicates a poor fit.\n\n**Objective**\nHelp me identify the most suitable job opportunities that align with my capabilities and preferences, saving me time by focusing only on highly compatible positions.\n\n**Knowledge**\n- The job information includes: job name, job type (hourly/fixed), price range, description snippet, country, payment verification status, client rating, amount spent, relevant tags, posting date, and required experience level\n- The description snippet provides limited information about the job requirements\n- Primary matching factors: job name, description snippet, and tags\n- Secondary matching factors: experience level, job type, and payment amount\n- My skills and preferences will be provided in my request\n\nWhen analyzing the match:\n1. Evaluate technical skill alignment based on job name, description snippet, and tags first and foremost\n2. Consider experience level requirements\n3. Factor in my stated job type preferences (hourly vs. fixed), if provided\n4. Account for payment range alignment with my expectations, if provided\n5. Assess if the job description suggests requirements outside my capabilities\n6. Consider any specific preferences I've mentioned (location, industry, etc.)\n\nYou must provide a nuanced, honest assessment of the match quality rather than inflating scores. For each match score, provide brief but specific reasoning explaining why the score was assigned, highlighting both strengths and potential misalignments.\n\n<my_profile>\nREPLACE THIS WITH YOUR PROFILE. BELOW IS AN EXAMPLE PROFILE.\nI’m a seasoned web designer with over 8 years of experience crafting modern, user-friendly websites for startups, agencies, and global brands. My work spans across responsive design, UI/UX optimization, and full website redesigns that prioritize both aesthetic appeal and functional performance. I’m highly proficient with tools like Figma, Adobe XD, Webflow, WordPress, and Shopify, and I frequently collaborate with developers to ensure seamless handoff using platforms like Zeplin or Storybook. Whether you’re looking to improve conversions, refresh your brand’s digital presence, or build something entirely new, I bring a strong design eye, clear communication, and a results-driven approach to every project.\n\nI have a slight preference for hourly projects with a rate about $30/hour. \n</my_profile>\n\n<job>\n{{ JSON.stringify($json.output, null, 2) }}\n</job>",
"options": {},
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"score\",\n \"reasoning\"\n ],\n\t\"properties\": {\n \"score\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 10\n },\n \"reasoning\": {\n \"type\": \"string\"\n }\n\t}\n}"
},
"typeVersion": 1.2
},
{
"id": "f768b4e4-3eba-41b1-a6aa-c34c14dead7c",
"name": "付箋3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1380,
-240
],
"parameters": {
"color": 7,
"width": 620,
"height": 460,
"content": "## Send filtered notifications to Slack\n\nHere we only send notifications for jobs that have a match score of 7 or greater, but you can filter the notifications however you'd like. Be sure to select a channel from your workspace in the Slack node."
},
"typeVersion": 1
},
{
"id": "ffbe5e44-4e6d-4b88-92cd-042a47fdc77c",
"name": "Job Data Extractor",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
660,
-20
],
"parameters": {
"text": "=Below is a job alert email received from Upwork. Please extract the requested information in valid JSON format.\n\nSubject: {{ $('Get Filtered Messages').item.json.subject }}\nBody: {{ $json.markdown }}",
"options": {},
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"jobName\",\n \"jobType\", \n \"jobDetailUrl\", \n \"price\", \n \"descriptionSnippet\", \n \"country\", \n \"paymentVerified\",\n \"clientRating\",\n \"amountSpent\",\n \"tags\",\n \"postedAt\",\n \"experienceLevel\"\n ],\n\t\"properties\": {\n \"jobName\": {\n \"type\": \"string\"\n },\n\t\t\"jobType\": {\n\t\t\t\"enum\": [\"Hourly\", \"Fixed\"]\n\t\t},\n \"price\": {\n \"type\": \"string\"\n },\n \"jobDetailUrl\": {\n \"type\": \"string\"\n },\n \"descriptionSnippet\": {\n \"type\": \"string\",\n \"description\": \"The description of the job before the 'more' link\"\n },\n \"country\": {\n \"type\": \"string\"\n },\n \"paymentVerified\": {\n \"type\": \"boolean\"\n },\n \"clientRating\": {\n \"type\": \"number\"\n },\n \"amountSpent\": {\n \"type\": \"string\"\n },\n \"tags\": {\n \"type\": \"array\",\n \"description\": \"List of categories with a link typically found below the country. Just include the tag name, not the url.\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"postedAt\": {\n \"type\": \"string\"\n },\n \"experienceLevel\": {\n \"enum\": [\"Entry\", \"Intermediate\", \"Expert\"]\n }\n\t}\n}"
},
"typeVersion": 1.2
}
],
"pinData": {},
"connections": {
"e282e1a2-70c7-40ca-a394-33e33976f855": {
"main": [
[
{
"node": "51b4e572-fe95-41ca-8ef1-e6638d6cbe8c",
"type": "main",
"index": 0
}
]
]
},
"4b04a2bf-29a6-42f6-8e72-c264f092780e": {
"main": [
[
{
"node": "0dc258f0-4d50-4bbf-9063-b252f597c245",
"type": "main",
"index": 0
}
]
]
},
"51b4e572-fe95-41ca-8ef1-e6638d6cbe8c": {
"main": [
[
{
"node": "6674d03e-91ca-4c6b-8091-b956920e7d9a",
"type": "main",
"index": 0
}
]
]
},
"ffbe5e44-4e6d-4b88-92cd-042a47fdc77c": {
"main": [
[
{
"node": "bf621b43-05bd-47c2-bd29-4484400dff62",
"type": "main",
"index": 0
}
]
]
},
"bf621b43-05bd-47c2-bd29-4484400dff62": {
"main": [
[
{
"node": "e282e1a2-70c7-40ca-a394-33e33976f855",
"type": "main",
"index": 0
}
]
]
},
"0dc258f0-4d50-4bbf-9063-b252f597c245": {
"main": [
[
{
"node": "ffbe5e44-4e6d-4b88-92cd-042a47fdc77c",
"type": "main",
"index": 0
}
]
]
},
"5c208e16-c987-4bf0-b3f6-27d560b3ce5e": {
"main": [
[
{
"node": "4b04a2bf-29a6-42f6-8e72-c264f092780e",
"type": "main",
"index": 0
}
]
]
},
"fced2dd2-720f-4534-a459-94f6cd13314b": {
"ai_languageModel": [
[
{
"node": "ffbe5e44-4e6d-4b88-92cd-042a47fdc77c",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"0b9a8a79-3639-4a83-ac4d-9bbd22adef5e": {
"ai_languageModel": [
[
{
"node": "bf621b43-05bd-47c2-bd29-4484400dff62",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
中級 - 個人の生産性, AI要約
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
SmartSupportフロー:メールからJiraへ自動のにITリクエストを処理し、Slackへ通知を送信
AIソリューションとSlackアラートを使用したメールからJiraチケットへの自動変換
If
Set
Jira
+
If
Set
Jira
25 ノードTrung Tran
チケット管理
Firefliesの会議文字起こしとサマリー自動化
GeminiとGmailを使ってFirefliesから会議の要約を自動転記する
Set
Code
Gmail
+
Set
Code
Gmail
26 ノードDavide
文書抽出
Gemini、Slack、Notionを使ってニュース速報からAI要約を作成
Gemini、Slack、Notionを使ってニュース速報からAI情報要約を作成
Set
Code
Gmail
+
Set
Code
Gmail
19 ノードHarry Siggins
その他
ビジネスのAIコマンドセンター:Google Workspaceモジュール型アクター、ベクター検索、マルチチャネルレポート
ビジネスAIコマンドセンター:Google Workspaceモジュール型アジンス、ベクター検索、マルチチャネルレポート
Set
Gmail
Slack
+
Set
Gmail
Slack
80 ノードPaul
文書抽出
ブログ h
SEO最適化されたWordPressブログを自動作成(Perplexity、Google Trends利用)
Set
Gmail
Limit
+
Set
Gmail
Limit
49 ノードPaul
コンテンツ作成
n8nノードの探索(可視化リファレンスライブラリ内)
n8nノードを可視化リファレンスライブラリで探索
If
Ftp
Set
+
If
Ftp
Set
113 ノードI versus AI
その他
ワークフロー情報
難易度
中級
ノード数14
カテゴリー2
ノードタイプ9
作成者
James Francis
@paperjam👋 Hi, I'm James. I run an AI automation agency focused on building small, focused workflows that have a direct and measurable impact on business growth or optimization.
外部リンク
n8n.ioで表示 →
このワークフローを共有