AutomationFlowsAI & RAG › AI Email Organizer for Gmail

AI Email Organizer for Gmail

Original n8n title: AI Email Organizer for Gmail - Advanced Email Management & Sorting

ByMilan Vasarhelyi - SmoothWork @vasarmilan on n8n.io

[](https://www.youtube.com/watch?v=BQARyWMD_lU)

Cron / scheduled trigger★★★★☆ complexityAI-powered18 nodesAgentOpenRouter ChatGoogle SheetsGmail
AI & RAG Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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![Milan](https://gravatar.com/avatar/95700d17ba300a9f14c1b8cacf933df7720027b3adda9cbe6183d89142925422?r=pg&d=retro&size=100)\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[![image.png](https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Screenshot_2025_07_09_112813_949f1ca667.png)](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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

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

OpenAI Chat, Output Parser Item List, HTTP Request +10
AI & RAG

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

OpenRouter Chat, Agent, Google Sheets +2
AI & RAG

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

HTTP Request, @Ainoflow/N8N Nodes Ainoflow, OpenRouter Chat +5
AI & RAG

2-Utility-SaveInvoices_template. Uses agent, googleSheets, httpRequest, googleDrive. Scheduled trigger; 26 nodes.

Agent, Google Sheets, HTTP Request +4
AI & RAG

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.

OpenRouter Chat, Agent, Output Parser Structured +4