AutomationFlowsAI & RAG › Classify Emails and Send Replies with Gpt-4o and Gotohuman for Supervision

Classify Emails and Send Replies with Gpt-4o and Gotohuman for Supervision

BygotoHuman @gotohuman on n8n.io

Let AI classify your incoming emails and draft replies. Use gotoHuman to approve emails before they are sent out. It also lets you manually edit the draft or even ask for a retry. The workflow is triggered for each new email which gets passed to an AI classification agent. It…

Event trigger★★★★☆ complexityAI-powered24 nodesOpenAI ChatGmail TriggerAgentOutput Parser Structured@Gotohuman/N8N Nodes GotohumanGmail
AI & RAG Trigger: Event Nodes: 24 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #7301 — 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
{
  "nodes": [
    {
      "id": "2b131412-e9f1-4a8b-a268-0c9b21443aa7",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -752,
        256
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {},
      "typeVersion": 1.2
    },
    {
      "id": "db840ba6-5bf2-4355-af2c-35d6a9b2059a",
      "name": "OpenAI Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        368,
        96
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {},
      "typeVersion": 1.2
    },
    {
      "id": "54e8ca88-61d2-4ecf-97be-5bde43f92adf",
      "name": "New Email",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -880,
        16
      ],
      "parameters": {
        "simple": false,
        "filters": {},
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {},
      "typeVersion": 1.2
    },
    {
      "id": "138f84f1-1e44-4a2f-b2cf-574f196fabb1",
      "name": "AI Classifier",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -672,
        16
      ],
      "parameters": {
        "text": "=From: {{ $json.from.text }}\nTo: {{ $json.to.text }}\nSubject: {{ $json.subject }}\nBody:\n{{ $json.text }}",
        "options": {
          "systemMessage": "You are a helpful email assistant analyzing the email passed by the user.\nPlease determine whether we need to reply and if you would flag it as important. Also classify the email into one of the following categories:\n- Customer Support\n- Partnership Inquiry\n- Sales opportunity\n- Transactional notification\n- Promotion\n- Spam\n- Personal"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "f96111be-c199-4e19-84d7-15062c5bbcae",
      "name": "AI Email Writer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        416,
        -80
      ],
      "parameters": {
        "text": "=From: {{ $('New Email').item.json.from.text }}\nTo: {{ $('New Email').item.json.to.text }}\nSubject: {{ $('New Email').item.json.subject }}\nBody:\n{{ $('New Email').item.json.text }}",
        "options": {
          "systemMessage": "={{ $json.prompt }}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "4aa78fde-0378-43ac-8de4-5eb16d4654db",
      "name": "No reply",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1632,
        -176
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "fabc6e2c-338c-4fd5-892e-a9d41eb2fbf7",
      "name": "Set Prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        -80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d1b93765-fd43-4c01-aff9-f96170b77cd9",
              "name": "prompt",
              "type": "string",
              "value": "You are a helpful email assistant. Please draft a reply to the email passed by the user. Match the writing style of the received email. If you cannot answer questions or draft a complete reply, incl. placeholders. A user will review your draft after this and can fill in more info. Incl. the body of the email only, we are responding within the thread."
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "052cbe31-443a-4b3a-8429-fb775703eee0",
      "name": "Set (edited) prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        1632,
        512
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f10b4f0b-3756-48e9-a7f6-51299ad48427",
              "name": "prompt",
              "type": "string",
              "value": "={{ $json.messages[0].content || $('Set Prompt').item.json.prompt }}"
            },
            {
              "id": "9a7c60fe-a782-4660-97fe-a7fc851cbb45",
              "name": "reviewToUpdate",
              "type": "string",
              "value": "={{ $json.reviewId }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "333ddcdf-c633-4824-9096-d1d47a564eb9",
      "name": "Structured Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        576,
        96
      ],
      "parameters": {
        "jsonSchemaExample": "{\n\t\"textEmailDraft\": \"Hello Jack...\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "6b82f29b-240a-42ba-a326-cfe92660e621",
      "name": "Structured Output1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -480,
        256
      ],
      "parameters": {
        "jsonSchemaExample": "{\n\t\"classifiedAs\": \"support\",\n    \"needsReply\": true,\n    \"important\": false\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "3d2ca961-b126-4b45-a87c-675128886bbb",
      "name": "Needs Human Attention?",
      "type": "n8n-nodes-base.switch",
      "position": [
        -320,
        0
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Needs reply",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "b5af0410-a10b-4b7c-a4e9-33f351a9c988",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.output.needsReply }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Needs no reply but important",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "ace11ff1-0722-475a-ba61-706bc21f9e8f",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ !$json.output.needsReply && $json.output.important }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Don't bother",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "d36d5ec4-90a8-4a70-bedd-4a3534dc0308",
                    "operator": {
                      "type": "boolean",
                      "operation": "true",
                      "singleValue": true
                    },
                    "leftValue": "={{ !$json.output.needsReply && !$json.output.important }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "b8d8ef38-2c99-418b-94bd-9fcd825a3a3a",
      "name": "Not important",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -80,
        192
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "8afb91b3-70ca-4d20-8dc0-d8e82d47b16b",
      "name": "gotoHuman: Human review",
      "type": "@gotohuman/n8n-nodes-gotohuman.gotoHuman",
      "position": [
        1056,
        0
      ],
      "parameters": {
        "fields": {
          "value": {
            "email": "={{ $('New Email').item.json.textAsHtml }}",
            "sender": "={{ $('New Email').item.json.from.text }}",
            "emailDraft": "={{ $json.output?.textEmailDraft ? {ai: {prompt: $('Set Prompt').item.json.prompt}, content: $json.output?.textEmailDraft} : \"No reply needed - FYI only\" }}",
            "classification": "={{ $('AI Classifier').item.json.output.classifiedAs }}"
          },
          "schema": [
            {
              "id": "sender",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "sender (textShort)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "email (emailHtml)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "classification",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "classification (textShort)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "emailDraft",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "emailDraft (text)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "additionalFields": {
          "updateForReviewId": "={{ $('Set (edited) prompt').isExecuted ? $('Set (edited) prompt').item.json.reviewToUpdate : null }}"
        },
        "reviewTemplateID": {
          "__rl": true,
          "mode": "list"
        }
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "d7496fcc-e8d5-45fd-94af-0190be114308",
      "name": "Human response",
      "type": "n8n-nodes-base.switch",
      "position": [
        1360,
        -16
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Rejected",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "c25eb32d-e664-420c-8574-946f9e1c10cf",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.response }}",
                    "rightValue": "rejected"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Approved",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "a55f8641-84eb-4043-a573-9958b9606571",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.response }}",
                    "rightValue": "approved"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Retry",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "feaea8d7-d127-4a03-a87d-2269551ab775",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "chat"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "c1b741a5-4bb5-4570-acae-c4d6d0aef7f4",
      "name": "Reply to thread",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2016,
        0
      ],
      "parameters": {
        "message": "={{ $json.responseValues.emailDraft.value }}",
        "options": {
          "appendAttribution": false
        },
        "emailType": "text",
        "messageId": "={{ $('New Email').item.json.id }}",
        "operation": "reply"
      },
      "credentials": {},
      "typeVersion": 2.1
    },
    {
      "id": "2d0ee5a2-b7f6-4e83-9640-4005526c451b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        -80
      ],
      "parameters": {
        "color": 7,
        "height": 272,
        "content": "![Source example](https://cdn.prod.website-files.com/6605a2979ff17b2cd1939cd4/6877ff9cd93f480ff6eb4def_677c04b5cd6a77eb434526bf9c0eaaca_gotoHuman%20full%20logo.svg)"
      },
      "typeVersion": 1
    },
    {
      "id": "b24bd496-feed-4825-8de2-0c04252ffa9e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        -224
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 640,
        "content": "## Classify Email\nWe ask AI to classify the received email into one of the categories defined in the prompt. It also determines whether a reply is needed and it is deemed important."
      },
      "typeVersion": 1
    },
    {
      "id": "cb439e6b-dbe7-4e8a-9830-ea95293319c1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 624,
        "content": "## Draft Email Response\nIf it was determined that a reply is required, we ask AI to draft a response. It might incl. placeholders for a human to replace during review."
      },
      "typeVersion": 1
    },
    {
      "id": "83096ad5-1749-4863-85c7-05148bc8c583",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        912,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 624,
        "content": "## Human Review\nAsk a human to review the received email and approve any AI-drafted response via gotoHuman.\nDrafts can be manually edited or retried in gotoHuman (Retries loop back to the AI email writer node)."
      },
      "typeVersion": 1
    },
    {
      "id": "aeeda5cc-c5ff-4bfe-ac35-7730efca93bb",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        912,
        448
      ],
      "parameters": {
        "color": 7,
        "width": 896,
        "height": 336,
        "content": "## Human asked for Retry\nIn gotoHuman the reviewer clicked retry or edited the prompt to iterate on the LLM output."
      },
      "typeVersion": 1
    },
    {
      "id": "c20abf9e-385a-4263-9205-8739a95093be",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1808,
        -224
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 432,
        "content": "## Send approved Reply\nSend the approved response as a reply to the email thread"
      },
      "typeVersion": 1
    },
    {
      "id": "e5994c92-1179-421d-957a-ecc413e41e8d",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -1056
      ],
      "parameters": {
        "width": 784,
        "height": 816,
        "content": "gotoHuman - Reviewing\n![Pic](https://cdn.prod.website-files.com/6605a2979ff17b2cd1939cd4/689b5e250227be98ca4d11e2_gth-review.JPG)"
      },
      "typeVersion": 1
    },
    {
      "id": "890831e1-89c0-4978-9b1f-6bdd00fceea4",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        800
      ],
      "parameters": {
        "width": 1072,
        "height": 352,
        "content": "gotoHuman - Retrying with AI\n![Pic](https://cdn.prod.website-files.com/6605a2979ff17b2cd1939cd4/689b5eb249cfe598f6ef0305_gth-chat.JPG)"
      },
      "typeVersion": 1
    },
    {
      "id": "3ecfaedc-0b01-47f4-b6d1-bbde0426cc23",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        -976
      ],
      "parameters": {
        "width": 688,
        "height": 720,
        "content": "## AI Email Assistant \ud83e\udd16\ud83d\udce7\n### Classifies, Drafts and Sends Human-Approved Reply\n\nThis shows an AI-based email assistant that reads each new incoming email, drafts a reply and sends it after human approval in gotoHuman.\n\n### \u26a0\ufe0f How to set up\n[ ] In n8n, install the gotoHuman node **before** importing this template or some settings will be missing (Just add the node to a blank canvas before importing)\n\n[ ] Create gotoHuman account, copy API key\n\n[ ] In gotoHuman, select and create the pre-built review template **Email agent** or import the ID: `v81wzxwYoFYvWpmuIBgX`\n[ ] In the gotoHuman node, set up the credentials using your API key and select the review template \"Email Smart Reply\" from the list (This is the one you just imported)\n[ ] Connect Gmail and OpenAI account\n\n### Requirements\n- gotoHuman account for human supervision\n- OpenAI account for classification and email draft\n- Gmail for emails"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "New Email": {
      "main": [
        [
          {
            "node": "AI Classifier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Prompt": {
      "main": [
        [
          {
            "node": "AI Email Writer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Classifier": {
      "main": [
        [
          {
            "node": "Needs Human Attention?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Human response": {
      "main": [
        [
          {
            "node": "No reply",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Reply to thread",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set (edited) prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Email Writer": {
      "main": [
        [
          {
            "node": "gotoHuman: Human review",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Classifier",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output": {
      "ai_outputParser": [
        [
          {
            "node": "AI Email Writer",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "AI Email Writer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output1": {
      "ai_outputParser": [
        [
          {
            "node": "AI Classifier",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Set (edited) prompt": {
      "main": [
        [
          {
            "node": "AI Email Writer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Needs Human Attention?": {
      "main": [
        [
          {
            "node": "Set Prompt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "gotoHuman: Human review",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Not important",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "gotoHuman: Human review": {
      "main": [
        [
          {
            "node": "Human response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Let AI classify your incoming emails and draft replies. Use gotoHuman to approve emails before they are sent out. It also lets you manually edit the draft or even ask for a retry. The workflow is triggered for each new email which gets passed to an AI classification agent. It…

Source: https://n8n.io/workflows/7301/ — 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 automatically classifies every new email from your linked mailbox, drafts a personalized reply, and creates Linear tickets for bugs or feature requests. It uses a human-in-the-loop with

OpenAI Chat, Gmail Trigger, Agent +5
AI & RAG

This n8n workflow automates sales processes using AI agents integrated with Airtable as a CRM and Gmail for email handling. It consists of two main workflows: one for handling Airtable status changes

Airtable Trigger, Agent, OpenAI Chat +9
AI & RAG

mails2notion V2. Uses lmChatOpenAi, toolCalculator, outputParserStructured, gmail. Event-driven trigger; 38 nodes.

OpenAI Chat, Tool Calculator, Output Parser Structured +5
AI & RAG

This workflow automatically creates Tasks from forwarded Emails, similar to Asana, but better. Emails are processed by AI and converted to rather actionable task.

OpenAI Chat, Tool Calculator, Output Parser Structured +5
AI & RAG

Enterprise-grade resume screening automation built for production environments. This workflow combines intelligent AI analysis with comprehensive error handling to ensure reliable processing of candid

Gmail Trigger, Google Drive, HTTP Request +6