AutomationFlowsAI & RAG › Auto-generate Meeting Minutes with Gpt and Share From Google Drive to Slack

Auto-generate Meeting Minutes with Gpt and Share From Google Drive to Slack

ByLidia @lkwon on n8n.io

Teams who want to automatically generate structured meeting minutes from uploaded transcripts and instantly share them in Slack. Perfect for startups, project teams, or any company that collects meeting transcripts in Google Drive.

Event trigger★★★★☆ complexityAI-powered8 nodesGoogle Drive TriggerGoogle DriveOpenAISlack
AI & RAG Trigger: Event Nodes: 8 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Google Drive → Google Drive 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
{
  "name": "minutes_generator",
  "tags": [],
  "nodes": [
    {
      "id": "af25423f-a461-4b1d-9614-c91438b3196f",
      "name": "Google Drive Trigger",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        -704,
        144
      ],
      "parameters": {
        "event": "fileCreated",
        "options": {},
        "pollTimes": {
          "item": [
            {}
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "id",
          "value": "__GOOGLE_DRIVE_FOLDER_ID__"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6049c9c7-3d0b-4eda-b309-98727bc8af8a",
      "name": "Download file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -496,
        144
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{$json.id || $json.fileId}}"
        },
        "options": {},
        "operation": "download"
      },
      "typeVersion": 3
    },
    {
      "id": "43d793f5-7bf8-441a-ab4e-afe05f35a9cc",
      "name": "Message a model",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -80,
        144
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "GPT-5"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "# Goal\nSummarize the meeting transcript concisely and in a structured way. Include all key discussion points, decisions, and follow-up tasks without omission.\n\n# Steps\n1. Review the provided meeting transcript text.\n2. Summarize into 3\u20137 key topics of discussion.\n3. Separate confirmed decisions from pending/undecided items.\n4. List follow-up tasks (Task | Owner | Deadline | Notes) in a table if mentioned.\n5. Mark unclear or missing information as N/A.\n6. Verify the final summary with a checklist to ensure no omissions.\n\n# Output format\n- Structure:\n  1. Meeting overview (date, participants, purpose \u2013 only if available)\n  2. Key discussion points (list format)\n  3. Decisions (list format)\n  4. Pending items (list format)\n  5. Follow-up tasks (table: Task | Owner | Deadline | Notes)\n- Use Markdown\n- Use N/A where information is missing\n\n# Notes\n- If there are uncertainties, ask up to 3 clarification questions before proceeding.\n- Base the summary strictly on the original text. Do not guess or invent.\n- Self-check before submission:\n  \u2022 Are all key discussions, decisions, and tasks included?  \n  \u2022 Are N/A markers used for missing info?  \n  \u2022 Is the Markdown structure followed?"
            },
            {
              "content": "={{$json.transcript}}\n"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "97a34395-14af-42f6-9103-0f993bc89e08",
      "name": "Prep transcript",
      "type": "n8n-nodes-base.code",
      "position": [
        -288,
        144
      ],
      "parameters": {
        "jsCode": "const out = [];\nfor (const it of $input.all()) {\n  const b64 = it.binary?.data?.data; // from Drive Download\n  if (!b64) throw new Error('No binary \"data\". Use Download for txt/md');\n  const text = Buffer.from(b64, 'base64').toString('utf8');\n  const title = it.json?.name || it.json?.fileName || '\ud68c\uc758\ub85d';\n\n  out.push({\n    json: { title, transcript: text },\n    binary: it.binary // keep original file for Slack upload\n  });\n}\nreturn out;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "f96a5216-a8f8-4e73-8ca2-b772f5918a4a",
      "name": "Make Minutes",
      "type": "n8n-nodes-base.code",
      "position": [
        272,
        144
      ],
      "parameters": {
        "jsCode": "const it = $input.first();\n\n// Pick the model output from any of the shapes n8n returns\nconst md =\n  it.json?.message?.content ??                    // Message a model (simplified)\n  it.json?.output_text ??                         // some builds expose this\n  it.json?.data?.choices?.[0]?.message?.content ??// raw OpenAI response\n  it.json?.choices?.[0]?.message?.content ??      // another raw variant\n  '';\n\nconst title = it.json?.title || '\ud68c\uc758\ub85d';\nconst filename = `${title}.md`;\nconst data = Buffer.from(md, 'utf8').toString('base64');\n\nreturn [{\n  json: { filename, title },\n  binary: { minutes: { data, fileName: filename, mimeType: 'text/markdown' } }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "f96c7ca7-48ea-4fdd-92b8-29f15a22eff6",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        480,
        144
      ],
      "parameters": {
        "text": "={{\"*Auto-generated minutes:* \" + ($json.title || $json.name || \"Minutes\")}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "___SLACK_CHANNEL_ID___"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.3
    },
    {
      "id": "6b557b78-cc8c-4b86-ad48-d662fc1accbd",
      "name": "Upload a file",
      "type": "n8n-nodes-base.slack",
      "position": [
        480,
        288
      ],
      "parameters": {
        "options": {
          "fileName": "={{$json.filename}}",
          "channelId": "___SLACK_CHANNEL_ID___"
        },
        "resource": "file",
        "binaryPropertyName": "minutes"
      },
      "typeVersion": 2.3
    },
    {
      "id": "e3f63e52-eba0-4b81-8fbf-ba835410c392",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -192
      ],
      "parameters": {
        "width": 736,
        "height": 288,
        "content": "## Minutes generator (overview)\n**What it does**: Watches a Drive folder, downloads new transcript, summarizes via GPT, posts message + uploads Markdown minutes to Slack.\n\n**Setup**\n1. Google Drive: set folder ID in *Google Drive Trigger*.\n2. OpenAI: add credentials and pick a model in *Message a model*.\n3. Slack: connect account, set channel ID in both Slack nodes.\n\n**Notes**\n- Files must be text (.txt/.md) unless you add a converter.\n- Bot must be in the Slack channel to avoid `not_in_channel`."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "Make Minutes": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          },
          {
            "node": "Upload a file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Prep transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message a model": {
      "main": [
        [
          {
            "node": "Make Minutes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prep transcript": {
      "main": [
        [
          {
            "node": "Message a model",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Trigger": {
      "main": [
        [
          {
            "node": "Download file",
            "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

Teams who want to automatically generate structured meeting minutes from uploaded transcripts and instantly share them in Slack. Perfect for startups, project teams, or any company that collects meeting transcripts in Google Drive.

Source: https://n8n.io/workflows/7802/ — 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 turns any audio file uploaded to Google Drive into a complete podcast episode. It handles transcription, content generation, blog drafting, social copy creation, thumbnail

Google Drive Trigger, Google Drive, OpenAI +3
AI & RAG

This template is ideal for photographers, graphic designers, and creative professionals who manage large volumes of visual assets. It is also perfect for Digital Asset Managers looking for a customiza

Google Drive Trigger, Google Drive, OpenAI +3
AI & RAG

Some use cases: Sales follow-ups, auto-qualifying leads based on budget, monetizing low-budget leads, and automatic data entry. Ingestion: When a call recording is uploaded to a specific Google Drive

OpenAI, Google Drive, Slack +4
AI & RAG

This workflow monitors a Google Drive folder for newly uploaded APK files, automatically downloads them, triggers a MobSF static analysis scan, processes the output to detect unused or risky libraries

Google Drive Trigger, Google Drive, HTTP Request +2
AI & RAG

The Problem That it Solves

Google Drive Trigger, OpenAI, Google Drive +5