{ "meta": { "instanceId": "workflow-2ce492cf", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:45.174500", "updatedAt": "2025-09-29T07:07:45.174507", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "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, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "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, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "29ce0093-c4c8-41cc-be69-334de3a1d1a2", "name": "OpenAI Chat Model", "type": "n8n-nodes-base.noOp", "position": [ -60, -460 ], "parameters": { "model": { "__rl": true, "mode": "list", "value": "gpt-4o-mini" }, "options": {} }, "credentials": { "openAiApi": { "id": "8gccIjcuf3gvaoEr", "name": "OpenAi account" } }, "typeVersion": 1.2, "notes": "This lmChatOpenAi node performs automated tasks as part of the workflow." }, { "id": "5176f475-704b-446e-b368-ffa395bb089e", "name": "OpenAI Chat Model1", "type": "n8n-nodes-base.noOp", "position": [ 480, -460 ], "parameters": { "model": { "__rl": true, "mode": "list", "value": "gpt-4o-mini" }, "options": {} }, "credentials": { "openAiApi": { "id": "8gccIjcuf3gvaoEr", "name": "OpenAi account" } }, "typeVersion": 1.2, "notes": "This lmChatOpenAi node performs automated tasks as part of the workflow." }, { "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, "notes": "This gmail node performs automated tasks as part of the workflow." }, { "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, "notes": "This gmailTrigger node performs automated tasks as part of the workflow." }, { "id": "5a268b34-38ea-4e55-87ab-8a616e2aa1fa", "name": "Classify appointment", "type": "n8n-nodes-base.noOp", "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, "notes": "This textClassifier node performs automated tasks as part of the workflow." }, { "id": "7b5a8468-09e5-4575-97cb-9175ee02b19d", "name": "Agent", "type": "n8n-nodes-base.noOp", "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, "notes": "This agent node performs automated tasks as part of the workflow." }, { "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, "notes": "This googleCalendarTool node performs automated tasks as part of the workflow." }, { "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, "notes": "This gmail node performs automated tasks as part of the workflow." }, { "id": "error-3d5de3a4", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "pinData": {}, "connections": { "29ce0093-c4c8-41cc-be69-334de3a1d1a2": { "main": [ [ { "node": "error-handler-29ce0093-c4c8-41cc-be69-334de3a1d1a2-09ef3d08", "type": "main", "index": 0 } ] ] }, "5176f475-704b-446e-b368-ffa395bb089e": { "main": [ [ { "node": "error-handler-5176f475-704b-446e-b368-ffa395bb089e-377052a2", "type": "main", "index": 0 } ] ] }, "b61e8061-5719-4c30-97da-e306e7b79b76": { "main": [ [ { "node": "error-handler-b61e8061-5719-4c30-97da-e306e7b79b76-5c4d5f6b", "type": "main", "index": 0 } ] ] } }, "name": "Stickynote Workflow", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "description": "Automated workflow: Stickynote Workflow. This workflow integrates 8 different services: textClassifier, stickyNote, gmailTrigger, agent, stopAndError. It contains 13 nodes and follows best practices for error handling and security.", "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "notes": "Excellent quality workflow: Stickynote Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }