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": "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.
gmailOAuth2googleCalendarOAuth2ApiopenAiApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
Inbox Guardian. Uses gmailTrigger, lmChatOpenAi, agent, textClassifier. Event-driven trigger; 66 nodes.
E-mail Assistant Agent. Uses gmailTrigger, textClassifier, gmail, lmChatOpenAi. Event-driven trigger; 29 nodes.
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
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