This workflow corresponds to n8n.io template #5678 — we link there as the canonical source.
This workflow follows the Agent → Gmail Trigger 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 →
{
"nodes": [
{
"id": "39b2d4bd-b29b-4e52-864e-0090e8f8e56f",
"name": "Test Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1360,
1460
],
"parameters": {
"color": 6,
"width": 300,
"height": 220,
"content": "## \ud83e\uddea TEST BEFORE DEPLOYING\n1. Send test email\n2. Check Sheets output\n3. Verify summary quality\n4. Adjust filters/prompt as needed"
},
"typeVersion": 1
},
{
"id": "75cc1f51-da2d-411a-bd64-7c574c5d5d11",
"name": "Log to Google Sheets1",
"type": "n8n-nodes-base.googleSheets",
"position": [
980,
1560
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $('info1').item.json.Date }}",
"summary": "={{ $json.output }}",
"subject ": "={{ $('info1').item.json.Subject }}",
"sender name": "={{ $('info1').item.json[\"Sender Name\"] }}",
"sender email": "={{ $('info1').item.json[\"Sender Email\"] }}"
},
"schema": [
{
"id": "sender name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "sender name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sender email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "sender email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "subject ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "subject ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "summary",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"sender name"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "YOUR_GOOGLE_SHEETS_URL",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID"
}
},
"typeVersion": 4
},
{
"id": "b5d3d06e-116f-4c40-bbd0-c22cd622af96",
"name": "AI Agent1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
400,
1500
],
"parameters": {
"text": "=Please read this email \"{{ $json.Content }}\" and provide a very short, concise summary containing only the most important information. Keep the summary as brief as possible without losing essential details. ",
"options": {},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "a69f2251-947b-444c-b314-d510870b6583",
"name": "Gmail Trigger",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-600,
1600
],
"parameters": {
"simple": false,
"filters": {
"labelIds": [
"CATEGORY_PERSONAL"
]
},
"options": {
"downloadAttachments": false
},
"pollTimes": {
"item": [
{
"mode": "=everyHour",
"minute": 59
}
]
}
},
"typeVersion": 1
},
{
"id": "a7024314-9303-42f3-a854-dcb385c991f7",
"name": "Check Valid Email",
"type": "n8n-nodes-base.if",
"position": [
60,
1600
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c1d2e3f4-g5h6-i7j8-k9l0-m1n2o3p4q5r6",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"Sender Name\"] }}",
"rightValue": "YOUR_SENDER_NAME_FILTER"
}
]
}
},
"typeVersion": 2
},
{
"id": "eab995bb-43bf-4c23-9cc1-41b80a9deb0a",
"name": "Groq Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
260,
2000
],
"parameters": {
"model": "llama-3.1-8b-instant",
"options": {}
},
"typeVersion": 1
},
{
"id": "d408d58f-c818-4601-8109-f90bb152e381",
"name": "info1",
"type": "n8n-nodes-base.code",
"position": [
-260,
1600
],
"parameters": {
"jsCode": "const items = [];\n\nfor (const item of $input.all()) {\n const emailData = item.json;\n \n // Handle sender information (unchanged)\n let senderEmail = '';\n let senderName = '';\n\n if (emailData.from?.value?.[0]) {\n senderEmail = emailData.from.value[0].address || '';\n senderName = emailData.from.value[0].name || senderEmail;\n } else if (emailData.from?.text) {\n const emailMatch = emailData.from.text.match(/<([^>]+)>/) || \n emailData.from.text.match(/([^\\s]+@[^\\s]+)/);\n senderEmail = emailMatch ? emailMatch[1] : emailData.from.text;\n \n const nameMatch = emailData.from.text.match(/^([^<]+)/);\n senderName = nameMatch ? nameMatch[1].trim().replace(/\\\"/g, '') : senderEmail;\n }\n\n // Format date (unchanged)\n const receivedDate = new Date(emailData.date || emailData.receivedTime);\n const formattedDate = receivedDate.toLocaleString('en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n\n // FIXED CONTENT EXTRACTION\n let emailContent = '';\n \n // 1. First priority: Plain text version\n if (emailData.text) {\n emailContent = emailData.text;\n } \n // 2. Second priority: HTML version (convert to plain text)\n else if (emailData.html) {\n emailContent = emailData.html\n .replace(/<style[^>]*>.*?<\\/style>/gs, '') // Remove CSS\n .replace(/<[^>]*>/g, ' ') // Strip HTML tags\n .replace(/\\s+/g, ' ') // Collapse whitespace\n .trim();\n }\n // 3. Fallback to other possible fields\n else if (emailData.body || emailData.textPlain || emailData.textHtml) {\n emailContent = emailData.body || emailData.textPlain || emailData.textHtml;\n }\n\n // Truncate content if too long\n const maxContentLength = 5000;\n if (emailContent.length > maxContentLength) {\n emailContent = emailContent.substring(0, maxContentLength) + '... [truncated]';\n }\n\n // Create row data\n const rowData = {\n 'Date': formattedDate,\n 'Sender Name': senderName,\n 'Sender Email': senderEmail,\n 'Subject': emailData.subject || 'No Subject',\n 'Content': emailContent,\n //'Message ID': emailData.messageId || '',\n 'Has Attachments': emailData.attachments?.length > 0 ? 'Yes' : 'No'\n };\n \n items.push({ json: rowData });\n}\n\nreturn items;"
},
"typeVersion": 2
},
{
"id": "2bb19466-2a13-48d1-8f9c-be3db440c061",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-680,
1380
],
"parameters": {
"color": 5,
"width": 260,
"height": 400,
"content": "## \ud83d\udd11 Step 1: Add Gmail Credentials \ud83d\udc47"
},
"typeVersion": 1
},
{
"id": "5fef7b17-cca7-4f06-99c0-efe6944b6a48",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-340,
1380
],
"parameters": {
"color": 5,
"width": 260,
"height": 400,
"content": "## \ud83d\udce7 Step 2: Email Processing Node\n"
},
"typeVersion": 1
},
{
"id": "bf269863-ccaa-4a22-aff2-a98305d8c354",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-20,
1380
],
"parameters": {
"color": 5,
"width": 260,
"height": 400,
"content": "## \u2699\ufe0f Step 3: Sender Filter\n\u2022 Replace 'YOUR_SENDER_NAME_FILTER'\n\u2022 Only emails from this sender will proceed\n\u2022 Supports multiple conditions"
},
"typeVersion": 1
},
{
"id": "2ea54fa1-fd79-48ca-854c-14b706cf3315",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
360,
1360
],
"parameters": {
"color": 5,
"width": 360,
"height": 420,
"content": "## \u270d\ufe0f Step 4: Customize AI Prompt\n\u2022 Default: Short email summary\n\u2022 Change tone/formality as needed"
},
"typeVersion": 1
},
{
"id": "92c18c6f-3c83-41e0-8757-67455aff44da",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
-40,
1900
],
"parameters": {
"color": 5,
"width": 260,
"height": 220,
"content": "## \ud83e\udd16 Step 5: AI Configuration\n1. Add Groq API key\n2. Or replace with other AI model\n"
},
"typeVersion": 1
},
{
"id": "56894a8f-5340-43a3-a852-7d4dadbdd376",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
800,
1380
],
"parameters": {
"color": 4,
"width": 500,
"height": 400,
"content": "## \ud83d\udcca Step 6: Google Sheets Setup\n1. Add Google credentials\n2. Paste Sheet URL\n3. Select target sheet\n4. Columns auto-map to email data"
},
"typeVersion": 1
},
{
"id": "bb07639e-3edb-4be1-8554-cd6df8ebb22c",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
1840
],
"parameters": {
"color": 4,
"width": 700,
"height": 420,
"content": "## \u2705 Expected Output Format\nColumns: Sender | Date | Email | Subject | Summary\n\n"
},
"typeVersion": 1
}
],
"connections": {
"info1": {
"main": [
[
{
"node": "Check Valid Email",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Log to Google Sheets1",
"type": "main",
"index": 0
}
]
]
},
"Gmail Trigger": {
"main": [
[
{
"node": "info1",
"type": "main",
"index": 0
}
]
]
},
"Groq Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Check Valid Email": {
"main": [
[
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically processes incoming emails (you can filter them base on your needs) and creates concise AI-powered summaries, then logs them to a Google Sheets spreadsheet for easy tracking and analysis.
Source: https://n8n.io/workflows/5678/ — 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 automatically organizes your Gmail inbox using AI. It reads every incoming email, classifies it into Work, Personal, Financial or Newsletter, applies the correct Gmail label, logs the em
This workflow monitors incoming Gmail messages for refund requests and uses AI to extract the order ID and reason. It then retrieves order details from Shopify to evaluate refund eligibility. Based on
hashtag. Uses gmailTrigger, googleSheets, gmail, agent. Event-driven trigger; 8 nodes.
BoomerBobBot.TP. Uses agent, telegramTrigger, telegram, memoryBufferWindow. Event-driven trigger; 95 nodes.
ITfest. Uses telegramTrigger, telegram, textClassifier, agent. Event-driven trigger; 70 nodes.