AutomationFlowsAI & RAG › Gmail Assistant with Full Gmail History RAG Using Openai

Gmail Assistant with Full Gmail History RAG Using Openai

ByZain Ali @zain104 on n8n.io

> Summary: > This workflow listens for new Gmail messages, extracts and cleans email content, generates embeddings via OpenAI, stores them in a Qdrant vector database, and then enables a Retrieval‑Augmented‑Generation (RAG) agent to answer user queries against those stored…

Event trigger★★★★☆ complexityAI-powered23 nodesOpenAI ChatAgentOpenAI EmbeddingsQdrant Vector StoreChat TriggerMemory Buffer WindowGmail TriggerGmail
AI & RAG Trigger: Event Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #6169 — we link there as the canonical source.

This workflow follows the Agent → Chat 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
{
  "id": "7QhxjMbqHv5tk9wM",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Email History RAG",
  "tags": [],
  "nodes": [
    {
      "id": "dec780ab-9e05-4305-ba52-8a92dfc266e7",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -7040,
        800
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "13f21017-5470-4e0e-8d13-aea6d98c4918",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -7440,
        448
      ],
      "parameters": {
        "width": 1162,
        "height": 796,
        "content": "# RAG AI Agent\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b6615316-94c0-4091-b6e3-8cdf64cb0902",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -6048,
        1472
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "349336cd-9373-4553-aa13-9cf6a427a0c6",
      "name": "RAG Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -6944,
        576
      ],
      "parameters": {
        "options": {
          "systemMessage": "=You are a helpful assistant that will get data from RAG and send a good response to user.\n\nToday date is this if user ask for dated or latest data: {{ $now }}\n\nSo add date when send query to vector database because I am already setting the date field in embedding."
        }
      },
      "typeVersion": 1.7
    },
    {
      "id": "16acb16b-8d56-425a-b484-fa4ffc3f5616",
      "name": "Embeddings OpenAI5",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        -5680,
        912
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "262344fa-8b26-4665-b0ff-e1354e6d84eb",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6128,
        448
      ],
      "parameters": {
        "color": 4,
        "width": 1200,
        "height": 788,
        "content": "# Watch Trigger (Email) - New Email\n## Get new Email -> Extract the text -> Add to Vector Store"
      },
      "typeVersion": 1
    },
    {
      "id": "69d042bf-b75a-414e-a2e2-a62632e6aef2",
      "name": "Embeddings OpenAI11",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        -5200,
        1712
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "cd126bb7-60a6-450b-b31c-cfd9517e9441",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6128,
        1328
      ],
      "parameters": {
        "width": 1596,
        "height": 740,
        "content": "# Get All Emails -> Store embedding in vector db\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d7481948-2972-42e9-b2ef-900c55bc6465",
      "name": "Qdrant Email Vector Store",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
      "position": [
        -6736,
        896
      ],
      "parameters": {
        "mode": "retrieve-as-tool",
        "options": {},
        "toolName": "emails_vector_search",
        "toolDescription": "=Call this tool to perform a vector embeddings search in my e-mail database. For time-specific queries:\n1. ALWAYS include the time frame in your query (e.g., \"interviews scheduled after April 27, 2025\" or \"interviews for next week April 28-May 4, 2025\")\n2. For future events, explicitly mention \"future\" or \"upcoming\" in your query",
        "qdrantCollection": {
          "__rl": true,
          "mode": "list",
          "value": "emails_history",
          "cachedResultName": "emails_history"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "8b9845c3-a9e6-47a1-ae0e-8e66a15b5812",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -7248,
        576
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "2c320869-b169-4961-a8fd-5403c7a1366e",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -6864,
        800
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "7cecd74a-bde6-4fcf-8622-81620c63b20f",
      "name": "Store Emails in Vector DB",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
      "position": [
        -5568,
        672
      ],
      "parameters": {
        "mode": "insert",
        "options": {},
        "qdrantCollection": {
          "__rl": true,
          "mode": "list",
          "value": "emails_history",
          "cachedResultName": "emails_history"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "82da160a-a572-4cdf-a260-f7a0c51a30fa",
      "name": "New Email",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -6064,
        672
      ],
      "parameters": {
        "filters": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "954a8ea4-9e00-43b9-9fe2-6d717b6dccd7",
      "name": "Get new Email Body",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -5840,
        672
      ],
      "parameters": {
        "simple": false,
        "options": {},
        "messageId": "={{ $json.id }}",
        "operation": "get"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "6735edda-91ff-4872-8c13-bec68a8af925",
      "name": "Get all emails",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -5824,
        1472
      ],
      "parameters": {
        "simple": false,
        "filters": {},
        "options": {},
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "f01ccf0e-caf4-44f1-a385-a6eb2b063551",
      "name": "Refactor Email Body data",
      "type": "n8n-nodes-base.code",
      "position": [
        -5616,
        1472
      ],
      "parameters": {
        "jsCode": "const emails = $input.all().map((item) => item.json);\n\nconst extractedData = emails.map((email) => {\n  // Remove line breaks and excessive spaces from body\n  const cleanBody = email.text\n    ?.replace(/(\\r\\n|\\n|\\r)/gm, ' ')  // Replace newlines with space\n    ?.replace(/\\s+/g, ' ')           // Collapse multiple spaces\n    ?.trim();                        // Remove leading/trailing space\n\n  return {\n    to: email.to?.value?.[0]?.address || '',\n    from: email.from?.value?.[0]?.address || '',\n    fromName: email.from?.value?.[0]?.name || '',\n    date: email.date || '',\n    subject: email.subject || '',\n    body: cleanBody || '',\n    emailId: email.id || '',\n  };\n});\n\nreturn extractedData;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "19fe59c6-6576-453a-8098-97e47c72c033",
      "name": "Loop over all emails",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -5344,
        1472
      ],
      "parameters": {
        "options": {},
        "batchSize": 50
      },
      "typeVersion": 3
    },
    {
      "id": "1e6d26d8-60e3-4128-82b4-a5e61d83cff1",
      "name": "Store Emails in Vector DB1",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
      "position": [
        -5024,
        1456
      ],
      "parameters": {
        "mode": "insert",
        "options": {},
        "qdrantCollection": {
          "__rl": true,
          "mode": "list",
          "value": "emails_history",
          "cachedResultName": "emails_history"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "5200b258-2c96-4d38-9c92-b5353ada6957",
      "name": "Set proper metadata",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        -5024,
        1696
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "created_at",
                "value": "={{ $json.date }}"
              },
              {
                "name": "data_source",
                "value": "gmail"
              }
            ]
          }
        },
        "jsonData": "=Email details:\nDate: {{ $json.date }}\n\nFrom Email: {{ $json.from }}\nFrom Name:  {{ $json.fromName }}\n\nTo Email: {{ $json.to }}\n\nEmail Subject:\n{{ $json.subject }}\n\nEmail body:\n{{ $json.body }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "512bb68a-94d7-4e0f-ab51-265f19d670bd",
      "name": "Split emails",
      "type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
      "position": [
        -4944,
        1888
      ],
      "parameters": {
        "separator": "Email details:"
      },
      "typeVersion": 1
    },
    {
      "id": "73a26bce-0df2-4755-8175-8a0e367f7418",
      "name": "Set proper metadata1",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        -5424,
        880
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "=data_source",
                "value": "=gmail"
              },
              {
                "name": "=created_at",
                "value": "={{ $json.date }}"
              }
            ]
          }
        },
        "jsonData": "=Email details:\nDate: {{ $json.headers.date }}\n\nFrom Email: {{ $json.from.value[0].address }}\nFrom Name:  {{ $json.from.value[0].name }}\n\nTo Email: {{ $json.to.value[0].address }}\n\nEmail Subject:\n{{ $json.subject }}\n\nEmail body:\n{{ $json.text }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "c70f74e1-75ab-4ce3-9c84-f92ff1d7a762",
      "name": "Split emails1",
      "type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
      "position": [
        -5344,
        1056
      ],
      "parameters": {
        "separator": "Email details:"
      },
      "typeVersion": 1
    },
    {
      "id": "051c026e-0fd7-4182-a388-0ccd6e0c085e",
      "name": "Embeddings OpenAI",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        -6784,
        1072
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "1e9fceab-0844-4201-b731-1ceca71a306c",
  "connections": {
    "New Email": {
      "main": [
        [
          {
            "node": "Get new Email Body",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RAG Agent": {
      "main": [
        []
      ]
    },
    "Split emails": {
      "ai_textSplitter": [
        [
          {
            "node": "Set proper metadata",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "RAG Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Split emails1": {
      "ai_textSplitter": [
        [
          {
            "node": "Set proper metadata1",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "Get all emails": {
      "main": [
        [
          {
            "node": "Refactor Email Body data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI": {
      "ai_embedding": [
        [
          {
            "node": "Qdrant Email Vector Store",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "RAG Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI5": {
      "ai_embedding": [
        [
          {
            "node": "Store Emails in Vector DB",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Get new Email Body": {
      "main": [
        [
          {
            "node": "Store Emails in Vector DB",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI11": {
      "ai_embedding": [
        [
          {
            "node": "Store Emails in Vector DB1",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Set proper metadata": {
      "ai_document": [
        [
          {
            "node": "Store Emails in Vector DB1",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Loop over all emails": {
      "main": [
        [],
        [
          {
            "node": "Store Emails in Vector DB1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set proper metadata1": {
      "ai_document": [
        [
          {
            "node": "Store Emails in Vector DB",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Refactor Email Body data": {
      "main": [
        [
          {
            "node": "Loop over all emails",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Qdrant Email Vector Store": {
      "ai_tool": [
        [
          {
            "node": "RAG Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Store Emails in Vector DB1": {
      "main": [
        [
          {
            "node": "Loop over all emails",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "RAG Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "Get all emails",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

&gt; Summary: &gt; This workflow listens for new Gmail messages, extracts and cleans email content, generates embeddings via OpenAI, stores them in a Qdrant vector database, and then enables a Retrieval‑Augmented‑Generation (RAG) agent to answer user queries against those stored…

Source: https://n8n.io/workflows/6169/ — 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

Your AI workforce is ready. Are you?

Google Sheets Tool, Mcp Trigger, Google Drive +29
AI & RAG

This intelligent chatbot leverages cutting-edge financial APIs and AI-driven analysis to deliver comprehensive stock research reports. Get instant access to professional-grade investment analysis that

Tool Think, Supabase Vector Store, OpenAI Embeddings +15
AI & RAG

This n8n template automatically classifies incoming emails (Sales, Support, Internal, Finance, Promotions) and routes them to a dedicated OpenAI LLM Agent for processing. Depending on the category, th

OpenAI, Gmail, Text Classifier +16
AI & RAG

Chat with docs - 5minAI New version. Uses httpRequest, documentDefaultDataLoader, textSplitterRecursiveCharacterTextSplitter, embeddingsOpenAi. Event-driven trigger; 62 nodes.

HTTP Request, Document Default Data Loader, Text Splitter Recursive Character Text Splitter +10
AI & RAG

I prepared a detailed guide that illustrates the entire process of building an AI agent using Supabase and Google Drive within N8N workflows.

HTTP Request, Document Default Data Loader, Text Splitter Recursive Character Text Splitter +10