AutomationFlowsAI & RAG › AI Gmail Reply Agent with Calendar Check

AI Gmail Reply Agent with Calendar Check

Original n8n title: Gmail Googlecalendartool

Gmail Googlecalendartool. Uses stickyNote, lmChatOpenAi, gmail, gmailTrigger. Event-driven trigger; 10 nodes.

Event trigger★★★☆☆ complexityAI-powered10 nodesOpenAI ChatGmailGmail TriggerText ClassifierAgentGoogle Calendar Tool
AI & RAG Trigger: Event Nodes: 10 Complexity: ★★★☆☆ AI nodes: yes Added:

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": "eaa31cde-3017-400d-aac8-999def8cc227",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        -780
      ],
      "parameters": {
        "width": 617,
        "height": 490,
        "content": "## Check if incoming email is about appointment\nWe use LLM to check subject and body of the email and determine if it's an appointment request. "
      },
      "typeVersion": 1
    },
    {
      "id": "b03d3f72-d1d8-49a7-bcc1-a476fd5c4ad7",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -780
      ],
      "parameters": {
        "width": 796,
        "height": 482,
        "content": "## Get calendar availability and compose a response\nMake sure to update the Workflow ID if you are running this as 2 workflows"
      },
      "typeVersion": 1
    },
    {
      "id": "29ce0093-c4c8-41cc-be69-334de3a1d1a2",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -60,
        -460
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5176f475-704b-446e-b368-ffa395bb089e",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        480,
        -460
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0e8a75dd-ce68-46c3-972c-32b15e04b254",
      "name": "Send reply",
      "type": "n8n-nodes-base.gmail",
      "position": [
        940,
        -660
      ],
      "parameters": {
        "message": "={{ $json.output }}",
        "options": {},
        "messageId": "={{ $('Gmail Trigger').first().json.id }}",
        "operation": "reply"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "bf154384-274a-4cdd-977d-890220948a9d",
      "name": "Gmail Trigger",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -280,
        -640
      ],
      "parameters": {
        "filters": {
          "readStatus": "unread",
          "includeSpamTrash": false
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5a268b34-38ea-4e55-87ab-8a616e2aa1fa",
      "name": "Classify appointment",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        -60,
        -640
      ],
      "parameters": {
        "options": {
          "fallback": "discard"
        },
        "inputText": "=Please evaluate the following email to determine if it suggests scheduling a meeting or a call:\nSubject: {{ $json.Subject }}\nSnippet: {{ $json.snippet }}",
        "categories": {
          "categories": [
            {
              "category": "is_appointment",
              "description": "email Is requesting an appointment"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7b5a8468-09e5-4575-97cb-9175ee02b19d",
      "name": "Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        500,
        -660
      ],
      "parameters": {
        "text": "=Sender: {{ $('Gmail Trigger').first().json.From }}\nSubject: {{ $('Gmail Trigger').first().json.Subject }}\nEmail Text: {{ $('Gmail Trigger').first().json.snippet }}",
        "options": {
          "systemMessage": "=You are an email scheduling assistant. Based on the received email, check my availability and propose an appropriate response. \nAim to get a specific time, rather than just a day. When checking my availability, make sure that there's enough time in between meetings.\nIf I'm not available, ALWAYS propose a new time based on my availability. When proposing a new time, always leave 15 minutes buffer from previous meeting.\nToday date and time is: {{ $now.toISO() }}."
        },
        "promptType": "define"
      },
      "typeVersion": 1.8
    },
    {
      "id": "b61e8061-5719-4c30-97da-e306e7b79b76",
      "name": "Google Calendar",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        680,
        -460
      ],
      "parameters": {
        "options": {},
        "timeMax": "={{ $now.plus(1, 'month').toISO() }}",
        "timeMin": "={{ $now.minus(1, 'day').toISO() }}",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "your_email@gmail.com"
        },
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "47e07b6c-d432-4111-b33e-56d6c305c40c",
      "name": "Mark as read",
      "type": "n8n-nodes-base.gmail",
      "position": [
        940,
        -480
      ],
      "parameters": {
        "messageId": "={{ $('Gmail Trigger').first().json.id }}",
        "operation": "markAsRead"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    }
  ],
  "connections": {
    "Agent": {
      "main": [
        [
          {
            "node": "Send reply",
            "type": "main",
            "index": 0
          },
          {
            "node": "Mark as read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Classify appointment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar": {
      "ai_tool": [
        [
          {
            "node": "Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Classify appointment",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Classify appointment": {
      "main": [
        [
          {
            "node": "Agent",
            "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

Gmail Googlecalendartool. Uses stickyNote, lmChatOpenAi, gmail, gmailTrigger. Event-driven trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — 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

The purpose of this n8n workflow is to automate the process of identifying incoming Gmail emails that are requesting an appointment, evaluating their content, checking calendar availability, and then

OpenAI Chat, Gmail, Gmail Trigger +3
AI & RAG

Inbox Guardian. Uses gmailTrigger, lmChatOpenAi, agent, textClassifier. Event-driven trigger; 66 nodes.

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

E-mail Assistant Agent. Uses gmailTrigger, textClassifier, gmail, lmChatOpenAi. Event-driven trigger; 29 nodes.

Gmail Trigger, Text Classifier, Gmail +6
AI & RAG

The workflow detects incoming job-application emails, extracts resumes, and parses them for AI analysis. It evaluates each candidate against three open roles and assigns a fit score with structured re

Gmail Trigger, OpenAI, Gmail +7
AI & RAG

This workflow is ideal for: Customer support teams looking to reduce manual response time SaaS companies that frequently receive product inquiries E-commerce stores with common customer questions abou

OpenAI Chat, Output Parser Structured, Google Sheets Tool +5