This workflow corresponds to n8n.io template #16496 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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 →
{
"id": "HTEd6SWWUkbtWb3S",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Slack EOD Tracker & AI Executive Summary",
"tags": [],
"nodes": [
{
"id": "dd9b798f-af84-4fa6-bd0a-1d2ae15e8e83",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
2688,
-112
],
"parameters": {
"width": 480,
"height": 896,
"content": "## Slack EOD Tracker & AI Executive Summary\n\n### How it works\n\n1. The workflow handles live Slack status submissions by parsing incoming webhooks and updating Google Sheets.\n2. Scheduled triggers aggregate daily submission data from the sheet.\n3. An AI agent analyzes the prepared data to generate a summary report.\n4. The finalized report is posted automatically to the designated Slack channel.\n\n### Setup steps\n\n- - [ ] Configure Slack credentials for the webhook, buttons, and notifications.\n- - [ ] Connect Google Sheets accounts for tracking submissions and user data.\n- - [ ] Set up a Google Gemini API key within the AI Agent node.\n- - [ ] Configure the Webhook trigger URL in your Slack App configuration.\n\n### Customization\n\nYou can adjust the frequency of the reporting trigger in the workflow settings or modify the AI prompt to change the summary report style."
},
"typeVersion": 1
},
{
"id": "7fbab7cf-c71f-4bd2-a9ce-5b9199729a99",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
3232,
-128
],
"parameters": {
"color": 7,
"width": 864,
"height": 272,
"content": "## Process scheduled EOD check\n\nHandles scheduled EOD checks and status filtering for employees."
},
"typeVersion": 1
},
{
"id": "0d7a91d4-ed9b-4630-a9aa-9b39e7dcf6bb",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
3248,
256
],
"parameters": {
"color": 7,
"width": 640,
"height": 272,
"content": "## Handle Slack webhook payload\n\nParses incoming Slack webhook data and updates the interaction block."
},
"typeVersion": 1
},
{
"id": "3d5eb5c8-1cb9-437a-a291-db83951e63d1",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
4368,
208
],
"parameters": {
"color": 7,
"height": 352,
"content": "## Conditional Slack status processing\n\nProcesses Slack submissions and alerts for missing updates."
},
"typeVersion": 1
},
{
"id": "25f476cf-f9e6-4ec8-a0c2-664afa939dbe",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
4352,
-96
],
"parameters": {
"color": 7,
"width": 640,
"height": 272,
"content": "## Manage sheet submissions and duplicates\n\nValidates and saves new submission data to Google Sheets."
},
"typeVersion": 1
},
{
"id": "737aa01b-dc50-4c59-bdae-14a5e8de6be0",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
3248,
656
],
"parameters": {
"color": 7,
"height": 320,
"content": "## Daily reporting trigger\n\nTriggers the data gathering process for daily reports."
},
"typeVersion": 1
},
{
"id": "d95f99e9-c1ac-4718-b66c-7f77b130649d",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
3520,
608
],
"parameters": {
"color": 7,
"width": 640,
"height": 464,
"content": "## Fetch and prepare submission data\n\nFetches and formats employee daily submission data."
},
"typeVersion": 1
},
{
"id": "c74629ab-dd9c-4fbf-bc20-7731c53b0747",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
4192,
688
],
"parameters": {
"color": 7,
"width": 416,
"height": 304,
"content": "## Aggregate and enrich report data\n\nAggregates prepared data and retrieves additional context."
},
"typeVersion": 1
},
{
"id": "70f7d101-34f1-4d04-8f07-b69f2003f189",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
4640,
704
],
"parameters": {
"color": 7,
"width": 768,
"height": 480,
"content": "## AI report generation and delivery\n\nProcesses aggregated data via AI and shares the report."
},
"typeVersion": 1
},
{
"id": "e35a373e-7649-4e8a-80b3-554d381b2616",
"name": "At 3pm Daily Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
3280,
-16
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 15
}
]
}
},
"typeVersion": 1.3
},
{
"id": "0a3e24d0-05c5-4aa1-97ed-7e1f5a12638f",
"name": "Send EOD Prompt to Slack",
"type": "n8n-nodes-base.slack",
"position": [
3952,
-32
],
"parameters": {
"text": "EOD Update Required",
"user": {
"__rl": true,
"mode": "id",
"value": "={{ $json.slack_id }}"
},
"select": "user",
"blocksUi": "={\n\t\"blocks\": [\n\t\t{\n\t\t\t\"type\": \"header\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"\ud83d\udcca Daily EOD Update[{{ $now.toFormat('dd LLL yyyy') }}]\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"input\",\n\t\t\t\"block_id\": \"eod_accomplishments_block\",\n\t\t\t\"element\": {\n\t\t\t\t\"type\": \"plain_text_input\",\n\t\t\t\t\"action_id\": \"accomplishments_input\",\n\t\t\t\t\"placeholder\": {\n\t\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\t\"text\": \"E.g., Finished the new landing page design...\"\n\t\t\t\t},\n\t\t\t\t\"multiline\": true\n\t\t\t},\n\t\t\t\"label\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"What did you accomplish today?\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"input\",\n\t\t\t\"block_id\": \"eod_tomorrow_block\",\n\t\t\t\"element\": {\n\t\t\t\t\"type\": \"plain_text_input\",\n\t\t\t\t\"action_id\": \"tomorrow_input\",\n\t\t\t\t\"placeholder\": {\n\t\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\t\"text\": \"E.g., Review PRs and prep for client meeting...\"\n\t\t\t\t},\n\t\t\t\t\"multiline\": true\n\t\t\t},\n\t\t\t\"label\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"What is the plan for tomorrow?\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"input\",\n\t\t\t\"block_id\": \"eod_blockers_block\",\n\t\t\t\"optional\": true,\n\t\t\t\"element\": {\n\t\t\t\t\"type\": \"plain_text_input\",\n\t\t\t\t\"action_id\": \"blockers_input\",\n\t\t\t\t\"placeholder\": {\n\t\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\t\"text\": \"E.g., Waiting on marketing assets...\"\n\t\t\t\t},\n\t\t\t\t\"multiline\": true\n\t\t\t},\n\t\t\t\"label\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"Any Blockers? (Optional)\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"actions\",\n\t\t\t\"block_id\": \"eod_submit_actions\",\n\t\t\t\"elements\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"button\",\n\t\t\t\t\t\"text\": {\n\t\t\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\t\t\"text\": \"Submit EOD\",\n\t\t\t\t\t\t\"emoji\": true\n\t\t\t\t\t},\n\t\t\t\t\t\"style\": \"primary\",\n\t\t\t\t\t\"action_id\": \"submit_eod_button\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}",
"messageType": "block",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.5
},
{
"id": "27a99635-8770-46b4-a0d0-d3efed4ac3c5",
"name": "When Slack Action Received",
"type": "n8n-nodes-base.webhook",
"position": [
3296,
368
],
"parameters": {
"path": "abf57129-a724-4279-bf3f-e590a899bfcc",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "4b569893-528f-435c-ac97-6ec515c336fc",
"name": "Parse Slack Payload",
"type": "n8n-nodes-base.code",
"position": [
3520,
368
],
"parameters": {
"jsCode": "// 1. Parse the stringified Slack payload\nconst payload = JSON.parse($input.first().json.body.payload);\n\n// 2. Isolate the nested form values\nconst formValues = payload.state.values;\n\n// 3. Extract the EOD Date from the Header Block\n// Safely find the block with the type 'header'\nconst headerBlock = payload.message?.blocks?.find(block => block.type === 'header');\nconst headerText = headerBlock ? headerBlock.text.text : \"\";\n\n// Use regex to match the text inside the square brackets: [18 Jun 2026]\nconst dateMatch = headerText.match(/\\[(.*?)\\]/);\nconst eod_date = dateMatch ? dateMatch[1] : \"Unknown Date\";\n\n// 4. Extract and flatten the specific data points\nconst cleanedData = {\n user_id: payload.user?.id,\n username: payload.user?.username,\n form_date: eod_date, // <-- Here is your extracted date!\n today_accomplishments: formValues.eod_accomplishments_block?.accomplishments_input?.value || \"\",\n tomorrow_plan: formValues.eod_tomorrow_block?.tomorrow_input?.value || \"\",\n blockers: formValues.eod_blockers_block?.blockers_input?.value || \"None\",\n response_url: payload.response_url,\n channel_id: payload.channel?.id,\n submission_time: new Date().toISOString()\n};\n\n// 5. Return in n8n's expected format\nreturn { json: cleanedData };"
},
"typeVersion": 2
},
{
"id": "1a98b390-0515-4721-a2bd-1c2b95aa5f39",
"name": "Confirm Slack Action Received",
"type": "n8n-nodes-base.httpRequest",
"position": [
3744,
368
],
"parameters": {
"url": "={{ $json.response_url }}",
"method": "POST",
"options": {},
"jsonBody": "{\n \"replace_original\": true,\n \"blocks\": [\n {\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"\u2705 *EOD Update Submitted Successfully!* Great work today.\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.4
},
{
"id": "16129832-ddfb-4db3-af43-e19611e51452",
"name": "If Action Confirmed",
"type": "n8n-nodes-base.if",
"position": [
3968,
368
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "db0f1956-ba00-468e-bc2f-4b00d39ad443",
"operator": {
"type": "dateTime",
"operation": "equals"
},
"leftValue": "={{ DateTime.fromFormat($('Parse Slack Payload').item.json.form_date, 'dd LLL yyyy').toFormat('dd-MMMM-yyyy') }}",
"rightValue": "={{ $now.toFormat('dd-LLL-yyyy') }}"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "180db903-beec-4ca8-aaf5-351fcbef4467",
"name": "Fetch Manager Details",
"type": "n8n-nodes-base.googleSheets",
"position": [
3504,
-16
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17ctektyvT1XHA1ng0DiFIe74Gvys4zHKJk5WjJtDtes/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "17ctektyvT1XHA1ng0DiFIe74Gvys4zHKJk5WjJtDtes",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17ctektyvT1XHA1ng0DiFIe74Gvys4zHKJk5WjJtDtes/edit?usp=drivesdk",
"cachedResultName": "team_member_details"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "d7924dc3-9dc9-420a-91e7-8a18b3dde96a",
"name": "Check If Person Is On Leave",
"type": "n8n-nodes-base.if",
"position": [
3728,
-16
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9780cd31-a7aa-483e-af55-6ec2c364173f",
"operator": {
"type": "boolean",
"operation": "false",
"singleValue": true
},
"leftValue": "={{ $json[\"today_on_leave?\"] }}",
"rightValue": false
}
]
}
},
"typeVersion": 2.3
},
{
"id": "81f18365-8025-4cc1-bcde-a6cb55ccd5a3",
"name": "Save EOD Submission to Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
4848,
16
],
"parameters": {
"columns": {
"value": {
"user_id": "={{ $('Parse Slack Payload').item.json.user_id }}",
"blockers": "={{ $('Parse Slack Payload').item.json.blockers }}",
"username": "={{ $('Parse Slack Payload').item.json.username }}",
"form_date": "={{ $('Parse Slack Payload').item.json.form_date }}",
"channel_id": "={{ $('Parse Slack Payload').item.json.channel_id }}",
"response_url": "={{ $('Parse Slack Payload').item.json.response_url }}",
"submission_id": "={{ 's' + $now.valueOf() + Math.random().toString(36).substring(2, 6) }}",
"tomorrow_plan": "={{ $('Parse Slack Payload').item.json.tomorrow_plan }}",
"submission_time": "={{ $('Parse Slack Payload').item.json.submission_time }}",
"today_accomplishments": "={{ $('Parse Slack Payload').item.json.today_accomplishments }}"
},
"schema": [
{
"id": "submission_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "submission_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "user_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "user_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "username",
"type": "string",
"display": true,
"required": false,
"displayName": "username",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "form_date",
"type": "string",
"display": true,
"required": false,
"displayName": "form_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "today_accomplishments",
"type": "string",
"display": true,
"required": false,
"displayName": "today_accomplishments",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "tomorrow_plan",
"type": "string",
"display": true,
"required": false,
"displayName": "tomorrow_plan",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "blockers",
"type": "string",
"display": true,
"required": false,
"displayName": "blockers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "response_url",
"type": "string",
"display": true,
"required": false,
"displayName": "response_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "channel_id",
"type": "string",
"display": true,
"required": false,
"displayName": "channel_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "submission_time",
"type": "string",
"display": true,
"required": false,
"displayName": "submission_time",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"submission_id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA/edit?usp=drivesdk",
"cachedResultName": "EOD_Form_Submissions"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "a93517ec-4155-441c-add6-d85da5e12621",
"name": "Fetch Todays Submissions",
"type": "n8n-nodes-base.googleSheets",
"position": [
4400,
16
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
},
"documentId": {
"__rl": true,
"mode": "id",
"value": ""
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7,
"alwaysOutputData": true
},
{
"id": "cc221369-c8da-41d5-b3ba-37a76cf9b369",
"name": "Deduplicate Submissions",
"type": "n8n-nodes-base.code",
"position": [
4624,
16
],
"parameters": {
"jsCode": "// 1. Get the newly submitted Slack data (from your first parsed Code node)\nconst newSubmissionItem = $('Parse Slack Payload').first();\n\n// Failsafe: If for some reason there is no new submission, stop here.\nif (!newSubmissionItem || !newSubmissionItem.json) {\n return []; \n}\n\nconst newSubmission = newSubmissionItem.json;\n\n// 2. Get the existing records fetched from the Google Sheet\n// If the sheet is completely empty, $input.all() might be empty, which is fine.\nconst existingRecords = $input.all() || [];\n\n// 3. Check if this exact user_id AND form_date already exist in the sheet\nconst isDuplicate = existingRecords.some(row => {\n const existingJson = row.json;\n \n // Ignore completely empty rows in the Google Sheet\n if (!existingJson || Object.keys(existingJson).length === 0) {\n return false;\n }\n\n return existingJson.user_id === newSubmission.user_id && \n existingJson.form_date === newSubmission.form_date;\n});\n\n// 4. Routing Logic\nif (isDuplicate) {\n // A match was found. The user already submitted for today.\n // Returning an empty array stops the workflow right here.\n return [];\n}\n\n// No match was found! Pass the NEW submission data forward \n// so the next Google Sheets node can append it.\nreturn [{ json: newSubmission }];"
},
"typeVersion": 2
},
{
"id": "3a180ffa-bfc0-40fe-8df1-f5ede55b03be",
"name": "Send Late Notification to Owner",
"type": "n8n-nodes-base.slack",
"position": [
4416,
400
],
"parameters": {
"text": "=Hey sir,\n{{ $('Parse Slack Payload').item.json.username }} submitted a bit late and the work that was submitted now \"{{ $('Parse Slack Payload').item.json.form_date }}\"\n\nThat Day Accomplishments:{{ $('Parse Slack Payload').item.json.today_accomplishments }}\nNext day plan:{{ $('Parse Slack Payload').item.json.tomorrow_plan }}\nBlockers:{{ $('Parse Slack Payload').item.json.blockers }}",
"user": {
"__rl": true,
"mode": "id",
"value": "enter-your-manager-or-founder-slack-id-here"
},
"select": "user",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.5
},
{
"id": "a5844157-2a2a-4f4c-8d06-fd7bf1435610",
"name": "At 5pm Daily Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
3296,
816
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 17
}
]
}
},
"typeVersion": 1.3
},
{
"id": "baf75f15-7be5-4942-86f9-3da14d64b4db",
"name": "Read Today Submissions",
"type": "n8n-nodes-base.googleSheets",
"position": [
3792,
720
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $now.toFormat('dd LLL yyyy') }}",
"lookupColumn": "form_date"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA/edit?usp=drivesdk",
"cachedResultName": "EOD_Form_Submissions"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "d7969546-dabc-470a-80cc-f50d08648194",
"name": "Read Submission Data to Edit",
"type": "n8n-nodes-base.googleSheets",
"position": [
3568,
912
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $now.minus({ days: 1 }).toFormat('dd LLL yyyy') }}",
"lookupColumn": "form_date"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Vk1we-X4ICX2HKIeEZFfnWTPCmiOrBM7HB016bElNgA/edit?usp=drivesdk",
"cachedResultName": "EOD_Form_Submissions"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7,
"alwaysOutputData": true
},
{
"id": "e8ece70f-50cf-41fc-a1bb-0721ac94a142",
"name": "Prepare Submission Fields",
"type": "n8n-nodes-base.set",
"position": [
3792,
912
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a330c574-861b-45cf-a6bb-b03a32723d27",
"name": "user_id",
"type": "string",
"value": "={{ $json.user_id }}"
},
{
"id": "8acc23ad-1e43-416b-b8c9-ba1bdcfad0f8",
"name": "Yesterday's Plans",
"type": "string",
"value": "={{ $json.tomorrow_plan }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "1074d295-840e-415c-bb68-a6e3eedb3a92",
"name": "Merge Submissions",
"type": "n8n-nodes-base.merge",
"position": [
4016,
816
],
"parameters": {
"mode": "combine",
"options": {},
"fieldsToMatchString": "user_id"
},
"typeVersion": 3.2
},
{
"id": "d6235c76-47dc-476f-aee0-b9f6e78cd782",
"name": "EOD Summary Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
4912,
816
],
"parameters": {
"text": "=You are an Executive Assistant providing a daily team EOD summary for the company CEO. Your goal is to be highly concise, clear, and highlight only the critical information. No fluff, no long-winded paragraphs.\n\nToday's Attendance Stats: \nTotal Team: {{ $json.total_managers }} | On Leave: {{ $json.managers_on_leave }} | Expected Submissions: {{ $json.expected_submissions_today }}\n\nActual EOD Submissions (JSON): \n{{ JSON.stringify($('Aggregate Submission Data').item.json.data) }}\n\nPlease generate a brief executive summary (maximum 3-4 bullet points) following these strict rules:\n\n1. Submission Status: State clearly if we have all expected reports (e.g., \"All expected reports received\" or \"Missing report from [User]\"). Mention if actual submissions exceed expected.\n2. Overall Progress: Provide one single, simple sentence summarizing the main tasks the team completed today. \n3. Exceptions & Blockers (Crucial): Explicitly name anyone who has a blocker OR whose accomplishments today did not match what they promised yesterday. Be specific but brief about the issue. If there are no blockers or missed targets, explicitly state \"No blockers or missed commitments.\"\n4. Tomorrow: One simple sentence summarizing the team's main focus for tomorrow.\n\nFormatting Rules (Strict): \nFormat the entire output using strictly Slack-compatible markdown. \n- Use single asterisks for *bolding* headers or names (do NOT use double asterisks).\n- Use standard bullet points (`\u2022`).\n- Keep the tone professional, executive, and extremely brief. Use simple terms and avoid technical jargon where possible.",
"options": {},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "d3ce187e-bd35-4bc7-8948-e6380a4a9afb",
"name": "Google Gemini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
4912,
1024
],
"parameters": {
"options": {},
"modelName": "models/gemini-3.1-flash-lite"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "9a9728f4-23fb-4a90-96d8-3dcf0fc212e1",
"name": "Aggregate Submission Data",
"type": "n8n-nodes-base.aggregate",
"position": [
4240,
816
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "cd9a641c-7412-479e-b77f-c0c63811cac2",
"name": "Format Data for AI Agent",
"type": "n8n-nodes-base.code",
"position": [
4688,
816
],
"parameters": {
"jsCode": "// Get all input items\nconst managers = $input.all().map(item => item.json);\n\n// Total managers\nconst totalManagers = managers.length;\n\n// Managers on leave\nconst managersOnLeave = managers.filter(\n manager => manager[\"today_on_leave?\"] === true\n).length;\n\n// Expected submissions today\n// Assuming everyone NOT on leave should submit\nconst expectedSubmissionsToday = totalManagers - managersOnLeave;\n\nreturn [\n {\n json: {\n total_managers: totalManagers,\n managers_on_leave: managersOnLeave,\n expected_submissions_today: expectedSubmissionsToday\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "c79417c9-b37b-4d2a-8b86-7219bf5fc862",
"name": "Post EOD Summary to Slack",
"type": "n8n-nodes-base.slack",
"position": [
5264,
816
],
"parameters": {
"text": "={{ $json.output }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "enter-your-manager-or-founder-slack-id-here"
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.5
},
{
"id": "940764df-f902-400d-ae17-fdde869fb2d4",
"name": "Fetch team members List",
"type": "n8n-nodes-base.googleSheets",
"position": [
4464,
816
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17ctektyvT1XHA1ng0DiFIe74Gvys4zHKJk5WjJtDtes/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "17ctektyvT1XHA1ng0DiFIe74Gvys4zHKJk5WjJtDtes",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17ctektyvT1XHA1ng0DiFIe74Gvys4zHKJk5WjJtDtes/edit?usp=drivesdk",
"cachedResultName": "team_member_details"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e88a6740-2ce8-4281-bd5a-434d10932633",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
3920,
176
],
"parameters": {
"color": 7,
"height": 352,
"content": "## Check submission is today's or not\n\nIt just check whether the user is submitting today's EOD form or not"
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"binaryMode": "separate",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "33fed0a1-8b96-4809-b5fe-2522a4677f88",
"nodeGroups": [],
"connections": {
"EOD Summary Agent": {
"main": [
[
{
"node": "Post EOD Summary to Slack",
"type": "main",
"index": 0
}
]
]
},
"Merge Submissions": {
"main": [
[
{
"node": "Aggregate Submission Data",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Model": {
"ai_languageModel": [
[
{
"node": "EOD Summary Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"If Action Confirmed": {
"main": [
[
{
"node": "Fetch Todays Submissions",
"type": "main",
"index": 0
}
],
[
{
"node": "Send Late Notification to Owner",
"type": "main",
"index": 0
}
]
]
},
"Parse Slack Payload": {
"main": [
[
{
"node": "Confirm Slack Action Received",
"type": "main",
"index": 0
}
]
]
},
"At 3pm Daily Trigger": {
"main": [
[
{
"node": "Fetch Manager Details",
"type": "main",
"index": 0
}
]
]
},
"At 5pm Daily Trigger": {
"main": [
[
{
"node": "Read Today Submissions",
"type": "main",
"index": 0
},
{
"node": "Read Submission Data to Edit",
"type": "main",
"index": 0
}
]
]
},
"Fetch Manager Details": {
"main": [
[
{
"node": "Check If Person Is On Leave",
"type": "main",
"index": 0
}
]
]
},
"Read Today Submissions": {
"main": [
[
{
"node": "Merge Submissions",
"type": "main",
"index": 0
}
]
]
},
"Deduplicate Submissions": {
"main": [
[
{
"node": "Save EOD Submission to Sheet",
"type": "main",
"index": 0
}
]
]
},
"Fetch team members List": {
"main": [
[
{
"node": "Format Data for AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Fetch Todays Submissions": {
"main": [
[
{
"node": "Deduplicate Submissions",
"type": "main",
"index": 0
}
]
]
},
"Format Data for AI Agent": {
"main": [
[
{
"node": "EOD Summary Agent",
"type": "main",
"index": 0
}
]
]
},
"Aggregate Submission Data": {
"main": [
[
{
"node": "Fetch team members List",
"type": "main",
"index": 0
}
]
]
},
"Prepare Submission Fields": {
"main": [
[
{
"node": "Merge Submissions",
"type": "main",
"index": 1
}
]
]
},
"When Slack Action Received": {
"main": [
[
{
"node": "Parse Slack Payload",
"type": "main",
"index": 0
}
]
]
},
"Check If Person Is On Leave": {
"main": [
[
{
"node": "Send EOD Prompt to Slack",
"type": "main",
"index": 0
}
]
]
},
"Read Submission Data to Edit": {
"main": [
[
{
"node": "Prepare Submission Fields",
"type": "main",
"index": 0
}
]
]
},
"Confirm Slack Action Received": {
"main": [
[
{
"node": "If Action Confirmed",
"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.
googleApigooglePalmApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow collects end-of-day updates from team members in Slack, stores them in Google Sheets, and posts a concise executive summary back to Slack using Google Gemini. Runs daily at 3pm, reads the team roster from Google Sheets, filters out people marked as on leave, and…
Source: https://n8n.io/workflows/16496/ — 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 the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet
Youtube Video: https://youtu.be/BOodBD6HWSU?si=yEenUFBdYOq_1RVj This workflow runs daily at 7AM to generate buyer-style prompts with Google Gemini, query Groq, OpenRouter, and a search-grounded Gemini
This workflow runs every Monday at 8AM to pull a competitor list from Google Sheets, scrape the latest Crunchbase data via Apify, detect new funding, generate a strategic impact summary with Google Ge
Created by: Peyton Leveillee Last updated: October 2025
The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe