This workflow corresponds to n8n.io template #12671 — we link there as the canonical source.
This workflow follows the Agent → Gmail Trigger 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 →
{
"id": "vxEhTtXLu9gxpqkc",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Gmail-to-Slack Email Automation",
"tags": [],
"nodes": [
{
"id": "8eec9a72-61ed-4e5d-bb82-0573e3bde047",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-208,
128
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "{\n\t\"category\": \"sales\"\n}"
},
"typeVersion": 1.3
},
{
"id": "d3e96249-4dbe-4f64-abe6-7ce73ef63bf9",
"name": "Merge Category",
"type": "n8n-nodes-base.set",
"position": [
368,
-128
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "dae19e62-7814-4cfe-b746-ae011a30c74e",
"name": "output.category",
"type": "string",
"value": "={{ $json.output.category }}"
},
{
"id": "23ac8d06-5336-4029-a6bd-f02c95a6290f",
"name": "id",
"type": "string",
"value": "={{ $('Arrange Email Data').item.json.id }}"
},
{
"id": "d52f243e-e1eb-49f2-8175-657999ea4972",
"name": "text",
"type": "string",
"value": "={{ $('Arrange Email Data').item.json.text }}"
},
{
"id": "79b26d37-635b-4551-8a46-e5c33b51bd45",
"name": "textAsHtml",
"type": "string",
"value": "={{ $('Arrange Email Data').item.json.textAsHtml }}"
},
{
"id": "f79f5c7d-a94d-4591-86d1-1ccffc8b3971",
"name": "subject",
"type": "string",
"value": "={{ $('Arrange Email Data').item.json.subject }}"
},
{
"id": "d7893412-bbc1-4bdb-9aa0-4e88fabc6b93",
"name": "date",
"type": "string",
"value": "={{ $('Arrange Email Data').item.json.date }}"
},
{
"id": "61c1b15a-4103-4489-9898-e1cb146103b6",
"name": "to",
"type": "object",
"value": "={{ $('Arrange Email Data').item.json.to }}"
},
{
"id": "063af757-8085-4cc5-b46c-ea0ade642a58",
"name": "from",
"type": "object",
"value": "={{ $('Arrange Email Data').item.json.from }}"
},
{
"id": "fabdf119-1a9b-4b64-bab5-eb64bee82de8",
"name": "threadId",
"type": "string",
"value": "={{ $('Arrange Email Data').item.json.threadId }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "60fc0df9-fe4b-4586-9f7c-d35b33b3b1b2",
"name": "Invite a user to a channel",
"type": "n8n-nodes-base.slack",
"position": [
2352,
192
],
"parameters": {
"userIds": "={{ [\"U0A6ULM7CGK\"] }}",
"resource": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"operation": "invite"
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "47e3d00b-ea89-4c0e-816d-90e897259d23",
"name": "Find Category",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-272,
-128
],
"parameters": {
"text": "=You are an email categorization assistant.\n\nIMPORTANT DEFINITIONS:\n- \"accounts\" is ONLY for financial, billing, payments, invoices, taxes, subscriptions, or accounting-related emails.\n- Login, security, authentication, OTP, two-factor authentication (2FA), password reset, or access-related emails MUST NOT be classified as \"accounts\".\n- Security, login, or access-related emails MUST be classified as \"internal\".\n\nStep 1:\nIf the email fits one of the predefined categories, select it.\n\nPredefined categories:\n- sales \u2192 leads, deals, demos, pricing, proposals\n- marketing \u2192 campaigns, newsletters, promotions\n- product \u2192 feature updates, roadmap, product feedback\n- engineering \u2192 bugs, errors, deployments, technical issues\n- ai \u2192 LLMs, ML models, AI tools, AI research\n- internal \u2192 authentication, login alerts, security, OTP, 2FA, password reset, internal notifications\n- accounts \u2192 invoices, billing, payments, subscriptions, accounting, taxes\n\nStep 2:\nIf NONE apply, propose a NEW category name.\n\nRules for new category:\n- lowercase\n- hyphen-separated\n- max 1 word\n- max 30 characters\n\nEmail subject:\n{{$json.subject}}\n\nEmail body:\n{{$json.text}}\n\nReturn ONLY valid JSON:\n{\n \"category\": \"<category>\"\n}",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "9b66ffcf-edd5-41d2-a282-b8eedb525982",
"name": "Format Channel Data",
"type": "n8n-nodes-base.code",
"position": [
1040,
-128
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nlet data = $input.all().map(item => ({\n \"channel_name\": item.json.name,\n \"channel_id\": item.json.id\n}));\n\n// Remove duplicates based on channel_id\nreturn data.filter((item, index, self) => \n index === self.findIndex(t => t.channel_id === item.channel_id)\n);"
},
"typeVersion": 2
},
{
"id": "cb1fcb2b-ef59-45fd-a50e-c1732f9e752e",
"name": "Check Channel Exist",
"type": "n8n-nodes-base.if",
"position": [
1696,
-128
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "ac4d7bbf-67ad-4958-8ef9-47a7d8f60d19",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.found }}",
"rightValue": true
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.3
},
{
"id": "130ed387-40e3-4d52-814b-2e48d2eae03d",
"name": "Arrange Email Data",
"type": "n8n-nodes-base.set",
"position": [
-704,
-128
],
"parameters": {
"include": "=selected",
"options": {},
"includeFields": "id, text, textAsHtml, subject, date, to, from, threadId"
},
"typeVersion": 3
},
{
"id": "8028e034-b129-4f54-8623-c6045d44c1e8",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
-336,
128
],
"parameters": {
"model": "meta-llama/llama-3-70b-instruct",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "7b669536-e9e0-46bb-ab8b-e3112e9f347f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1472,
-432
],
"parameters": {
"color": 2,
"width": 928,
"height": 496,
"content": "## Gmail Intake & Data Preparation\n\n* The Gmail node runs every minute to check for newly received emails that are still in an unread state. It is configured to ignore spam and draft emails.\n\n* The Code node filters emails based on email IDs. It checks whether the email is from trusted sources and whether an unread email notification has already been sent to the Slack channel. If a notification was already sent, it passes an empty JSON to the next node.\n\n* The If node checks whether the incoming data is empty. Only if data is present does the workflow proceed further.\n\n* The Edit Fields node removes unnecessary data from the response and retains only the required fields, allowing the AI node to process the data more efficiently."
},
"typeVersion": 1
},
{
"id": "abebe0b8-cfe6-4501-9dbf-8e22d7e844fd",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-416,
-432
],
"parameters": {
"color": 3,
"width": 496,
"height": 896,
"content": "## AI Email Categorization\n\n* The AI Agent node reads the email content and determines its category (for example, Sales, Accounts, etc.).\n\n* A predefined list of categories is included in the prompt. If the email matches one of these, the corresponding category name is returned; otherwise, a new category name is generated.\n\n* The implementation uses OpenRouter\u2019s LLaMA chat model for classification."
},
"typeVersion": 1
},
{
"id": "46e12fcc-e93c-43fe-89c4-7b0c659316f2",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
-336
],
"parameters": {
"color": 4,
"width": 432,
"height": 368,
"content": "## Merge Node ( Merge Category)\n\n* This node merges the category identified by the AI agent into the main data returned by the \u201cArrange Email Data\u201d node."
},
"typeVersion": 1
},
{
"id": "22dbf00c-c35a-44fc-86b1-16c13e6f5111",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
752,
-384
],
"parameters": {
"color": 5,
"width": 688,
"height": 416,
"content": "## Slack Channels\n\n* The Slack node is used to retrieve the list of Slack channels.\n* The first Code node formats the channel list data returned by the Slack node.\n* The second Code node filters the formatted channel data, removes duplicate entries, and checks for a matching channel name based on the category provided by the AI agent node.\n* If a matching channel is found, it returns found: true."
},
"typeVersion": 1
},
{
"id": "672c42f0-98a3-4cb5-a2ae-af01d808d487",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
-352
],
"parameters": {
"color": 6,
"width": 432,
"height": 368,
"content": "## Channel Existence Check\n\n* This If node checks whether a matching category was found in the previous node.\n* If found is true, it proceeds with the Existing Channel Flow.\n* Otherwise, it triggers the New Channel Creation Flow."
},
"typeVersion": 1
},
{
"id": "6ac9e3ac-4caf-4f1d-8954-a6cc6c6d7079",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
-704
],
"parameters": {
"color": 7,
"width": 688,
"height": 400,
"content": "## Existing Channel Flow\n\n* The Join Slack Channel node is used to join the app to the matched channel if it has not already joined.\n* The next Slack node posts the email details to the matched channel. The message body is structured using Block Kit (blocks) to support reply-via-button email functionality, which can be implemented through another workflow.\n* In message body pass email thread id in button block so ii will used in reply functionality"
},
"typeVersion": 1
},
{
"id": "ac1786b7-03b2-4ec3-9d66-0042aa4a46f3",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2080,
-80
],
"parameters": {
"color": 7,
"width": 688,
"height": 464,
"content": "## New Channel Creation Flow\n\n* It first creates a Slack channel using the category name identified by the AI agent. If the category exists in the predefined category list, that name is used; otherwise, a new channel is created using the AI-generated category name.\n* Next, it invites the current user to the newly created channel so they can send and view messages.\n- Finally, a Slack node posts the email details to the channel using Block Kit (blocks) format, including a reply button, whose functionality will be implemented through a separate workflow trigger."
},
"typeVersion": 1
},
{
"id": "7eacc984-5ff7-4566-a37d-6343635afcf8",
"name": "OpenRouter Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
-208,
288
],
"parameters": {
"model": "meta-llama/llama-3-70b-instruct",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "cc8882b2-b5fd-423a-88d7-477a439e6e7b",
"name": "Capture Gmail Event",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-1408,
-112
],
"parameters": {
"simple": false,
"filters": {
"readStatus": "unread",
"includeDrafts": false,
"includeSpamTrash": false
},
"options": {
"downloadAttachments": true
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "76ddf070-1317-4ecd-92f3-626843ef6846",
"name": "Filter + Deduplicate Validation",
"type": "n8n-nodes-base.code",
"position": [
-1168,
-112
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Deduplication + Trusted Domain Filter\n */\nconst data = $getWorkflowStaticData('global');\n\nif (!data.processed) {\n data.processed = {};\n}\n\n// ---------------- DUPLICATION CHECK ----------------\nconst headers = $json.headers || {};\nconst messageId =\n headers['message-id']\n\nif (data.processed[messageId]) {\n return {}; // \u26d4 duplicate inbound email\n}\n\ndata.processed[messageId] = true;\n\n// ---------------- DOMAIN CHECK ----------------\nconst disposableDomains = [\n \"yopmail.com\",\n \"mailinator.com\",\n \"guerrillamail.com\",\n \"tempmail.com\",\n \"10minutemail.com\",\n \"getnada.com\",\n \"trashmail.com\",\n \"dispostable.com\"\n];\n\nconst freeEmailDomains = [\n \"gmail.com\",\n \"yahoo.com\",\n \"outlook.com\",\n \"hotmail.com\",\n \"icloud.com\"\n];\n\nconst fromEmail = ($json.from?.email || \"\").toLowerCase();\nconst domain = fromEmail.split(\"@\")[1] || \"\";\n\n// Block disposable domains\nif (disposableDomains.includes(domain)) {\n return {};\n}\n\n// Block free email providers (optional)\nif (freeEmailDomains.includes(domain)) {\n return {};\n}\n\n// \u2705 Passed all checks\nreturn $input.item;"
},
"typeVersion": 2
},
{
"id": "dcc0cc20-174f-4fdb-8484-78f08ef49a37",
"name": "Check Data Exist",
"type": "n8n-nodes-base.if",
"position": [
-944,
-112
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "fd19658d-0297-485e-9664-f3289645ab30",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "a8f5a2fb-9ce8-4f45-8ac0-2129fc912288",
"name": "Get Channels List",
"type": "n8n-nodes-base.slack",
"position": [
832,
-128
],
"parameters": {
"filters": {},
"resource": "channel",
"operation": "getAll"
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "7666c7b1-2882-43cf-9416-377bb7c476f7",
"name": "Join Slack Channel",
"type": "n8n-nodes-base.slack",
"position": [
2112,
-464
],
"parameters": {
"resource": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.matchedChannelId }}"
},
"operation": "join"
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "87e72e20-b706-4846-8989-3fec085dfeb2",
"name": "Post Message in Channel",
"type": "n8n-nodes-base.slack",
"position": [
2576,
-464
],
"parameters": {
"text": "=\ud83d\udce7 New Email Received\nin {{ $json.name }} Channel",
"select": "channel",
"blocksUi": "={\n \"blocks\": [\n {\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"*\ud83d\udce7 New Email Received*\\n*From:* {{ $('Merge Category').first().json.from.value[0].address }}\\n*Subject:* {{ $('Merge Category').first().json.subject }}\\n\\n {{ $('Merge Category').first().json.text.slice(0, 500).replace(/[\\n\\r]/g, ' ').replace(/\"/g, '\\\\\"') }}\u2026 \\n\\n\\n \ud83d\udd17 <https://mail.google.com/mail/u/0/#inbox/{{ $('Merge Category').first().json.id }}|Open in Gmail>\"\n }\n },\n {\n \"type\": \"actions\",\n \"elements\": [\n {\n \"type\": \"button\",\n \"text\": {\n \"type\": \"plain_text\",\n \"text\": \"Reply via Email\"\n },\n \"action_id\": \"reply_email\",\n \"value\": \"{{ $('Merge Category').first().json.threadId }}\"\n }\n ]\n }\n ]\n}",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"messageType": "block",
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "3d934bb1-af42-4451-8cc1-49dd47e89d07",
"name": "Create Slack Channel",
"type": "n8n-nodes-base.slack",
"position": [
2128,
192
],
"parameters": {
"resource": "channel",
"channelId": "={{ $('Merge Category').first().json.output.category }}"
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "7ef887f5-abdd-4d67-a7a1-e62d01eca0c3",
"name": "Post Message in Created Channel",
"type": "n8n-nodes-base.slack",
"position": [
2592,
192
],
"parameters": {
"text": "=\ud83d\udce7 New Email Received\nin {{ $json.name }} Channel",
"select": "channel",
"blocksUi": "={\n \"blocks\": [\n {\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"*\ud83d\udce7 New Email Received*\\n*From:* {{ $('Merge Category').first().json.from.value[0].address }}\\n*Subject:* {{ $('Merge Category').first().json.subject }}\\n\\n {{ $('Merge Category').first().json.text.slice(0, 500).replace(/[\\n\\r]/g, ' ').replace(/\"/g, '\\\\\"') }}\u2026 \\n\\n\\n \ud83d\udd17 <https://mail.google.com/mail/u/0/#inbox/{{ $('Merge Category').first().json.id }}|Open in Gmail>\"\n }\n },\n {\n \"type\": \"actions\",\n \"elements\": [\n {\n \"type\": \"button\",\n \"text\": {\n \"type\": \"plain_text\",\n \"text\": \"Reply via Email\"\n },\n \"action_id\": \"reply_email\",\n \"value\": \"{{ $('Merge Category').first().json.threadId }}\"\n }\n ]\n }\n ]\n}",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"messageType": "block",
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "6862cc08-b3fb-41b4-9a7f-f12f7dc234b7",
"name": "Remove Duplicate Channel + Find Matched Channel",
"type": "n8n-nodes-base.code",
"position": [
1264,
-128
],
"parameters": {
"jsCode": "const category = $('Merge Category').first().json.output.category;\nconst channels = $input.all() || [];\nlet matchedChannel = null;\n\nfor (const ch of channels) {\n if (\n ch.json.channel_name.includes(category) ||\n category.includes(ch.json.channel_name)\n ) {\n matchedChannel = ch;\n break;\n }\n}\n\n// Return based on whether a match was found\nif (matchedChannel) {\n return [\n {\n json: {\n found: true,\n matchedChannelName: matchedChannel.json.channel_name,\n matchedChannelId: matchedChannel.json.channel_id\n }\n }\n ];\n} else {\n return [\n {\n json: {\n found: false,\n matchedChannelName: null,\n matchedChannelId: null\n }\n }\n ];\n}"
},
"typeVersion": 2
},
{
"id": "0e290919-c0ea-4cbd-a09d-033ac18fcfe4",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2480,
-1104
],
"parameters": {
"width": 832,
"height": 608,
"content": "## Prerequisite and Setup Guide\n\n### How it works\n* This workflow automatically monitors new unread emails in Gmail and routes them to the correct Slack channel using AI-based categorization. It starts by listening for incoming emails while ignoring spam and drafts. The email content (sender, subject, body, and metadata) is cleaned and prepared so it can be processed efficiently.\n* An AI agent analyses the email content and determines the most relevant category (such as Sales, Accounts, Support, HR, etc.) based on a predefined category list. If a valid category is detected, it is normalized and merged back into the main email data.\n* Next, the workflow fetches the list of existing Slack channels and checks whether a channel matching the detected category already exists.\n* If the channel exists, the workflow joins the app to that channel (if needed) and posts the email details.\n* If the channel does not exist, a new channel is created using the category name, the current user is invited, and the email details are posted.\n* All Slack messages are sent using Block Kit, allowing future enhancements such as reply-via-email buttons or follow-up workflows.\n\n### Setup steps\n1. Gmail Configuration\n * Connect a Gmail account using OAuth and allow access to unread emails and metadata.\n2. AI / LLM Configuration\n * Configure an AI provider (OpenAI or compatible) and ensure the prompt restricts output to predefined categories.\n3. Slack Configuration\n * Create a Slack App with required scopes (channels, chat, users) and add the Bot OAuth token to n8n.\n4. Testing & Activation\n * Activate the workflow, send test emails, and verify correct categorization, channel handling, and Slack notifications."
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "468f0e6f-4c49-4e76-b8a7-e877e14bc9fa",
"connections": {
"Find Category": {
"main": [
[
{
"node": "Merge Category",
"type": "main",
"index": 0
}
]
]
},
"Merge Category": {
"main": [
[
{
"node": "Get Channels List",
"type": "main",
"index": 0
}
]
]
},
"Check Data Exist": {
"main": [
[
{
"node": "Arrange Email Data",
"type": "main",
"index": 0
}
]
]
},
"Get Channels List": {
"main": [
[
{
"node": "Format Channel Data",
"type": "main",
"index": 0
}
]
]
},
"Arrange Email Data": {
"main": [
[
{
"node": "Find Category",
"type": "main",
"index": 0
}
]
]
},
"Join Slack Channel": {
"main": [
[
{
"node": "Post Message in Channel",
"type": "main",
"index": 0
}
]
]
},
"Capture Gmail Event": {
"main": [
[
{
"node": "Filter + Deduplicate Validation",
"type": "main",
"index": 0
}
]
]
},
"Check Channel Exist": {
"main": [
[
{
"node": "Join Slack Channel",
"type": "main",
"index": 0
}
],
[
{
"node": "Create Slack Channel",
"type": "main",
"index": 0
}
]
]
},
"Format Channel Data": {
"main": [
[
{
"node": "Remove Duplicate Channel + Find Matched Channel",
"type": "main",
"index": 0
}
]
]
},
"Create Slack Channel": {
"main": [
[
{
"node": "Invite a user to a channel",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "Find Category",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenRouter Chat Model1": {
"ai_languageModel": [
[
{
"node": "Structured Output Parser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Post Message in Channel": {
"main": [
[]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Find Category",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Invite a user to a channel": {
"main": [
[
{
"node": "Post Message in Created Channel",
"type": "main",
"index": 0
}
]
]
},
"Filter + Deduplicate Validation": {
"main": [
[
{
"node": "Check Data Exist",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicate Channel + Find Matched Channel": {
"main": [
[
{
"node": "Check Channel Exist",
"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.
gmailOAuth2openRouterApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n template from Intuz provides a complete and automated solution to transform your team's inbox management.
Source: https://n8n.io/workflows/12671/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.
YouTube Strategist. Uses formTrigger, splitOut, splitInBatches, agent. Event-driven trigger; 50 nodes.
CV → Match → Screen → Decide, all automated
This advanced multi-phase n8n workflow automates the complete research, analysis, and ideation pipeline for a YouTube strategist. It scrapes competitor channels, analyzes top-performing titles and thu
A Slack bot that reviews any n8n workflow on demand. Mention it or DM it a workflow URL and it replies in-thread with a graded review, plain-English overview, and findings tiered as Must Fix, Should F