{
  "id": "SrM0PcHuYRxXnVGS",
  "meta": {
    "templateId": "4370",
    "templateCredsSetupCompleted": true
  },
  "name": "Generate meeting to-do lists from audio files in Google Drive and send to Slack",
  "tags": [],
  "nodes": [
    {
      "id": "ab3309d9-cb3e-4b13-bb43-a214722c50b4",
      "name": "Looking for uploading file",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        2016,
        368
      ],
      "parameters": {
        "event": "fileUpdated",
        "options": {
          "fileType": "all"
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "list",
          "value": "1LfNfyCnJ-XVCevq32rSULZfH0Zi6KgH8",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1LfNfyCnJ-XVCevq32rSULZfH0Zi6KgH8",
          "cachedResultName": "n8n"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6c7bed41-fcb2-46de-b764-f0df6bf15d72",
      "name": "Download file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2240,
        368
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "da7cec5f-301d-456b-8ca6-f6b676579e2d",
      "name": "Get date",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        3088,
        368
      ],
      "parameters": {
        "options": {},
        "outputFieldName": "Date"
      },
      "typeVersion": 2
    },
    {
      "id": "b51f7dc9-2973-4f03-b160-90dc3ac0c0d2",
      "name": "Format date",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        3312,
        368
      ],
      "parameters": {
        "date": "={{ $json.Date }}",
        "options": {},
        "operation": "formatDate"
      },
      "typeVersion": 2
    },
    {
      "id": "cf384106-5413-4a92-9bdb-cce26b2452d4",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1936,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 500,
        "height": 300,
        "content": "## Download the file \nThese two nodes are responsible for looking and downloading the uploaded file"
      },
      "typeVersion": 1
    },
    {
      "id": "895c7888-8bf1-42e9-9f9c-a610c6297433",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2480,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 300,
        "content": "## Generate Summary \nThese two nodes are responsible for looking and downloading the uploaded file"
      },
      "typeVersion": 1
    },
    {
      "id": "29967247-97f9-4f38-8cca-b5448b7c179d",
      "name": "Transcribe a recording1",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        2592,
        368
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-pro",
          "cachedResultName": "models/gemini-2.5-pro"
        },
        "options": {},
        "resource": "audio",
        "inputType": "binary"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "233b4057-9713-4412-a41b-188cb933ea0c",
      "name": "Analyze document",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        2816,
        368
      ],
      "parameters": {
        "text": "=What's in this document\ud83e\udde0 System Prompt: Action Item Extractor (JSON Output)\n\nYou are a highly specialized AI assistant focused on task extraction. Your sole responsibility is to analyze the provided meeting transcript and extract all actionable tasks (To-Do items).\n\nYour output MUST be a valid JSON array of objects. Each object in the array represents a single action item and must contain the following keys:\n- \"task_description\": A clear and concise description of the task.\n- \"assigned_to\": The name of the person responsible. If not mentioned, use null.\n- \"deadline\": The due date for the task. If not mentioned, use null. Try to format it as YYYY-MM-DD.\n- \"priority\": The priority of the task (\"High\", \"Medium\", \"Low\"). Infer this from the context. If it's unclear, default to \"Medium\".\n\nCRITICAL RULES:\n- Only output the JSON array. Do not include any explanatory text, introductory sentences, or markdown formatting like ```json.\n- If no action items are found in the transcript, output an empty array: \u5bfe\u8c61\u8b70\u4e8b\u9332\u306a\u3057.\n- Do not include summaries, discussion points, or any information that is not a specific, actionable task.?\n\n{{ $('Transcribe a recording1').item.json.text }}",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "document"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ef304bb1-7724-407d-b813-cf3dcb8fee54",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        3536,
        368
      ],
      "parameters": {
        "text": "={{ $('Analyze document').item.json.content.parts[0].text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09LK8LDW79",
          "cachedResultName": "\u8b70\u4e8b\u9332\u30fctodo\u30ea\u30b9\u30c8"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "8db74eff-3909-4b07-acfc-f4ad2c165f2b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3072,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 816,
        "height": 304,
        "content": "## Format and Send Message\nThese three nodes are responsible for timestamping the result and sending it to your Slack channel.\n- **Get & Format Date:** Gets the current date and time to record when the to-do list was created.\n- **Send a message:** Sends the final to-do list extracted by the AI to your designated Slack channel."
      },
      "typeVersion": 1
    },
    {
      "id": "9335bba9-88d5-472f-86b0-caf369db834e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        -160
      ],
      "parameters": {
        "color": 3,
        "width": 768,
        "height": 1120,
        "content": "Generate meeting to-do lists from audio files in Google Drive and send to Slack\nThis workflow automates the process of converting audio meeting recordings into a structured to-do list. It listens for new audio files in a Google Drive folder, transcribes them, extracts action items using AI, and sends a formatted list to a designated Slack channel.\n\nWho\u2019s it for\nThis template is perfect for project managers, teams, and anyone who wants to save time on post-meeting administrative tasks. If you record your meetings and use Google Drive for storage and Slack for team communication, this workflow will streamline your follow-up process and ensure no action item is missed.\n\nWhat it does\nThis workflow automates the entire process of turning spoken words from a meeting into actionable tasks for your team.\n\nTrigger on New Audio: The workflow starts automatically when you upload a new audio file (e.g., MP3, M4A, WAV) to a specific folder in your Google Drive.\n\nTranscribe Audio: It takes the audio file and uses Google Gemini to generate a full text transcript of the recording.\n\nExtract To-Do Items: The transcript is then passed to another Google Gemini node with a specialized prompt. This prompt instructs the AI to carefully analyze the text and extract all action items.\n\nFormat Output: The AI formats the extracted tasks into a clean JSON array. Each task includes a description, the assigned person, a deadline, and its priority.\n\nSend to Slack: Finally, the workflow sends the structured to-do list as a message to your specified Slack channel, making it easy for the whole team to see and act upon.\n\nHow to set up\nConfigure Credentials: Ensure you have configured your credentials for Google Drive, Google Gemini, and Slack in n8n.\n\nSet Google Drive Folder: In the \"Looking for uploading file\" node, select the Google Drive folder you want the workflow to monitor.\n\nSet Slack Channel: In the \"Send a message\" node, choose the correct Slack account and select the channel where you want the to-do list to be posted.\n\nActivate Workflow: Save your changes and activate the workflow using the toggle at the top right.\n\nTest It: Upload a meeting recording to the designated Google Drive folder to see the magic happen!\n\nHow to customize the workflow\nChange AI Model: You can easily swap the Google Gemini nodes for other AI models like OpenAI or Anthropic to handle transcription and analysis based on your preference.\n\nModify the AI Prompt: Adjust the prompt in the \"Analyze document\" node to change the output format. For example, you could ask for a meeting summary in addition to the to-do list.\n\nChange Notification Service: Replace the Slack node with another notification service like Discord, Microsoft Teams, or an email node.\n\nArchive Results: Add a node (e.g., Google Sheets, Notion, Airtable) after the \"Analyze document\" node to save a history of all meeting transcripts and their corresponding action items."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "13655ad4-7ca3-487d-919a-305ae30f5589",
  "connections": {
    "Get date": {
      "main": [
        [
          {
            "node": "Format date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format date": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Transcribe a recording1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        []
      ]
    },
    "Analyze document": {
      "main": [
        [
          {
            "node": "Get date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe a recording1": {
      "main": [
        [
          {
            "node": "Analyze document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Looking for uploading file": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}