This workflow corresponds to n8n.io template #4687 — we link there as the canonical source.
This workflow follows the Agent → 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "fd08b5e1-f370-46b6-8088-c2e59c73d71c",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
0
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "78f01440-ef12-4ee6-a9a5-af4d39104c0c",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-520,
-140
],
"parameters": {
"width": 420,
"content": "## 1 - Config\n\n1) [G Sheets to Duplicate](https://docs.google.com/spreadsheets/d/1LKIx1Z3dCSX1uzyZH9s2HE0QRMvLTDI6sJApFU5LTj0/edit?gid=0#gid=0)\n2) To edit: File -> Make a copy\n2) Copy the URL of your copy in *Config* node \u27a1\ufe0f\u27a1\ufe0f"
},
"typeVersion": 1
},
{
"id": "58417d60-eaaf-4d3f-affb-3a1655d2777b",
"name": "Config",
"type": "n8n-nodes-base.set",
"position": [
220,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cf1d4687-98df-4f65-b72e-6722075ab703",
"name": "sheets_url",
"type": "string",
"value": "https://docs.google.com/spreadsheets/d/1LKIx1Z3dCSX1uzyZH9s2HE0QRMvLTDI6sJApFU5LTj0/edit?gid=0#gid=0"
},
{
"id": "5df50301-a77a-483f-80ce-7717daa04231",
"name": "extra_filter",
"type": "string",
"value": ""
},
{
"id": "4fc76947-79c9-4f73-bf36-c18e664b14b4",
"name": "limit",
"type": "number",
"value": 999
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8f8812bc-dc04-4405-8d33-e6d457e2d1e8",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
880,
0
],
"parameters": {
"text": "=Email subject:\n\n{{ $json.headers.subject }}\n\n\nText: {{ $json.text }}\n\nChoose the best fitting of the category names below, based on their definition:\n{{ JSON.stringify($('Get Labels').all()) }}\n\nImportant: ONLY respond with the category Names number. EXACTLY one the numbers (such as 0, 1), do not add any other texts.\n\nSo response should be one of the numbers before the correct category name:\n{{ $('Get Labels').all().map(({ json: { Name } }, i) => `${i} - ${Name}` ).join('\\n') }}",
"options": {},
"promptType": "define"
},
"typeVersion": 1.8
},
{
"id": "e1bf4a15-a2b5-48a4-83d4-af649f20101f",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
880,
220
],
"parameters": {
"model": "openai/gpt-4.1-mini",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "5c597cd5-69f0-42ac-a158-a5ef766157b0",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-520,
20
],
"parameters": {
"width": 420,
"height": 400,
"content": "## 2 - Connect AI (Optional: find free model)\n\n1) Get OpenRouter API Key: https://openrouter.ai/settings/keys\n\n2) [List of currently free models](https://openrouter.ai/models?max_price=0&order=top-weekly)\n[List of Popular models](https://openrouter.ai/models?order=top-weekly)\n\nBest in 2025 May: deepseek/deepseek-chat-v3-0324:free\nPaid recommended: gpt-4.1-mini\n\n3) Go to **OpenRouter Chat Model** Node\n+ \"Add Credential\" - Enter API Key\n+ Choose your preferred AI model"
},
"typeVersion": 1
},
{
"id": "8ec93dff-52a4-410e-b45f-f492bcc0bb88",
"name": "Get Labels",
"type": "n8n-nodes-base.googleSheets",
"position": [
440,
0
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "url",
"value": "={{ $json.sheets_url }}"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "={{ $json.sheets_url }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "221de31a-e662-402d-8795-1bcd40757855",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-520,
-220
],
"parameters": {
"height": 80,
"content": "# Setup"
},
"typeVersion": 1
},
{
"id": "e41fb3ca-5de0-4a1a-a0f7-4f6fddc739ed",
"name": "Create Label if Doesn't exist",
"type": "n8n-nodes-base.gmail",
"onError": "continueRegularOutput",
"position": [
1620,
280
],
"parameters": {
"name": "={{ $json.output }}",
"options": {},
"resource": "label",
"operation": "create"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "fea8a543-0bb4-460e-9862-06c711ec30e6",
"name": "Get Existing Labels",
"type": "n8n-nodes-base.gmail",
"position": [
1820,
280
],
"parameters": {
"resource": "label",
"returnAll": true
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "a45806ca-6b98-411a-a8b2-a8b9f071d6c0",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1460,
0
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "de31842d-88de-4281-a8f7-5e88db026ece",
"name": "Filter",
"type": "n8n-nodes-base.filter",
"position": [
2020,
280
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e36a5069-09dd-424d-a2b8-096cefa059d7",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.name }}",
"rightValue": "={{ $('Loop Over Items').item.json.output }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "fe0c9d60-bd76-4a72-adb4-0b04bcd971bc",
"name": "Gmail1",
"type": "n8n-nodes-base.gmail",
"position": [
2200,
280
],
"parameters": {
"labelIds": "={{ $json.id }}",
"resource": "thread",
"threadId": "={{ $('Loop Over Items').item.json.threadId }}",
"operation": "addLabels"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "3f3c2627-c20d-443f-8a6f-c803139c4143",
"name": "Fields For Loop",
"type": "n8n-nodes-base.set",
"position": [
1240,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cf0978da-37a2-48e8-8da9-8ec110638a42",
"name": "threadId",
"type": "string",
"value": "={{ $('Get Messages').item.json.threadId }}"
},
{
"id": "71cac306-cca3-4e28-8bba-d920d83037ac",
"name": "output",
"type": "string",
"value": "={{ $('Get Labels').all()[$json.output].json.Name }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "10ede08e-bdbc-4c3f-8c25-2724bfbda6f5",
"name": "Get Messages",
"type": "n8n-nodes-base.gmail",
"position": [
660,
0
],
"parameters": {
"limit": "={{ $('Config').item.json.limit }}",
"simple": false,
"filters": {
"q": "=has:nouserlabels {{ $('Config').item.json.extra_filter }}"
},
"options": {},
"operation": "getAll"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 2.1
},
{
"id": "f15bda54-5a37-49e1-b06c-322308689c6e",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
220,
160
],
"parameters": {
"width": 310,
"content": "\ud83d\udc46\u2b06\ufe0f\n1 - sheets_url - Where the category definitions live\n2 - extra_filter - Leave empty to process all emails. Use any gmail search filters.\n3 - limit - max no. of emails to process in a run"
},
"typeVersion": 1
},
{
"id": "e989c10d-8dc7-4c88-b1ee-173147a5e8b2",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-280,
-580
],
"parameters": {
"color": 5,
"width": 640,
"height": 440,
"content": "# Contact Us:\n## Milan @ SmoothWork - [Book a Free Consulting Call](https://smoothwork.ai/book-a-call/)\n\n\n\n### We help businesses eliminate busywork by building compact business tools tailored to your process.\n### Contact us for customizing this, or building similar automations.\n\n\ud83d\udce7 hello@smoothwork.ai\n\u25b6\ufe0f [Check us on YouTube](https://www.youtube.com/@vasarmilan)\n\ud83d\udcde [Book a Free Consulting Call](https://smoothwork.ai/book-a-call/)\n\ud83d\udcbc [Add me on Linkedin](https://www.linkedin.com/in/mil%C3%A1n-v%C3%A1s%C3%A1rhelyi-3a9985123/)\n"
},
"typeVersion": 1
},
{
"id": "192f7006-51f9-44cb-aabb-d7c751e8d911",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
360,
-580
],
"parameters": {
"width": 420,
"height": 340,
"content": "# Video Walkthrough\n[](https://www.youtube.com/watch?v=BQARyWMD_lU)"
},
"typeVersion": 1
}
],
"connections": {
"Config": {
"main": [
[
{
"node": "Get Labels",
"type": "main",
"index": 0
}
]
]
},
"Filter": {
"main": [
[
{
"node": "Gmail1",
"type": "main",
"index": 0
}
]
]
},
"Gmail1": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Fields For Loop",
"type": "main",
"index": 0
}
]
]
},
"Get Labels": {
"main": [
[
{
"node": "Get Messages",
"type": "main",
"index": 0
}
]
]
},
"Get Messages": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Fields For Loop": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Create Label if Doesn't exist",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Config",
"type": "main",
"index": 0
}
]
]
},
"Get Existing Labels": {
"main": [
[
{
"node": "Filter",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Create Label if Doesn't exist": {
"main": [
[
{
"node": "Get Existing Labels",
"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.
gmailOAuth2googleSheetsOAuth2ApiopenRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
[](https://www.youtube.com/watch?v=BQARyWMD_lU)
Source: https://n8n.io/workflows/4687/ — 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.
This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p
Tired of manually verifying purchase order invoices every single day? This plug-and-play n8n automation template saves your accounts team hours of work by automatically downloading, storing, extractin
Every time a new invoice lands in your inbox, this workflow reads it, extracts all the relevant data using AI, and logs everything into a Google Sheets spreadsheet automatically. No copy-pasting, no f
2-Utility-SaveInvoices_template. Uses agent, googleSheets, httpRequest, googleDrive. Scheduled trigger; 26 nodes.
This n8n template demonstrates how to use AI to fully automate the generation and scheduling of X (formerly Twitter) content based on a specific, predefined persona.