AutomationFlowsAI & RAG › Turn Meeting Recordings Into Slack Summaries Using Wayinvideo and Gpt-4o-mini

Turn Meeting Recordings Into Slack Summaries Using Wayinvideo and Gpt-4o-mini

ByIncrementors @incrementors on n8n.io

Paste any Zoom, Google Meet, or Teams recording URL into a simple form along with the meeting title, team name, date, and Slack channel and the workflow handles everything automatically. WayinVideo transcribes the full meeting with speaker labels and timestamps, then GPT-4o-mini…

Event trigger★★★★☆ complexityAI-powered18 nodesForm TriggerHTTP RequestAgentOpenAI ChatSlackGoogle Sheets
AI & RAG Trigger: Event Nodes: 18 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Form 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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "9c895b3f-7905-414f-aefa-f436970e81c9",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        -608
      ],
      "parameters": {
        "color": 4,
        "width": 540,
        "height": 1108,
        "content": "## Meeting Recording to Slack Action Items Bot \u2014 WayinVideo + GPT-4o-mini + Slack + Sheets\n\nFor teams who run regular standups, project meetings, or client calls and want to automatically share action items with the team on Slack \u2014 without anyone manually writing notes or copy-pasting summaries. Paste any Zoom, Google Meet, or Teams recording URL via the form. WayinVideo transcribes the full meeting with speaker labels and timestamps. GPT-4o-mini reads the transcript and extracts five structured sections: a meeting summary, action items with owners and due dates, decisions made, key discussion points, and next steps. A formatted Slack Block Kit message is posted to your team channel automatically. Every meeting summary is also logged to Google Sheets with the Slack message timestamp for thread tracking.\n\n## How it works\n- **1. Form \u2014 Meeting URL + Details** collects the recording URL, meeting title, team name, date, and Slack channel name\n- **2. WayinVideo \u2014 Submit Transcription** submits the URL for speaker-labeled transcription\n- **3. Wait \u2014 90 Seconds** gives the API initial processing time for meeting-length recordings\n- **4. WayinVideo \u2014 Get Transcript Results** polls for the task result\n- **5. IF \u2014 Transcription Complete?** checks for SUCCEEDED \u2014 if not, retries via 30-second wait\n- **7. Code \u2014 Format Transcript** formats each segment with speaker labels and timestamps\n- **8. AI Agent \u2014 Extract Meeting Summary** uses GPT-4o-mini to extract all five sections in labeled format\n- **10. Code \u2014 Build Slack Message** parses the five sections via regex and builds a Slack Block Kit JSON message with header, attendee fields, dividers, and a recording link\n- **11. Slack \u2014 Post Action Items** posts the Block Kit message to your team channel\n- **12. Google Sheets \u2014 Log Meeting Summary** logs all extracted fields plus the Slack message timestamp\n\n## Set up steps\n1. In **2. WayinVideo \u2014 Submit Transcription** and **4. WayinVideo \u2014 Get Transcript Results** \u2014 replace YOUR_WAYINVIDEO_API_KEY\n2. In **9. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **11. Slack \u2014 Post Action Items** \u2014 connect your Slack OAuth2 credential and replace YOUR_SLACK_CHANNEL_ID\n4. In **12. Google Sheets \u2014 Log Meeting Summary** \u2014 connect your Google Sheets OAuth2 credential and replace YOUR_GOOGLE_SHEET_ID\n5. Create a Google Sheet tab named Meeting Log with columns: Meeting Title, Team, Date, Duration (min), Attendees, Summary, Action Items, Decisions, Next Steps, Recording URL, Slack Channel, Slack Message TS, Logged On"
      },
      "typeVersion": 1
    },
    {
      "id": "77215fdb-9e03-4a7d-9cba-7b49ed5b77a2",
      "name": "Section \u2014 Form Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        -256
      ],
      "parameters": {
        "color": 5,
        "width": 372,
        "height": 388,
        "content": "## Form Input\nUser submits meeting recording URL, meeting title, team name, date, and Slack channel name. All fields feed into the transcript formatter and AI prompt."
      },
      "typeVersion": 1
    },
    {
      "id": "3e046ed3-d44e-4452-afa8-c21e5b917a0e",
      "name": "Section \u2014 Transcription Submit and Poll",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -304
      ],
      "parameters": {
        "color": 6,
        "width": 660,
        "height": 484,
        "content": "## WayinVideo Transcription Submit and Poll\nSubmits the meeting URL for speaker-labeled transcription. Waits 90 seconds for initial processing. Polls the results endpoint until status equals SUCCEEDED."
      },
      "typeVersion": 1
    },
    {
      "id": "233f5460-4b1b-428d-8cb3-877ddca2dced",
      "name": "Section \u2014 Status Check and Retry Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        -448
      ],
      "parameters": {
        "color": 6,
        "width": 324,
        "height": 804,
        "content": "## Transcription Status Check and Retry Loop\nIF checks for SUCCEEDED status. TRUE proceeds to transcript formatting. FALSE waits 30 seconds and polls again. Loop continues until the transcript is ready."
      },
      "typeVersion": 1
    },
    {
      "id": "b2d2e6f5-04f4-4510-a1e0-668448abb892",
      "name": "Section \u2014 Transcript Formatting and AI Meeting Extraction",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        960,
        -384
      ],
      "parameters": {
        "color": 6,
        "width": 484,
        "height": 628,
        "content": "## Transcript Formatting and AI Meeting Extraction\nFormats transcript with speaker labels and timestamps. GPT-4o-mini extracts five structured sections: meeting summary, action items with owners and due dates, decisions made, key discussion points, and next steps."
      },
      "typeVersion": 1
    },
    {
      "id": "85e41c92-e93b-4c1c-97e0-c6b342ff1bdc",
      "name": "Section \u2014 Slack Message Build, Post, and Sheet Log",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 724,
        "height": 436,
        "content": "## Slack Message Build, Post, and Sheet Log\nBuilds a Slack Block Kit message with header, team metadata fields, five content sections, and a recording link. Posts to the team channel. Logs all extracted fields and the Slack message timestamp to Google Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "cf49bfe0-c22b-4c75-ab18-919015bb8009",
      "name": "1. Form \u2014 Meeting URL + Details",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -400,
        -112
      ],
      "parameters": {
        "options": {},
        "formTitle": "Meeting to Slack Action Items Bot",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Meeting Recording URL",
              "placeholder": "https://zoom.us/rec/xxxxxxx or Google Meet / Teams / Loom link",
              "requiredField": true
            },
            {
              "fieldLabel": "Meeting Title",
              "placeholder": "e.g. Q2 Sprint Planning, Client Kickoff Call, Weekly Standup",
              "requiredField": true
            },
            {
              "fieldLabel": "Team Name",
              "placeholder": "e.g. Marketing Team, Engineering, Sales, Product",
              "requiredField": true
            },
            {
              "fieldLabel": "Meeting Date",
              "placeholder": "e.g. 2025-04-29",
              "requiredField": true
            },
            {
              "fieldLabel": "Slack Channel Name",
              "placeholder": "e.g. #team-updates, #project-alpha, #standup",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Paste your meeting recording URL. AI will transcribe the full meeting and automatically post action items, decisions, and key points to your Slack channel."
      },
      "typeVersion": 2.2
    },
    {
      "id": "a01e60ba-7b00-4f0d-ade9-41f9322c5f7f",
      "name": "2. WayinVideo \u2014 Submit Transcription",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -96,
        -112
      ],
      "parameters": {
        "url": "https://wayinvideo-api.wayin.ai/api/v2/transcripts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"video_url\": \"{{ $json['Meeting Recording URL'] }}\",\n  \"target_lang\": \"en\"\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "x-wayinvideo-api-version",
              "value": "v2"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ccecc39c-6d2e-478f-8516-3f8c292895b4",
      "name": "3. Wait \u2014 90 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        160,
        -112
      ],
      "parameters": {
        "amount": 90
      },
      "typeVersion": 1.1
    },
    {
      "id": "c55d78ad-d3b2-4ad0-ba28-770df1d989d7",
      "name": "4. WayinVideo \u2014 Get Transcript Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        400,
        -112
      ],
      "parameters": {
        "url": "=https://wayinvideo-api.wayin.ai/api/v2/transcripts/results/{{ $('2. WayinVideo \u2014 Submit Transcription').item.json.data.id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "x-wayinvideo-api-version",
              "value": "v2"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ec942493-b1e8-4d5c-8867-32c09bf540d6",
      "name": "5. IF \u2014 Transcription Complete?",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        -112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "status-check",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "SUCCEEDED"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b92fe17d-4414-4f55-862c-de9771263311",
      "name": "6. Wait \u2014 30 Seconds Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        640,
        96
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "999955b8-4d69-458b-9eec-85b363467697",
      "name": "7. Code \u2014 Format Transcript",
      "type": "n8n-nodes-base.code",
      "position": [
        1024,
        -128
      ],
      "parameters": {
        "jsCode": "// Get transcript segments from WayinVideo\nconst segments = $('4. WayinVideo \u2014 Get Transcript Results').item.json.data.transcript || [];\n\nif (segments.length === 0) {\n  throw new Error('Transcript is empty \u2014 check if the meeting URL is valid and publicly accessible.');\n}\n\n// Format transcript with speaker labels and timestamps\nconst formattedTranscript = segments\n  .map(s => {\n    const timeInSeconds = Math.floor(s.start / 1000);\n    const minutes = Math.floor(timeInSeconds / 60);\n    const seconds = timeInSeconds % 60;\n    const timestamp = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n    return `[${s.speaker} | ${timestamp}] ${s.text.trim()}`;\n  })\n  .join('\\n');\n\n// Calculate duration\nconst lastSegment = segments[segments.length - 1];\nconst totalDurationMs = lastSegment?.end || 0;\nconst totalMinutes = Math.round(totalDurationMs / 60000);\n\n// Unique speakers / attendees\nconst speakers = [...new Set(segments.map(s => s.speaker))];\n\n// Word count\nconst wordCount = segments.map(s => s.text).join(' ').split(/\\s+/).length;\n\nreturn [{\n  json: {\n    formattedTranscript,\n    wordCount,\n    totalMinutes,\n    speakerCount: speakers.length,\n    speakers: speakers.join(', '),\n    meetingTitle: $('1. Form \u2014 Meeting URL + Details').item.json['Meeting Title'],\n    teamName: $('1. Form \u2014 Meeting URL + Details').item.json['Team Name'],\n    meetingDate: $('1. Form \u2014 Meeting URL + Details').item.json['Meeting Date'],\n    slackChannel: $('1. Form \u2014 Meeting URL + Details').item.json['Slack Channel Name'],\n    recordingUrl: $('1. Form \u2014 Meeting URL + Details').item.json['Meeting Recording URL']\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "625db3b4-57c4-4394-982e-ca07e14b4642",
      "name": "8. AI Agent \u2014 Extract Meeting Summary",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1200,
        -128
      ],
      "parameters": {
        "text": "={{ $json.formattedTranscript }}",
        "options": {
          "systemMessage": "=You are an expert meeting analyst who extracts clear, actionable summaries from meeting transcripts.\n\nYour job is to read this meeting transcript and extract everything the team needs to know \u2014 action items with owners, decisions made, key discussion points, and next steps. The output will be posted directly to Slack so it must be clean, concise, and easy to scan.\n\n---\n\n## MEETING DETAILS\n- Meeting Title: {{ $json.meetingTitle }}\n- Team: {{ $json.teamName }}\n- Date: {{ $json.meetingDate }}\n- Duration: {{ $json.totalMinutes }} minutes\n- Attendees: {{ $json.speakers }}\n- Recording: {{ $json.recordingUrl }}\n\n---\n\n## EXTRACTION RULES\n1. Extract ONLY from what was actually discussed in the transcript \u2014 no invented content\n2. Action items must have an owner name if mentioned \u2014 use 'Team' if no specific person assigned\n3. Keep each point short \u2014 one clear sentence maximum\n4. Decisions must be final conclusions reached in the meeting \u2014 not suggestions or maybes\n5. Key points should be the most important things discussed \u2014 max 5 points\n6. Next steps are time-bound follow-ups mentioned in the meeting\n7. If something is not mentioned in the transcript \u2014 leave that section empty with 'None mentioned'\n\n---\n\n## OUTPUT FORMAT\nReturn your response in this exact structure \u2014 use these exact labels:\n\nMEETING SUMMARY:\n[Write 2-3 sentences summarizing what the meeting was about and what was accomplished]\n\nACTION ITEMS:\n- [ ] [Action item description] \u2014 Owner: [Person name or Team] \u2014 Due: [Date if mentioned, else 'TBD']\n- [ ] [Action item description] \u2014 Owner: [Person name or Team] \u2014 Due: [Date if mentioned, else 'TBD']\n[Add more as needed \u2014 if none, write 'None identified']\n\nDECISIONS MADE:\n- [Decision 1 \u2014 one clear sentence]\n- [Decision 2 \u2014 one clear sentence]\n[Add more as needed \u2014 if none, write 'None recorded']\n\nKEY DISCUSSION POINTS:\n- [Point 1]\n- [Point 2]\n- [Point 3]\n[Maximum 5 points \u2014 if none, write 'None recorded']\n\nNEXT STEPS:\n- [Next step 1 with owner if mentioned]\n- [Next step 2 with owner if mentioned]\n[Add more as needed \u2014 if none, write 'None mentioned']\n\n---\n\nNow read the transcript and extract the meeting summary:"
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "9c3a2974-df92-4d8d-9474-56fab7dd1d34",
      "name": "9. OpenAI \u2014 GPT-4o-mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1200,
        80
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "9749753f-6213-42c3-b6e5-d7807e0daa8b",
      "name": "10. Code \u2014 Build Slack Message",
      "type": "n8n-nodes-base.code",
      "position": [
        1600,
        -128
      ],
      "parameters": {
        "jsCode": "// Parse AI output into structured sections for Slack\nconst output = $input.first().json.output || '';\n\n// Extract each section using regex\nconst summaryMatch = output.match(/MEETING SUMMARY:\\s*([\\s\\S]*?)(?=\\nACTION ITEMS:|$)/);\nconst actionItemsMatch = output.match(/ACTION ITEMS:\\s*([\\s\\S]*?)(?=\\nDECISIONS MADE:|$)/);\nconst decisionsMatch = output.match(/DECISIONS MADE:\\s*([\\s\\S]*?)(?=\\nKEY DISCUSSION POINTS:|$)/);\nconst keyPointsMatch = output.match(/KEY DISCUSSION POINTS:\\s*([\\s\\S]*?)(?=\\nNEXT STEPS:|$)/);\nconst nextStepsMatch = output.match(/NEXT STEPS:\\s*([\\s\\S]*)$/);\n\nconst meetingSummary = summaryMatch ? summaryMatch[1].trim() : 'No summary available';\nconst actionItems = actionItemsMatch ? actionItemsMatch[1].trim() : 'None identified';\nconst decisions = decisionsMatch ? decisionsMatch[1].trim() : 'None recorded';\nconst keyPoints = keyPointsMatch ? keyPointsMatch[1].trim() : 'None recorded';\nconst nextSteps = nextStepsMatch ? nextStepsMatch[1].trim() : 'None mentioned';\n\n// Get metadata from previous node\nconst meetingTitle = $('7. Code \u2014 Format Transcript').item.json.meetingTitle;\nconst teamName = $('7. Code \u2014 Format Transcript').item.json.teamName;\nconst meetingDate = $('7. Code \u2014 Format Transcript').item.json.meetingDate;\nconst totalMinutes = $('7. Code \u2014 Format Transcript').item.json.totalMinutes;\nconst speakers = $('7. Code \u2014 Format Transcript').item.json.speakers;\nconst recordingUrl = $('7. Code \u2014 Format Transcript').item.json.recordingUrl;\nconst slackChannel = $('7. Code \u2014 Format Transcript').item.json.slackChannel;\n\n// Build Slack Block Kit message\nconst slackBlocks = [\n  {\n    \"type\": \"header\",\n    \"text\": {\n      \"type\": \"plain_text\",\n      \"text\": `Meeting Summary \u2014 ${meetingTitle}`,\n      \"emoji\": true\n    }\n  },\n  {\n    \"type\": \"section\",\n    \"fields\": [\n      {\n        \"type\": \"mrkdwn\",\n        \"text\": `*Team:*\\n${teamName}`\n      },\n      {\n        \"type\": \"mrkdwn\",\n        \"text\": `*Date:*\\n${meetingDate}`\n      },\n      {\n        \"type\": \"mrkdwn\",\n        \"text\": `*Duration:*\\n${totalMinutes} minutes`\n      },\n      {\n        \"type\": \"mrkdwn\",\n        \"text\": `*Attendees:*\\n${speakers}`\n      }\n    ]\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `*Meeting Summary*\\n${meetingSummary}`\n    }\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `*Action Items*\\n${actionItems}`\n    }\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `*Decisions Made*\\n${decisions}`\n    }\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `*Key Discussion Points*\\n${keyPoints}`\n    }\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `*Next Steps*\\n${nextSteps}`\n    }\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `*Full Recording*\\n<${recordingUrl}|Watch Recording>`\n    }\n  },\n  {\n    \"type\": \"context\",\n    \"elements\": [\n      {\n        \"type\": \"mrkdwn\",\n        \"text\": `_Auto-generated by n8n + WayinVideo + GPT-4o-mini_`\n      }\n    ]\n  }\n];\n\nreturn [{\n  json: {\n    slackBlocks: JSON.stringify(slackBlocks),\n    slackChannel,\n    meetingTitle,\n    meetingSummary,\n    actionItems,\n    decisions,\n    keyPoints,\n    nextSteps,\n    meetingDate,\n    totalMinutes\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "1f8b7afa-d715-4490-9f7e-a0fa17462072",
      "name": "11. Slack \u2014 Post Action Items",
      "type": "n8n-nodes-base.slack",
      "position": [
        1840,
        -128
      ],
      "parameters": {
        "select": "channel",
        "blocksUi": "={{ $json.slackBlocks }}",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_SLACK_CHANNEL_ID"
        },
        "messageType": "block",
        "otherOptions": {
          "mrkdwn": true
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "4d84567d-0611-4f0a-9125-302787b54493",
      "name": "12. Google Sheets \u2014 Log Meeting Summary",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2080,
        -128
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $('10. Code \u2014 Build Slack Message').item.json.meetingDate }}",
            "Team": "={{ $('7. Code \u2014 Format Transcript').item.json.teamName }}",
            "Summary": "={{ $('10. Code \u2014 Build Slack Message').item.json.meetingSummary }}",
            "Attendees": "={{ $('7. Code \u2014 Format Transcript').item.json.speakers }}",
            "Decisions": "={{ $('10. Code \u2014 Build Slack Message').item.json.decisions }}",
            "Logged On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
            "Next Steps": "={{ $('10. Code \u2014 Build Slack Message').item.json.nextSteps }}",
            "Action Items": "={{ $('10. Code \u2014 Build Slack Message').item.json.actionItems }}",
            "Meeting Title": "={{ $('10. Code \u2014 Build Slack Message').item.json.meetingTitle }}",
            "Recording URL": "={{ $('7. Code \u2014 Format Transcript').item.json.recordingUrl }}",
            "Slack Channel": "={{ $('10. Code \u2014 Build Slack Message').item.json.slackChannel }}",
            "Duration (min)": "={{ $('10. Code \u2014 Build Slack Message').item.json.totalMinutes }}",
            "Slack Message TS": "={{ $json.ts }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Meeting Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "connections": {
    "3. Wait \u2014 90 Seconds": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Transcript Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. Wait \u2014 30 Seconds Retry": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Transcript Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7. Code \u2014 Format Transcript": {
      "main": [
        [
          {
            "node": "8. AI Agent \u2014 Extract Meeting Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "11. Slack \u2014 Post Action Items": {
      "main": [
        [
          {
            "node": "12. Google Sheets \u2014 Log Meeting Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9. OpenAI \u2014 GPT-4o-mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "8. AI Agent \u2014 Extract Meeting Summary",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "10. Code \u2014 Build Slack Message": {
      "main": [
        [
          {
            "node": "11. Slack \u2014 Post Action Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Meeting URL + Details": {
      "main": [
        [
          {
            "node": "2. WayinVideo \u2014 Submit Transcription",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. IF \u2014 Transcription Complete?": {
      "main": [
        [
          {
            "node": "7. Code \u2014 Format Transcript",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6. Wait \u2014 30 Seconds Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. WayinVideo \u2014 Submit Transcription": {
      "main": [
        [
          {
            "node": "3. Wait \u2014 90 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8. AI Agent \u2014 Extract Meeting Summary": {
      "main": [
        [
          {
            "node": "10. Code \u2014 Build Slack Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. WayinVideo \u2014 Get Transcript Results": {
      "main": [
        [
          {
            "node": "5. IF \u2014 Transcription Complete?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

Paste any Zoom, Google Meet, or Teams recording URL into a simple form along with the meeting title, team name, date, and Slack channel and the workflow handles everything automatically. WayinVideo transcribes the full meeting with speaker labels and timestamps, then GPT-4o-mini…

Source: https://n8n.io/workflows/15382/ — 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 automates athlete performance monitoring through two parallel pipelines: real-time session analysis triggered by training form submissions, and scheduled weekly performance summaries. De

Form Trigger, Google Sheets, Agent +4
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Form Trigger, HTTP Request, Agent +6
AI & RAG

Whether you’re a product manager, developer, or simply curious about workflow automation, you’re in the right place. This n8n workflow is designed to help you streamline and automate your social media

Output Parser Structured, OpenAI Chat, LinkedIn +8
AI & RAG

Door-to-door HVAC companies seeking automated lead capture and appointment scheduling.

Form Trigger, Google Sheets, Agent +7
AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7