Workflow: develop a modular n8n workflow that supports Gmail Googlecalendartool Send Triggered
Integrations: gmail, gmailTrigger, googleCalendarTool, stickyNote

{"meta": {"instanceId": "408f9fb9940c3cb18ffdef0e0150fe342d6e655c3a9fac21f0f644e8bedabcd9", "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": {"id": "8gccIjcuf3gvaoEr", "name": "OpenAi account"}}, "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": {"id": "8gccIjcuf3gvaoEr", "name": "OpenAi account"}}, "typeVersion": 1.2}, {"id": "0e8a75dd-ce68-46c3-972c-32b15e04b254", "name": "Send reply", "type": "n8n-nodes-base.gmail", "position": [940, -660], "webhookId": "0f18d414-1b14-4d2e-9fc2-d2d302372dc6", "parameters": {"message": "={{ $json.output }}", "options": {}, "messageId": "={{ $('Gmail Trigger').first().json.id }}", "operation": "reply"}, "credentials": {"gmailOAuth2": {"id": "Sf5Gfl9NiFTNXFWb", "name": "Gmail account"}}, "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": {"id": "Sf5Gfl9NiFTNXFWb", "name": "Gmail account"}}, "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": {"id": "kWMxmDbMDDJoYFVK", "name": "Google Calendar account"}}, "typeVersion": 1.3}, {"id": "47e07b6c-d432-4111-b33e-56d6c305c40c", "name": "Mark as read", "type": "n8n-nodes-base.gmail", "position": [940, -480], "webhookId": "7e2d851b-c9f3-471c-875d-0da7c2c3b561", "parameters": {"messageId": "={{ $('Gmail Trigger').first().json.id }}", "operation": "markAsRead"}, "credentials": {"gmailOAuth2": {"id": "Sf5Gfl9NiFTNXFWb", "name": "Gmail account"}}, "typeVersion": 2.1}], "pinData": {}, "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}], []]}}}