AutomationFlowsAI & RAG › Google Drive Knowledge Base Sync

Google Drive Knowledge Base Sync

Original n8n title: Google Drive Knowledge Sync

Google Drive Knowledge Sync. Uses googleDriveTrigger, googleDrive, textSplitterRecursiveCharacterTextSplitter, documentDefaultDataLoader. Event-driven trigger; 20 nodes.

Event trigger★★★★☆ complexityAI-powered20 nodesGoogle Drive TriggerGoogle DriveText Splitter Recursive Character Text SplitterDocument Default Data LoaderOllama EmbeddingsQdrant Vector StorePostgresHTTP Request
AI & RAG Trigger: Event Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:
Google Drive Knowledge Base Sync — n8n workflow card showing Google Drive Trigger, Google Drive, Text Splitter Recursive Character Text Splitter integration

This workflow follows the Documentdefaultdataloader → Google Drive 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
{
  "name": "Google Drive Knowledge Sync",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "value": "{{ $vars.google_drive_knowledge_folder_id }}",
          "mode": "list",
          "cachedResultName": "Knowledge Base",
          "cachedResultUrl": "https://drive.google.com/drive/folders/{{ $vars.google_drive_knowledge_folder_id }}"
        },
        "event": "fileCreated",
        "options": {}
      },
      "id": "google-drive-file-created",
      "name": "Google Drive File Created",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "typeVersion": 1,
      "position": [
        200,
        300
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "value": "{{ $vars.google_drive_knowledge_folder_id }}",
          "mode": "list",
          "cachedResultName": "Knowledge Base",
          "cachedResultUrl": "https://drive.google.com/drive/folders/{{ $vars.google_drive_knowledge_folder_id }}"
        },
        "event": "fileUpdated",
        "options": {}
      },
      "id": "google-drive-file-updated",
      "name": "Google Drive File Updated",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "typeVersion": 1,
      "position": [
        200,
        500
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "extract-file-info",
              "name": "fileInfo",
              "value": "={{ { id: $json.id, name: $json.name, mimeType: $json.mimeType, modifiedTime: $json.modifiedTime, createdTime: $json.createdTime, size: $json.size, webViewLink: $json.webViewLink, parents: $json.parents } }}",
              "type": "object"
            },
            {
              "id": "document-id-gdrive",
              "name": "document_id",
              "value": "={{ 'google_drive_' + $json.id }}",
              "type": "string"
            },
            {
              "id": "is-supported-type",
              "name": "isSupportedType",
              "value": "={{ ['application/vnd.google-apps.document', 'application/vnd.google-apps.presentation', 'application/vnd.google-apps.spreadsheet', 'application/pdf', 'text/plain', 'text/markdown', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'].includes($json.mimeType) }}",
              "type": "boolean"
            }
          ]
        },
        "options": {}
      },
      "id": "process-google-drive-file",
      "name": "Process Google Drive File",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        450,
        400
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "supported-file-type",
              "leftValue": "={{ $json.isSupportedType }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "check-supported-file-type",
      "name": "Check Supported File Type",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        700,
        400
      ]
    },
    {
      "parameters": {
        "code": {
          "execute": {
            "code": "const { QdrantVectorStore } = require(\"@langchain/qdrant\");\nconst { OllamaEmbeddings } = require(\"@langchain/community/embeddings/ollama\");\n\nconst embeddings = new OllamaEmbeddings({\n  model: \"nomic-embed-text\",\n  baseUrl: \"http://ollama:11434\"\n});\n\nconst vectorStore = await QdrantVectorStore.fromExistingCollection(\n  embeddings,\n  {\n    url: \"http://qdrant:6333\",\n    collectionName: \"knowledge_base\",\n  }\n);\n\nconst documentIdToDelete = this.getInputData()[0].json.document_id;\n\nconst filter = {\n  must: [\n    {\n      key: \"metadata.document_id\",\n      match: {\n        value: documentIdToDelete,\n      },\n    },\n  ],\n};\n\n// Delete existing vectors for this document\ntry {\n  await vectorStore.client.delete(\"knowledge_base\", {\n    filter\n  });\n  console.log(`Cleared vectors for Google Drive document: ${documentIdToDelete}`);\n} catch (error) {\n  console.log(`No existing vectors found for document: ${documentIdToDelete}`);\n}\n\nreturn [{ json: { document_id: documentIdToDelete, status: \"cleared\" } }];"
          }
        },
        "inputs": {
          "input": [
            {
              "type": "main",
              "required": true
            }
          ]
        },
        "outputs": {
          "output": [
            {
              "type": "main"
            }
          ]
        }
      },
      "id": "clear-existing-google-drive-vectors",
      "name": "Clear Existing Google Drive Vectors",
      "type": "@n8n/n8n-nodes-langchain.code",
      "typeVersion": 1,
      "position": [
        950,
        300
      ]
    },
    {
      "parameters": {
        "operation": "download",
        "fileId": {
          "__rl": true,
          "value": "={{ $('Process Google Drive File').item.json.fileInfo.id }}",
          "mode": "id"
        },
        "options": {
          "googleFileConversion": {
            "conversion": {
              "docsToFormat": "text/plain",
              "sheetsToFormat": "text/csv",
              "slidesToFormat": "text/plain"
            }
          }
        }
      },
      "id": "download-google-drive-file",
      "name": "Download Google Drive File",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        950,
        500
      ],
      "executeOnce": true,
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "text",
        "options": {}
      },
      "id": "extract-google-drive-text",
      "name": "Extract Google Drive Text",
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1,
      "position": [
        1200,
        500
      ],
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "enhanced-content",
              "name": "enhancedContent",
              "value": "={{ $('Process Google Drive File').item.json.fileInfo.name + '\\n\\n' + ($json.data || 'No content extracted') + '\\n\\nFile Details:\\n' + 'Type: ' + $('Process Google Drive File').item.json.fileInfo.mimeType + '\\n' + 'Created: ' + $('Process Google Drive File').item.json.fileInfo.createdTime + '\\n' + 'Modified: ' + $('Process Google Drive File').item.json.fileInfo.modifiedTime + '\\n' + 'Size: ' + ($('Process Google Drive File').item.json.fileInfo.size || 'Unknown') + ' bytes' }}",
              "type": "string"
            },
            {
              "id": "enhanced-metadata",
              "name": "enhancedMetadata",
              "value": "={{ { source: 'google_drive', type: 'file', document_id: $('Process Google Drive File').item.json.document_id, file_id: $('Process Google Drive File').item.json.fileInfo.id, file_name: $('Process Google Drive File').item.json.fileInfo.name, mime_type: $('Process Google Drive File').item.json.fileInfo.mimeType, created_time: $('Process Google Drive File').item.json.fileInfo.createdTime, modified_time: $('Process Google Drive File').item.json.fileInfo.modifiedTime, file_size: $('Process Google Drive File').item.json.fileInfo.size, web_view_link: $('Process Google Drive File').item.json.fileInfo.webViewLink, folder_ids: $('Process Google Drive File').item.json.fileInfo.parents, extraction_timestamp: $now } }}",
              "type": "object"
            }
          ]
        },
        "options": {}
      },
      "id": "enhance-google-drive-content",
      "name": "Enhance Google Drive Content",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1450,
        400
      ]
    },
    {
      "parameters": {
        "chunkSize": 800,
        "chunkOverlap": 100,
        "options": {}
      },
      "id": "google-drive-text-splitter",
      "name": "Google Drive Text Splitter",
      "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
      "typeVersion": 1,
      "position": [
        1700,
        600
      ]
    },
    {
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "source",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.source }}"
              },
              {
                "name": "type",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.type }}"
              },
              {
                "name": "document_id",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.document_id }}"
              },
              {
                "name": "file_id",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.file_id }}"
              },
              {
                "name": "file_name",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.file_name }}"
              },
              {
                "name": "mime_type",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.mime_type }}"
              },
              {
                "name": "modified_time",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.modified_time }}"
              },
              {
                "name": "web_view_link",
                "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata.web_view_link }}"
              }
            ]
          }
        }
      },
      "id": "google-drive-document-loader",
      "name": "Google Drive Document Loader",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "typeVersion": 1,
      "position": [
        1700,
        400
      ]
    },
    {
      "parameters": {
        "model": "nomic-embed-text:latest"
      },
      "id": "google-drive-embeddings",
      "name": "Google Drive Embeddings",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
      "typeVersion": 1,
      "position": [
        1950,
        400
      ],
      "credentials": {
        "ollamaApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "insert",
        "qdrantCollection": {
          "__rl": true,
          "value": "knowledge_base",
          "mode": "list",
          "cachedResultName": "knowledge_base"
        },
        "options": {}
      },
      "id": "google-drive-qdrant-insert",
      "name": "Google Drive Qdrant Insert",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
      "typeVersion": 1,
      "position": [
        2200,
        400
      ],
      "credentials": {
        "qdrantApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "upsert",
        "table": {
          "__rl": true,
          "value": "knowledge_sync_log",
          "mode": "list"
        },
        "data": {
          "insert": [
            {
              "column": "document_id",
              "value": "={{ $('Process Google Drive File').item.json.document_id }}"
            },
            {
              "column": "source_system",
              "value": "google_drive"
            },
            {
              "column": "source_id",
              "value": "={{ $('Process Google Drive File').item.json.fileInfo.id }}"
            },
            {
              "column": "content_hash",
              "value": "={{ $crypto.createHash('md5').update($('Enhance Google Drive Content').item.json.enhancedContent).digest('hex') }}"
            },
            {
              "column": "metadata",
              "value": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata }}"
            },
            {
              "column": "sync_timestamp",
              "value": "={{ $now }}"
            },
            {
              "column": "status",
              "value": "synced"
            }
          ]
        },
        "options": {}
      },
      "id": "log-google-drive-sync",
      "name": "Log Google Drive Sync",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.5,
      "position": [
        2450,
        400
      ],
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "enable-cross-sync",
              "leftValue": "={{ $vars.enable_google_drive_cross_sync || false }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "check-cross-sync-enabled",
      "name": "Check Cross-Sync Enabled",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        2700,
        400
      ]
    },
    {
      "parameters": {
        "url": "https://n8n.{{ $vars.domain_name }}/webhook/trigger-knowledge-sync",
        "options": {
          "timeout": 60000
        },
        "sendBody": true,
        "contentType": "json",
        "body": {
          "source": "google_drive",
          "documentId": "={{ $('Process Google Drive File').item.json.document_id }}",
          "updateType": "file_sync",
          "triggerBidirectional": true,
          "metadata": "={{ $('Enhance Google Drive Content').item.json.enhancedMetadata }}"
        }
      },
      "id": "trigger-cross-platform-sync",
      "name": "Trigger Cross-Platform Sync",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        2950,
        300
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "google-drive-webhook-sync",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "google-drive-webhook",
      "name": "Google Drive Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        200,
        700
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "webhook-file-id",
              "name": "fileId",
              "value": "={{ $json.body.fileId || $json.body.file_id }}",
              "type": "string"
            },
            {
              "id": "webhook-action",
              "name": "action",
              "value": "={{ $json.body.action || 'sync' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "process-webhook-request",
      "name": "Process Webhook Request",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        450,
        700
      ]
    },
    {
      "parameters": {
        "operation": "get",
        "fileId": {
          "__rl": true,
          "value": "={{ $json.fileId }}",
          "mode": "id"
        },
        "options": {}
      },
      "id": "get-webhook-file-details",
      "name": "Get Webhook File Details",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        700,
        700
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "respond-to-google-drive-webhook",
      "name": "Respond to Google Drive Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        950,
        700
      ]
    },
    {
      "parameters": {
        "content": "## Enhanced Google Drive Knowledge Sync\n\n**Purpose:** Comprehensive integration of Google Drive files into the knowledge management ecosystem with automatic content extraction and cross-platform synchronization.\n\n**Supported File Types:**\n- Google Docs (converted to plain text)\n- Google Sheets (converted to CSV)\n- Google Slides (converted to plain text)\n- PDF files\n- Plain text files\n- Markdown files\n- Word documents (.docx)\n\n**Key Features:**\n- **Automatic Detection**: Monitors specified Google Drive folders for new/updated files\n- **Content Extraction**: Intelligent text extraction based on file type\n- **Vector Indexing**: Automatic embedding generation and storage in Qdrant\n- **Metadata Enrichment**: Comprehensive file metadata and linking information\n- **Cross-Platform Sync**: Optional bidirectional sync with AppFlowy/Affine\n- **Webhook Support**: Manual trigger capability for specific files\n- **Duplicate Handling**: Automatic cleanup of existing vectors before re-indexing\n\n**Workflow Triggers:**\n1. **File Created**: New files added to monitored folders\n2. **File Updated**: Existing files modified in monitored folders\n3. **Webhook**: Manual sync trigger for specific files\n\n**Configuration:**\n- Set `google_drive_knowledge_folder_id` variable for folder monitoring\n- Enable `enable_google_drive_cross_sync` for bidirectional platform sync\n- Configure supported MIME types as needed\n\n**Integration Points:**\n- Vector Database (Qdrant) for semantic search\n- Knowledge Sync Log for tracking and analytics\n- Cross-Platform Sync for content distribution\n- Enhanced RAG Agent for intelligent querying\n\n**API Webhooks:**\n- POST /webhook/google-drive-webhook-sync\n- Parameters: fileId, action",
        "height": 800,
        "width": 800,
        "color": 3
      },
      "id": "google-drive-sync-documentation",
      "name": "Google Drive Sync Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3200,
        100
      ]
    }
  ],
  "connections": {
    "Google Drive File Created": {
      "main": [
        [
          {
            "node": "Process Google Drive File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive File Updated": {
      "main": [
        [
          {
            "node": "Process Google Drive File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Google Drive File": {
      "main": [
        [
          {
            "node": "Check Supported File Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Supported File Type": {
      "main": [
        [
          {
            "node": "Clear Existing Google Drive Vectors",
            "type": "main",
            "index": 0
          },
          {
            "node": "Download Google Drive File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clear Existing Google Drive Vectors": {
      "main": [
        [
          {
            "node": "Enhance Google Drive Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Google Drive File": {
      "main": [
        [
          {
            "node": "Extract Google Drive Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Google Drive Text": {
      "main": [
        [
          {
            "node": "Enhance Google Drive Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enhance Google Drive Content": {
      "main": [
        [
          {
            "node": "Google Drive Document Loader",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Text Splitter": {
      "ai_textSplitter": [
        [
          {
            "node": "Google Drive Document Loader",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Document Loader": {
      "ai_document": [
        [
          {
            "node": "Google Drive Qdrant Insert",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Embeddings": {
      "ai_embedding": [
        [
          {
            "node": "Google Drive Qdrant Insert",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Qdrant Insert": {
      "main": [
        [
          {
            "node": "Log Google Drive Sync",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Google Drive Sync": {
      "main": [
        [
          {
            "node": "Check Cross-Sync Enabled",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Cross-Sync Enabled": {
      "main": [
        [
          {
            "node": "Trigger Cross-Platform Sync",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Webhook": {
      "main": [
        [
          {
            "node": "Process Webhook Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Webhook Request": {
      "main": [
        [
          {
            "node": "Get Webhook File Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Webhook File Details": {
      "main": [
        [
          {
            "node": "Respond to Google Drive Webhook",
            "type": "main",
            "index": 0
          },
          {
            "node": "Process Google Drive File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "google-drive-sync-v1",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "GoogleDriveKnowledgeSync",
  "tags": [
    "google-drive",
    "knowledge-management",
    "sync",
    "vector-store",
    "content-extraction"
  ]
}

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

Google Drive Knowledge Sync. Uses googleDriveTrigger, googleDrive, textSplitterRecursiveCharacterTextSplitter, documentDefaultDataLoader. Event-driven trigger; 20 nodes.

Source: https://github.com/161sam/n8n-installer/blob/main/modularium/ai-workspace/Google-Drive-Sync.json — 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

RAG AI Agent Template V5. Uses lmChatOpenAi, documentDefaultDataLoader, embeddingsOpenAi, googleDrive. Event-driven trigger; 56 nodes.

OpenAI Chat, Document Default Data Loader, OpenAI Embeddings +12
AI & RAG

This workflow implements a Retrieval-Augmented Generation (RAG) system that integrates Google Drive and Qdrant.

OpenAI Embeddings, Document Default Data Loader, HTTP Request +8
AI & RAG

Local RAG AI Agent. Uses memoryPostgresChat, lmChatOllama, lmOllama, toolVectorStore. Event-driven trigger; 24 nodes.

Memory Postgres Chat, Ollama Chat, Lm Ollama +9
AI & RAG

V1 ocal RAG AI Agent. Uses memoryPostgresChat, lmChatOllama, lmOllama, toolVectorStore. Event-driven trigger; 24 nodes.

Memory Postgres Chat, Ollama Chat, Lm Ollama +9
AI & RAG

This n8n workflow automates the process of summarizing uploaded books from Google Drive using vector databases and LLMs. It uses Cohere for embeddings, Qdrant for storage and retrieval, and DeepSeek o

Qdrant Vector Store, Text Splitter Recursive Character Text Splitter, Document Default Data Loader +10