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 →
{
"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.
openAiApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
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
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
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
The Problem That it Solves