AutomationFlowsAI & RAG › Gmail AI Summary to Google Sheets

Gmail AI Summary to Google Sheets

Original n8n title: Automate Email Filtering & AI Summarization. 100% Free & Effective, Works 7/24

ByARRE @arre on n8n.io

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.

Event trigger★★★★☆ complexityAI-powered14 nodesGoogle SheetsAgentGmail TriggerGroq Chat
AI & RAG Trigger: Event Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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![Example Table](https://cdn.ablebits.com/_img-blog/google-sheets-create-table/table-format.webp)"
      },
      "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
          }
        ]
      ]
    }
  }
}
Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

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

Gmail, Groq Chat, Agent +3
AI & RAG

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

Gmail Trigger, Groq Chat, Gmail +3
AI & RAG

hashtag. Uses gmailTrigger, googleSheets, gmail, agent. Event-driven trigger; 8 nodes.

Gmail Trigger, Google Sheets, Gmail +3
AI & RAG

BoomerBobBot.TP. Uses agent, telegramTrigger, telegram, memoryBufferWindow. Event-driven trigger; 95 nodes.

Agent, Telegram Trigger, Telegram +10
AI & RAG

ITfest. Uses telegramTrigger, telegram, textClassifier, agent. Event-driven trigger; 70 nodes.

Telegram Trigger, Telegram, Text Classifier +6