This workflow corresponds to n8n.io template #5789 — we link there as the canonical source.
This workflow follows the Agent → Discord 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": "7fe486a9-4155-46b0-919d-9415294d933b",
"name": "Gmail Trigger",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-220,
1560
],
"parameters": {
"simple": false,
"filters": {},
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2a7c6a45-1f8e-4e24-bc6d-46ae2f615157",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
1480
],
"parameters": {
"color": 4,
"width": 460,
"height": 280,
"content": "## account1@gmail.com\n"
},
"typeVersion": 1
},
{
"id": "4029c86a-0a6e-4778-8f18-3938c01bbac3",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
1780
],
"parameters": {
"color": 6,
"width": 460,
"height": 280,
"content": "## account2@gmail.com\n\n"
},
"typeVersion": 1
},
{
"id": "44cab983-4b76-4d2b-85ba-7f2afd2b9751",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
2340
],
"parameters": {
"color": 5,
"width": 460,
"height": 240,
"content": "## account4@gmail.com\n\n"
},
"typeVersion": 1
},
{
"id": "3f6baa23-ade2-47e3-98ab-84495358ffac",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
2080
],
"parameters": {
"color": 3,
"width": 460,
"height": 240,
"content": "## account3@gmail.com\n\n"
},
"typeVersion": 1
},
{
"id": "58d2a3eb-cff8-49cb-9fa7-c8585007fe81",
"name": "Gmail Trigger1",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-200,
1860
],
"parameters": {
"simple": false,
"filters": {},
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "d04aabfe-27f2-43b7-8248-30c8792a1b9e",
"name": "Gmail Trigger2",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-200,
2400
],
"parameters": {
"simple": false,
"filters": {},
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "e712e083-bad9-43bc-ba5d-a8d4444eb840",
"name": "Gmail Trigger3",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-200,
2140
],
"parameters": {
"simple": false,
"filters": {},
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "26c242d1-6bdf-4f0b-9beb-96172766260c",
"name": "Merge4",
"type": "n8n-nodes-base.merge",
"position": [
380,
1600
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.1
},
{
"id": "a507c42c-48cf-4576-b1c9-0358e51ca7e0",
"name": "medium4",
"type": "n8n-nodes-base.set",
"position": [
0,
2140
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6d582588-255e-4113-9811-3046c8f9861c",
"name": "discord_channel",
"type": "string",
"value": "=1234567891"
},
{
"id": "f69cbf07-eb5c-4987-bdb1-bc7e851ac68b",
"name": "email",
"type": "string",
"value": "user@example.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ebf4ec42-b490-4fde-9905-b6020383f553",
"name": "medium5",
"type": "n8n-nodes-base.set",
"position": [
0,
2400
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6d582588-255e-4113-9811-3046c8f9861c",
"name": "discord_channel",
"type": "string",
"value": "=1234567892"
},
{
"id": "f69cbf07-eb5c-4987-bdb1-bc7e851ac68b",
"name": "email",
"type": "string",
"value": "user@example.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2ffcbca0-e8da-412a-bda8-c2f2fe203c6d",
"name": "medium6",
"type": "n8n-nodes-base.set",
"position": [
-20,
1860
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6d582588-255e-4113-9811-3046c8f9861c",
"name": "discord_channel",
"type": "string",
"value": "=1234567893"
},
{
"id": "f69cbf07-eb5c-4987-bdb1-bc7e851ac68b",
"name": "email",
"type": "string",
"value": "user@example.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "af0cf074-5659-4436-82b1-2feaf856b132",
"name": "medium7",
"type": "n8n-nodes-base.set",
"position": [
-20,
1560
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6d582588-255e-4113-9811-3046c8f9861c",
"name": "discord_channel",
"type": "string",
"value": "=1234567894"
},
{
"id": "f69cbf07-eb5c-4987-bdb1-bc7e851ac68b",
"name": "email",
"type": "string",
"value": "user@example.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "d0f33ea4-9c96-49b5-900e-d279ca19763a",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
360,
2160
],
"parameters": {
"path": "email-feedback",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "06487c07-2f5f-47f4-80c2-4dcd3c6ae232",
"name": "AI Agent1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
580,
2160
],
"parameters": {
"text": "=User Input : {{ $('Webhook').item.json.body.content.text }}\n\nReference discord message: {{ JSON.stringify($json.body.original_message.reference) }}",
"options": {
"systemMessage": "You are an AI agent running inside an n8n workflow.\nYou have three tools available:\n\u2022 getDiscordMessage(reference) \u2013 retrieves a Discord message when given a valid reference object\n\u2022 getSpamList() \u2013 retrieves the current list of spam emails and domains from Google Sheets\n\u2022 updateSpamList(columns) \u2013 appends or updates a row in the \u201cEmail spam list\u201d sheet with the given columns\n\nBehavior:\n\nIf the user\u2019s input indicates they want to classify an email (e.g. \u201cspam\u201d or \u201clegit\u201d):\na. If a valid reference object is provided, invoke getDiscordMessage(reference).\nb. Invoke getSpamList().\nc. Determine sender_email and domain from the retrieved message.\nd. Compare against the spam list to decide \u201cspam\u201d or \u201clegit.\u201d\ne. Invoke updateSpamList({email: sender_email, domain: domain, Classification: classification }).\nf. Respond with the classification result and if the list has been updated successfully\n\nIf the user\u2019s input does not refer to classifying an email, do not call any tool; respond directly to the user\u2019s inquiry. Remind the user that this tool is most affective when the user refers to a message to classify. "
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "02168687-bbed-4b39-80de-423c2a2a77eb",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
540,
2400
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2237dfc1-ac37-43c8-9e9b-ca5658695b2a",
"name": "Get spam list",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
820,
2400
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "list"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1iOYH829GJ-ytTlmz0Zsl875Efn1qyrwuv6Rx83N1QJU",
"cachedResultUrl": "",
"cachedResultName": "Email spam list"
},
"descriptionType": "manual",
"toolDescription": "Get row(s) in sheet in email spam list Google Sheets. It contains a list of emails that are considered spam and legit."
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "b5f66a06-791d-414b-b75e-97eb08bb1a41",
"name": "Discord - reply1",
"type": "n8n-nodes-base.discord",
"position": [
900,
2160
],
"parameters": {
"embeds": {
"values": [
{
"color": "#FFD900",
"author": "Email Feedback Bot",
"description": "={{ $json.output }}"
}
]
},
"content": "=",
"guildId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Webhook').item.json.body.guild.id }}"
},
"options": {},
"resource": "message",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Webhook').item.json.body.channel.id }}"
},
"authentication": "oAuth2"
},
"credentials": {
"discordOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "46628abc-5662-4ae5-b63a-115c36474722",
"name": "Get a message in Discord",
"type": "n8n-nodes-base.discordTool",
"position": [
700,
2400
],
"parameters": {
"guildId": {
"__rl": true,
"mode": "id",
"value": "={{ $fromAI('guildId', 'guildId of the discord reference message') }}"
},
"options": {},
"resource": "message",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $fromAI('channelId', 'channelId of the discord reference message') }}"
},
"messageId": "={{ $fromAI('messageId', 'messageId of the discord reference message') }}",
"operation": "get",
"authentication": "oAuth2"
},
"credentials": {
"discordOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "02cd39ce-397b-4793-a0f8-2987c19fbe3b",
"name": "update spam list",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
960,
2400
],
"parameters": {
"columns": {
"value": {
"email": "={{ $fromAI('sender_email', 'email of the sender that wants to be labelled') }}",
"domain": "={{ $fromAI('domain', 'domain name of the sender that wants to be labelled') }}",
"labelled_by": "n8n",
"labelled_date": "={{ $now.format('dd/MM/yyyy') }}",
"Classification": "={{ $fromAI('classification', 'classigfication of the email whether spam or legit') }}"
},
"schema": [
{
"id": "domain",
"type": "string",
"display": true,
"required": false,
"displayName": "domain",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Classification",
"type": "string",
"display": true,
"required": false,
"displayName": "Classification",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "labelled_by",
"type": "string",
"display": true,
"required": false,
"displayName": "labelled_by",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "labelled_date",
"type": "string",
"display": true,
"required": false,
"displayName": "labelled_date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "list"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1iOYH829GJ-ytTlmz0Zsl875Efn1qyrwuv6Rx83N1QJU",
"cachedResultUrl": "",
"cachedResultName": "Email spam list"
},
"descriptionType": "manual",
"toolDescription": "Update row(s) in sheet in email spam list Google Sheets. It can update or add a row of email, domain of the sender that is considered spam and legit."
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "0e411d2f-bf11-45cb-bc33-3710e60ce266",
"name": "AI Agent2",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
600,
1600
],
"parameters": {
"text": "=sender_email: {{ $json.from.text }}\nrecipient_email: {{ $json.to.text }}\nSubject: {{ $('Merge4').item.json.subject }}\nGmail labels: {{ $json.labelIds }}\nContent: {{ $('Merge4').item.json.text }}",
"options": {
"systemMessage": "You are an AI agent in an n8n workflow. You receive raw email objects with the following fields: \n\u2013 `sender_email` \n\u2013 `recipient_email` \n\u2013 `subject` \n\u2013 `content` (plain text) \n\u2013 `labels` (Gmail labels) \n\u2013 Optional: `image_url` (URL to image in email), `action_url` (main link to external content)\n\nYou also have access to a tool called `getSpamList()` which returns a list of sender emails and domains previously labeled as spam or legit.\n\n**Instructions:**\n\n1. **Classify as \u201cSpam\u201d** if any of the following are true: \n \u2013 The sender_email or its domain matches common spam sources (e.g., \"no-reply@\", \"offers@\", mass mailers, suspicious domains). \n \u2013 The content contains characteristics of spam: promotional offers, phishing attempts, irrelevant ads, mass marketing, or unsolicited content not relevant to the user or organization. \n \u2013 The sender_email or domain appears in the retrieved spam list.\n\n If spam, return only:\n ```json\n {\n \"priority\": \"Spam\"\n }\nEnd execution.\n\nIf not spam, determine priority:\n\u2013 High: Time-sensitive emails from clients, leadership, legal, finance, or regarding contracts, deadlines, critical system issues, urgent decisions, or high-value opportunities.\n\u2013 Medium: Informative updates, meeting invites, team announcements, project updates, customer support, or internal collaboration threads that are useful but not urgent.\n\u2013 Low: Casual internal communication, newsletters, generic notifications, non-urgent follow-ups, or general FYI content.\n\nSummarize the email within 250 characters, include all key important information and numbers.\n\nPriority color mapping:\n\u2013 High: #00FF00\n\u2013 Medium: #0000FF\n\u2013 Low: #FF00000\n\nAlso include the image_url in the output if you find any relevant or important image url in the content. also include the action_url if you find any important url for the user to click"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2
},
{
"id": "bbae2069-47d3-4f55-a114-a4a9207759ad",
"name": "OpenAI Chat Model3",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
580,
1800
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "cbd46799-3228-4fb2-bdec-05419716c0c8",
"name": "Get spam list1",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
700,
1820
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "list"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1iOYH829GJ-ytTlmz0Zsl875Efn1qyrwuv6Rx83N1QJU",
"cachedResultUrl": "",
"cachedResultName": "Email spam list"
},
"descriptionType": "manual",
"toolDescription": "Get row(s) in sheet in email spam list Google Sheets. It contains a list of emails that are considered spam and legit."
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "e82f45cd-2c46-48c9-abfe-5c10910035ee",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
280,
2080
],
"parameters": {
"color": 7,
"width": 1060,
"height": 500,
"content": "## Update spam list"
},
"typeVersion": 1
},
{
"id": "ffe9fa99-a06a-4933-b05d-1fb3405c6966",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
280,
1480
],
"parameters": {
"color": 7,
"width": 1060,
"height": 580,
"content": "## Filter incoming message\n### Send important emails only"
},
"typeVersion": 1
},
{
"id": "88c45a39-408c-4afa-ac18-841139f12247",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
820,
1820
],
"parameters": {
"jsonSchemaExample": "{\n \"from\": \"user@example.com\",\n \"to\": \"user@example.com\",\n \"subject\": \"Urgent: Contract Finalization by Tomorrow\",\n \"summary\": \"The CEO is requesting immediate action to finalize and sign the strategic partnership contract before tomorrow's deadline.\",\n \"priority\": \"High\",\n \"priority_color\": 16711680,\n \"image_url\" : \"\",\n \"action_url\" : \"\"\n}\n"
},
"typeVersion": 1.3
},
{
"id": "fd357e53-3a9e-4ade-8e5a-86f400f32e3a",
"name": "Send a message",
"type": "n8n-nodes-base.discord",
"position": [
1160,
1580
],
"parameters": {
"embeds": {
"values": [
{
"url": "={{ $json.output.action_url }}",
"color": "={{ $json.output.priority_color }}",
"image": "={{ $json.output.image_url }}",
"title": "={{ $json.output.subject }}",
"author": "={{ $json.output.from }}",
"description": "={{ $json.output.summary }}"
}
]
},
"guildId": {
"__rl": true,
"mode": "list",
"value": "1363069056558825554"
},
"options": {},
"resource": "message",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Merge4').item.json.discord_channel }}"
},
"authentication": "oAuth2"
},
"credentials": {
"discordOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "24d1119c-7982-4e88-a75a-f85b67ba0c6d",
"name": "If2",
"type": "n8n-nodes-base.if",
"position": [
900,
1600
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d8cf81aa-1b7c-4a54-87f0-2f86655c5875",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{$json.output}}",
"rightValue": "Spam"
},
{
"id": "81703823-b378-4831-ace1-5242d45e7c41",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{$json.output.priority}}",
"rightValue": "Spam"
}
]
}
},
"typeVersion": 2.2
}
],
"connections": {
"If2": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Merge4": {
"main": [
[
{
"node": "AI Agent2",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
},
"medium4": {
"main": [
[
{
"node": "Merge4",
"type": "main",
"index": 0
}
]
]
},
"medium5": {
"main": [
[
{
"node": "Merge4",
"type": "main",
"index": 0
}
]
]
},
"medium6": {
"main": [
[
{
"node": "Merge4",
"type": "main",
"index": 0
}
]
]
},
"medium7": {
"main": [
[
{
"node": "Merge4",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Discord - reply1",
"type": "main",
"index": 0
}
]
]
},
"AI Agent2": {
"main": [
[
{
"node": "If2",
"type": "main",
"index": 0
}
]
]
},
"Get spam list": {
"ai_tool": [
[
{
"node": "AI Agent1",
"type": "ai_tool",
"index": 0
}
]
]
},
"Gmail Trigger": {
"main": [
[
{
"node": "medium7",
"type": "main",
"index": 0
},
{
"node": "Merge4",
"type": "main",
"index": 1
}
]
]
},
"Get spam list1": {
"ai_tool": [
[
{
"node": "AI Agent2",
"type": "ai_tool",
"index": 0
}
]
]
},
"Gmail Trigger1": {
"main": [
[
{
"node": "medium6",
"type": "main",
"index": 0
},
{
"node": "Merge4",
"type": "main",
"index": 1
}
]
]
},
"Gmail Trigger2": {
"main": [
[
{
"node": "medium5",
"type": "main",
"index": 0
},
{
"node": "Merge4",
"type": "main",
"index": 1
}
]
]
},
"Gmail Trigger3": {
"main": [
[
{
"node": "medium4",
"type": "main",
"index": 0
},
{
"node": "Merge4",
"type": "main",
"index": 1
}
]
]
},
"update spam list": {
"ai_tool": [
[
{
"node": "AI Agent1",
"type": "ai_tool",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model3": {
"ai_languageModel": [
[
{
"node": "AI Agent2",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Get a message in Discord": {
"ai_tool": [
[
{
"node": "AI Agent1",
"type": "ai_tool",
"index": 0
}
]
]
},
"Structured Output Parser1": {
"ai_outputParser": [
[
{
"node": "AI Agent2",
"type": "ai_outputParser",
"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.
discordOAuth2ApigmailOAuth2googleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automate Email Classification, Prioritization, and Spam Detection Across Multiple Accounts
Source: https://n8n.io/workflows/5789/ — 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.
This workflow is perfect for creators, solopreneurs, and personal brands who want to consistently publish bold, high-performing content on X (Twitter) — without writing a single line themselves. After
Automate how you reply to Reddit posts using AI-generated, first-person comments that sound human, follow subreddit rules, and (optionally) promote your own links or products.
Streamline your HR recruitment process with this intelligent automation that reads candidate emails and resumes, analyzes them using GPT-4, and automatically shortlists or rejects applicants based on
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
Automate your personal productivity with this intelligent n8n workflow that integrates Telegram, Google Sheets, and OpenAI (GPT-4o). This system uses multiple AI agents to manage work hours, tasks, fi