This workflow corresponds to n8n.io template #4680 — we link there as the canonical source.
This workflow follows the Chainllm → Gmail 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": "Yc9bgOEvpyO1En1Z",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Intelligent Gmail Labeling: Categorize Emails by Content Intent Using OpenAI",
"tags": [],
"nodes": [
{
"id": "7697a77b-7dc8-40e7-b8e2-859c724ed6d5",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2380,
40
],
"parameters": {
"width": 452.48413953150185,
"height": 347.0476323933831,
"content": "### Aggregate labels and update to message\nCreate array of label IDs and add to the desired email message in Gmail."
},
"typeVersion": 1
},
{
"id": "013c142d-eb86-4d62-bab3-9dc77fba7b3b",
"name": "Gmail trigger",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
720,
200
],
"parameters": {
"simple": false,
"filters": {},
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "78cf0980-b4ec-4ed0-9b49-014e4d5d63d3",
"name": "Get message content",
"type": "n8n-nodes-base.gmail",
"position": [
980,
200
],
"parameters": {
"simple": false,
"options": {},
"messageId": "={{ $json.id }}",
"operation": "get"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "1f07bb8a-0e12-47fd-bf4f-751befeea37c",
"name": "Assign labels for message",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1240,
200
],
"parameters": {
"text": "={{ $('Gmail trigger').item.json.text }}",
"messages": {
"messageValues": [
{
"message": "=As an AI Assistant, your task is to categorize the message according to the following labels\n\nQuotation - email on discussing new opportunities to work with existing / new client on a new project\nProject progress - email on discussing and confirming specifications, schedule and progress of projects\nInquiry - email about product / service support\nNotification - email that doesn't require response\n\nOne email can have more than one label. Return only label names in JSON format, nothing else. Do not make things up."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "c0f1e702-25b5-4887-b112-7d0d1c239ea1",
"name": "JSON Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1460,
420
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"labels\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\"Inquiry\", \"Quotation\", \"Project progress\", \"Notification\"]\n }\n }\n },\n \"required\": [\"labels\"]\n}"
},
"typeVersion": 1.2
},
{
"id": "979aad50-8e34-471e-9016-c412e470c81b",
"name": "Set label values",
"type": "n8n-nodes-base.set",
"position": [
1620,
200
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "72d11a72-6693-447c-b7ca-4ba1a3579075",
"name": "labels",
"type": "array",
"value": "={{ $json.output.labels }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "48e80f97-1679-40a5-860d-124d32c82316",
"name": "Get all labels",
"type": "n8n-nodes-base.gmail",
"position": [
1840,
80
],
"parameters": {
"resource": "label",
"returnAll": true
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e29e712a-7940-4ca3-9a82-525ac7d5f7bf",
"name": "Split out assigned labels",
"type": "n8n-nodes-base.splitOut",
"position": [
1840,
280
],
"parameters": {
"options": {},
"fieldToSplitOut": "labels"
},
"typeVersion": 1
},
{
"id": "95886e13-3412-4c27-8510-873bbaced52b",
"name": "Merge corresponding labels",
"type": "n8n-nodes-base.merge",
"position": [
2180,
140
],
"parameters": {
"mode": "combine",
"options": {},
"advanced": true,
"mergeByFields": {
"values": [
{
"field1": "name",
"field2": "labels"
}
]
}
},
"typeVersion": 3.1
},
{
"id": "329cf5ff-7933-4c5e-bb63-cbb77689a194",
"name": "Aggregate label IDs",
"type": "n8n-nodes-base.aggregate",
"position": [
2440,
140
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "label_ids",
"fieldToAggregate": "id"
}
]
}
},
"typeVersion": 1
},
{
"id": "952aad99-6ae7-4639-8132-f51b1065468e",
"name": "Add labels to message",
"type": "n8n-nodes-base.gmail",
"position": [
2640,
140
],
"parameters": {
"labelIds": "={{ $json.label_ids }}",
"messageId": "={{ $('Gmail trigger').item.json[\"id\"] }}",
"operation": "addLabels"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "11244a40-d6df-475b-b900-bf8d386077d6",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
20,
-140
],
"parameters": {
"color": 4,
"width": 580,
"height": 1041,
"content": "## Intelligent Gmail Labeling: Categorize Emails by Content Intent Using OpenAI\n\n## Who is this for?\n\nThis workflow is ideal for Gmail users and teams who receive a high volume of emails and want to streamline inbox management. It suits professionals seeking to organize messages automatically, including sales teams, project managers, support staff, and anyone who benefits from automated email categorization.\n\n## What problem is this workflow solving? / Use case\n\nManually labeling emails is time-consuming and can lead to inconsistent organization. This automated n8n workflow uses Gmail and OpenAI to analyze incoming messages and apply the appropriate labels, such as \"Quotation\", \"Inquiry\", \"Project progress\", and \"Notification\", based on content\u2014improving productivity and ensuring important messages are prioritized.\n\n## What this workflow does\n\nThe workflow retrieves new Gmail messages, analyzes their content with OpenAI, and automatically assigns pre-defined Gmail labels that match the email\u2019s intent. This ensures emails are sorted efficiently using AI-powered content analysis and Gmail\u2019s labeling system.\n\n## Setup\n\n- Ensure Gmail labels (e.g., \"Quotation\", \"Inquiry\") are created in your Gmail account.\n- Connect your Gmail and OpenAI accounts as credentials in n8n.\n- Import the workflow into your n8n instance and update node configurations to match your Gmail label names.\n\n## How to customize this workflow to your needs\n\n- Edit or add Gmail labels both in your Gmail account and within the workflow logic.\n- Adjust the prompt or parameters sent to OpenAI to better match your categorization style.\n- Expand or refine the list of label categories to fit your team\u2019s or business\u2019s requirements.\n"
},
"typeVersion": 1
},
{
"id": "1eca85f0-bfa4-431e-90e2-0ffe25844bdd",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
20
],
"parameters": {
"width": 238,
"height": 349,
"content": "### Gmail Trigger\nGet new incoming message from Gmail. \n\n\u26a0\ufe0f Set up the time (polling) interval based on your needs."
},
"typeVersion": 1
},
{
"id": "a5dd9b23-0fd8-42a8-a334-2a0640750c52",
"name": "Sticky Note14",
"type": "n8n-nodes-base.stickyNote",
"position": [
1400,
400
],
"parameters": {
"width": 241.53974014153226,
"height": 319.3323098457962,
"content": "###\n\n\n\n\n\n\n\n\n\n\n### JSON schema\nEdit JSON schema and label names according to your needs.\n\n\u26a0\ufe0f **Label names in system prompt and JSON schema should be the same.**"
},
"typeVersion": 1
},
{
"id": "c6a7af89-e307-4363-8d96-83c0f7c0e7b8",
"name": "Sticky Note15",
"type": "n8n-nodes-base.stickyNote",
"position": [
2120,
40
],
"parameters": {
"width": 226.14233872620645,
"height": 347.0476323933831,
"content": "### Merge labels\nCombine labels retrieved from Gmail account and assigned by AI together."
},
"typeVersion": 1
},
{
"id": "afb1a124-f880-4d6c-987e-dabf2c3fb882",
"name": "Sticky Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
920,
20
],
"parameters": {
"width": 238.4602598584674,
"height": 348.5873725349161,
"content": "### Get message content\nBased on Gmail message ID retrieve body content of the email and pass it to AI chain."
},
"typeVersion": 1
},
{
"id": "44b4c579-538f-45fe-9cde-627ac7364013",
"name": "Sticky Note17",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
20
],
"parameters": {
"width": 378.57661273793565,
"height": 348.5873725349161,
"content": "### Assign labels\nLet the AI decide which labels suit the best content of the message.\n\n\u26a0\ufe0f **Remember to edit system prompt** - modify label names and instructions according to your needs."
},
"typeVersion": 1
},
{
"id": "e866b876-20a4-4a19-bd07-56c69eed82af",
"name": "OpenAI GPT-4 Based",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1220,
420
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4-turbo-preview",
"cachedResultName": "gpt-4-turbo-preview"
},
"options": {
"temperature": 0,
"responseFormat": "json_object"
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "01528b99-a1ee-48df-b42f-c3717974161c",
"connections": {
"JSON Parser": {
"ai_outputParser": [
[
{
"node": "Assign labels for message",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Gmail trigger": {
"main": [
[
{
"node": "Get message content",
"type": "main",
"index": 0
}
]
]
},
"Get all labels": {
"main": [
[
{
"node": "Merge corresponding labels",
"type": "main",
"index": 0
}
]
]
},
"Set label values": {
"main": [
[
{
"node": "Split out assigned labels",
"type": "main",
"index": 0
},
{
"node": "Get all labels",
"type": "main",
"index": 0
}
]
]
},
"OpenAI GPT-4 Based": {
"ai_languageModel": [
[
{
"node": "Assign labels for message",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Aggregate label IDs": {
"main": [
[
{
"node": "Add labels to message",
"type": "main",
"index": 0
}
]
]
},
"Get message content": {
"main": [
[
{
"node": "Assign labels for message",
"type": "main",
"index": 0
}
]
]
},
"Assign labels for message": {
"main": [
[
{
"node": "Set label values",
"type": "main",
"index": 0
}
]
]
},
"Split out assigned labels": {
"main": [
[
{
"node": "Merge corresponding labels",
"type": "main",
"index": 1
}
]
]
},
"Merge corresponding labels": {
"main": [
[
{
"node": "Aggregate label IDs",
"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.
gmailOAuth2openAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is ideal for Gmail users and teams who receive a high volume of emails and want to streamline inbox management. It suits professionals seeking to organize messages automatically, including sales teams, project managers, support staff, and anyone who benefits from…
Source: https://n8n.io/workflows/4680/ — 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.
A sophisticated n8n workflow that transforms your email management with AI-powered classification, automatic responses, and intelligent organization.
[](https://www.youtube.com/watch?v=rfu4MSvtpAw)
This workflow will trigger upon new mail in your gmail inbox and will automatically apply existing labels OR identify, create, then apply up to 5 new labels. This is currently set up to run using a Op
[](https://youtu.be/nC2mSry3xFo)
This workflow gives you the ability to reply to a long email with a voice note, rather than having to type everything out.