AutomationFlowsAI & RAG › Send Ai-generated Gmail Auto Replies with Gpt-4o-mini and Google Sheets

Send Ai-generated Gmail Auto Replies with Gpt-4o-mini and Google Sheets

Bykota @takasuka on n8n.io

This workflow automatically replies to important incoming Gmail messages using AI, while preventing duplicate or unnecessary replies.

Event trigger★★★★☆ complexityAI-powered17 nodesGmail TriggerGoogle SheetsGmailOpenAI
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #12652 — we link there as the canonical source.

This workflow follows the Gmail → 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 →

Download .json
{
  "id": "xeTX0nJdkctSWcIt",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Gmail AI Auto Reply with Duplicate Prevention",
  "tags": [],
  "nodes": [
    {
      "id": "893a885d-8c20-4a31-9a2e-06c844f69cdc",
      "name": "Config - Rules & Thresholds",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "646e1b67-c0be-4e37-a91a-ed5fdcb83994",
              "name": "ignoreListIncludes",
              "type": "string",
              "value": "unsubscribe|newsletter|no-reply|noreply|notification|do-not-reply|marketing|promo|promotion"
            },
            {
              "id": "374b7547-c972-4315-b1ad-5db8e60da712",
              "name": "ignoreSubjectIncludes",
              "type": "string",
              "value": "sale|discount|coupon|points|promotion|campaign|special offer|deal|new arrivals|update|digest|weekly|daily|newsletter"
            },
            {
              "id": "ee58befb-be0a-469b-81ee-47cb39682dc8",
              "name": "ignoreLabelsIncludes",
              "type": "string",
              "value": "CATEGORY_PROMOTIONS|CATEGORY_SOCIAL"
            },
            {
              "id": "8d1a5a95-b87b-4e17-90fe-ddd22abe6b89",
              "name": "importantReplyHistoryDays",
              "type": "number",
              "value": 365
            },
            {
              "id": "49a07c51-1840-43b9-b22b-8d3664781a9b",
              "name": "aiRunIfUncertain",
              "type": "boolean",
              "value": true
            },
            {
              "id": "2f09cb3b-e835-4a2b-9214-b9369b8a162f",
              "name": "urgentScoreThreshold",
              "type": "number",
              "value": 80
            },
            {
              "id": "a673ab59-3647-4379-82f9-94174a137da0",
              "name": "importantScoreThreshold",
              "type": "number",
              "value": 60
            },
            {
              "id": "cf509a5d-169e-4d6b-a32d-390372770e02",
              "name": "alertEmailTo",
              "type": "string",
              "value": "user@example.com"
            },
            {
              "id": "e85bd045-5951-4873-9fe2-f91515251bfb",
              "name": "alertEmailSubjectPrefix",
              "type": "string",
              "value": "[IMPORTANT INBOX]"
            },
            {
              "id": "1d21a25c-381a-4f82-a7b9-711b237264da",
              "name": "sheetName",
              "type": "string",
              "value": "inbox_audit_log"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "acabf18f-19f9-4040-a7fc-05221afdc25b",
      "name": "Gmail Trigger - New Emails",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -32,
        0
      ],
      "parameters": {
        "filters": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "0b4cc9ec-addd-4126-a80c-ecbe61e9415b",
      "name": "Normalize - Email Payload",
      "type": "n8n-nodes-base.set",
      "position": [
        416,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "2200c448-701b-404d-af7d-de5cc9da554c",
              "name": "Normalize - Email Payload",
              "type": "string",
              "value": "=={{ $json.id }}"
            },
            {
              "id": "56a0a6cb-0c79-4cf9-9ac5-56ad3bfe29be",
              "name": "from_raw",
              "type": "string",
              "value": "=={{ $json.from }}\n"
            },
            {
              "id": "f4277f7f-913f-40cd-985c-c653e6422e65",
              "name": "from_lower",
              "type": "string",
              "value": "=={{ ($json.from || '').toLowerCase() }}\n"
            },
            {
              "id": "ae4d8b6c-cda4-4b8f-8b54-7d6532e8cbc5",
              "name": "subject_raw",
              "type": "string",
              "value": "=={{ $json.subject }}\n"
            },
            {
              "id": "deb5f8b2-4344-45bb-9337-d78540c9f581",
              "name": "subject_lower",
              "type": "string",
              "value": "=={{ ($json.subject || '').toLowerCase() }}\n"
            },
            {
              "id": "49c18d22-ea3a-44e6-830c-406e7ae5b0ad",
              "name": "body_raw",
              "type": "string",
              "value": "=={{ $json.textPlain || $json.snippet || '' }}\n"
            },
            {
              "id": "73afe23f-1120-408e-bfa7-4252dda50193",
              "name": "body_lower",
              "type": "string",
              "value": "=={{ ($json.textPlain || $json.snippet || '').toLowerCase() }}\n"
            },
            {
              "id": "fca3b7f4-055d-414d-a876-96f3833eab78",
              "name": "labels",
              "type": "string",
              "value": "=={{ ($json.labelIds || []).join('|') }}\n"
            },
            {
              "id": "62b28045-2c9c-4322-999e-f6b7fae8f5ba",
              "name": "",
              "type": "string",
              "value": ""
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "42341e74-8229-46c6-b555-6116b9622d55",
      "name": "IF - Ignore Filter",
      "type": "n8n-nodes-base.if",
      "position": [
        704,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "aebf7615-593a-475f-ac8f-8ff3a0c3441f",
              "operator": {
                "type": "string",
                "operation": "regex"
              },
              "leftValue": "={{ $json.from_lower }}",
              "rightValue": "={{ \"(?:^|[^a-z0-9])(unsubscribe|newsletter|no-reply|noreply|notification|do-not-reply|marketing|promo|promotion)(?:[^a-z0-9]|$)\" }}\n"
            },
            {
              "id": "76487191-ceef-415a-982c-478f1aafb8d8",
              "operator": {
                "type": "string",
                "operation": "regex"
              },
              "leftValue": "={{ $json.subject_lower }}",
              "rightValue": "={{ \"(sale|discount|coupon|points|promotion|campaign|special\\\\s+offer|deal|new\\\\s+arrivals|update|digest|weekly|daily|newsletter)\" }}\n"
            },
            {
              "id": "eb67d60d-66c7-4b57-8ac9-e3fec08e6f56",
              "operator": {
                "type": "string",
                "operation": "regex"
              },
              "leftValue": "={{ $json.labels }}",
              "rightValue": "={{ \"(CATEGORY_PROMOTIONS|CATEGORY_SOCIAL)\" }}\n"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "c8d00799-0002-435d-8a85-fc9d9beed94c",
      "name": "Code - Extract Sender Email",
      "type": "n8n-nodes-base.code",
      "position": [
        1072,
        0
      ],
      "parameters": {
        "jsCode": "const fromRaw = $json.from_raw || $json.from || '';\nconst m = fromRaw.match(/<([^>]+)>/);\nconst email = (m ? m[1] : fromRaw).trim().toLowerCase();\n\nreturn [{\n  ...$json,\n  sender_email: email,\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "3aeda011-622c-43bd-9fbe-962c886c95a5",
      "name": "Get row(s) in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1280,
        0
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.sender_email }}",
              "lookupColumn": "sender_email"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KNCipEl77X5zbINaBPHhBDvWBdr3yE3C8-H-sPvx6N4/edit#gid=0",
          "cachedResultName": "\u30b7\u30fc\u30c81"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1KNCipEl77X5zbINaBPHhBDvWBdr3yE3C8-H-sPvx6N4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KNCipEl77X5zbINaBPHhBDvWBdr3yE3C8-H-sPvx6N4/edit?usp=drivesdk",
          "cachedResultName": "reply_history"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d6280885-198d-4a07-af2d-bc5052c5749e",
      "name": "IF - Found in Reply History?",
      "type": "n8n-nodes-base.if",
      "position": [
        1504,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "384a7902-1045-4752-9935-19bc3f047bf4",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $input.all().length > 0 }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "ae24178d-8250-4e58-a8e4-7c5373575ddd",
      "name": "Gmail - Search Sent to Sender",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1776,
        0
      ],
      "parameters": {
        "limit": 20,
        "filters": {
          "q": "={{ \"in:sent to:\" + $json.sender_email + \" newer_than:\" + $json.importantReplyHistoryDays + \"d\" }}"
        },
        "operation": "getAll"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a34766da-013a-44b8-b451-13c167b0208a",
      "name": "IF - Sent history exists?",
      "type": "n8n-nodes-base.if",
      "position": [
        1984,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "83a8a44a-ca7a-42e4-ae9a-5ce47bfc51ad",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $items().length > 0 }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "206ef0f7-568b-4de5-b3ba-f534d0ac89f7",
      "name": "Reply to a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2592,
        0
      ],
      "parameters": {
        "message": "={{$json.text}}",
        "options": {},
        "emailType": "text",
        "messageId": "={{$json.id}}",
        "operation": "reply"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "026d4ffd-62b8-404b-bc74-49c4bb8629c1",
      "name": "Message a model",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        2272,
        0
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "responses": {
          "values": [
            {
              "content": "=Write a polite and natural English email reply to the following message.\n\nRules:\n- Do not guess missing information.\n- Be clear and concise.\n- Sound human, not automated.\n- Under 120 words.\n- End with one clear next action.\n\nSubject:\n{{$json.subject}}\n\nEmail body:\n{{$json.text || $json.snippet}}\n"
            }
          ]
        },
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9e2685f7-3bc9-4101-ac77-1cee9a52e6bf",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 528,
        "content": "## Overview \u2013 Workflow Purpose\nThis workflow automatically replies to important incoming Gmail messages.\nIt avoids duplicate replies by checking both a Google Sheet reply history\nand recent sent emails in Gmail before responding.\nOnly emails that pass all filters receive an AI-generated English reply.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e761d851-fb8a-4f0a-a824-7aff61ffa6b7",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 320,
        "content": "## Step 1 \u2013 Email Intake & Normalization\nReceive new Gmail emails, load global rules and thresholds,\nand normalize email data into a consistent structure\nfor stable downstream processing.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9aa34137-388d-4534-9ce7-1b64ac058be1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 320,
        "content": "## Step 2 \u2013 Ignore Unwanted Emails\nFilter out newsletters, promotions, and irrelevant emails.\nMessages that match ignore rules are stopped immediately."
      },
      "typeVersion": 1
    },
    {
      "id": "5b8def90-a228-4cb4-9880-2bef56e1848b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 320,
        "content": "## Step 3 \u2013 Reply History Check (Google Sheet)\nExtract the sender\u2019s email address and check\nwhether it already exists in the Google Sheet reply history.\nIf found, no reply is sent."
      },
      "typeVersion": 1
    },
    {
      "id": "c2c19b15-0ed4-46e9-b096-ca2337f36de9",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1696,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 320,
        "content": "## Step 4 \u2013 Recent Sent Email Check (Gmail)\nSearch Gmail for recently sent messages to the same sender.\nIf a recent reply exists within the defined time window,\nthe workflow stops to prevent duplicate replies."
      },
      "typeVersion": 1
    },
    {
      "id": "84b668cb-d1cf-47f7-8a25-92bf5fe39024",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2208,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 320,
        "content": "## Step 5 \u2013 AI Reply Generation & Sending\nGenerate a clear English reply using AI\nand send it as a reply to the original Gmail message.\nThis step runs only when no duplicate reply is detected."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "9a4b856f-b905-42de-b159-86ea65d504b6",
  "connections": {
    "Message a model": {
      "main": [
        [
          {
            "node": "Reply to a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Ignore Filter": {
      "main": [
        [],
        [
          {
            "node": "Code - Extract Sender Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "IF - Found in Reply History?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Sent history exists?": {
      "main": [
        [],
        [
          {
            "node": "Message a model",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize - Email Payload": {
      "main": [
        [
          {
            "node": "IF - Ignore Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail Trigger - New Emails": {
      "main": [
        [
          {
            "node": "Config - Rules & Thresholds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Extract Sender Email": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Config - Rules & Thresholds": {
      "main": [
        [
          {
            "node": "Normalize - Email Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Found in Reply History?": {
      "main": [
        [],
        [
          {
            "node": "Gmail - Search Sent to Sender",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail - Search Sent to Sender": {
      "main": [
        [
          {
            "node": "IF - Sent history exists?",
            "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

This workflow automatically replies to important incoming Gmail messages using AI, while preventing duplicate or unnecessary replies.

Source: https://n8n.io/workflows/12652/ — 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

Complete AI-powered sales system Automates lead capture, qualification, and follow-up from multiple channels. AI INTELLIGENCE:

Gmail Trigger, Google Sheets, OpenAI +3
AI & RAG

This n8n workflow — HRMate — streamlines your entire recruitment process by automatically parsing incoming job applications, evaluating candidate fit using AI, and sending personalized acceptance or r

HTTP Request, Gmail Trigger, OpenAI +2
AI & RAG

Overview

Gmail Trigger, Google Drive, OpenAI +4
AI & RAG

A fully automated, AI-powered email assistant built in n8n that reads incoming emails, understands their intent and sentiment, classifies them by category, drafts intelligent context-aware replies, an

Gmail Trigger, Slack, Gmail +2
AI & RAG

Small teams, solo operators, and security-conscious individuals who receive email attachments from external senders. Useful for freelancers, agencies, HR teams, and anyone handling CVs, invoices, or d

Gmail Trigger, HTTP Request, OpenAI +4