AutomationFlowsAI & RAG › Generate Podcast Show Notes and Timestamps with Wayinvideo and Gpt-4o-mini

Generate Podcast Show Notes and Timestamps with Wayinvideo and Gpt-4o-mini

ByisaWOW @isawow on n8n.io

Submit any podcast episode recording URL along with the episode number, podcast name, host name, episode topic, niche, and CTA link — and optionally a guest name and title if it is an interview episode — and the workflow transcribes and analyzes the full episode automatically.…

Event trigger★★★★☆ complexityAI-powered17 nodesForm TriggerHTTP RequestAgentOpenAI ChatGoogle Sheets
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #15732 — 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": "36640a8c-ec1b-44df-b1d1-00170ae4b61e",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -848,
        -288
      ],
      "parameters": {
        "color": 4,
        "width": 572,
        "height": 1028,
        "content": "## Podcast Episode to Complete Show Notes Generator \u2014 WayinVideo Transcription + GPT-4o-mini + Google Sheets\n\nFor podcast producers, solo hosts, and content teams who publish regularly and spend 30\u201360 minutes per episode writing show notes manually. Submit any podcast episode recording URL via the form. WayinVideo Transcription API transcribes the full episode with speaker labels and timestamps. A Code node formats the transcript with MM:SS speaker segments, computes duration, and sets an isInterviewEpisode flag based on whether a guest name was provided. GPT-4o-mini reads the full transcript and generates 8 labeled sections: episode title, SEO description (150\u2013200 words), key takeaways (5\u20138 bullets), resources mentioned, timestamped highlights (6\u20138 moments), guest bio (or solo note), CTA block, and a compiled FULL_SHOW_NOTES section ready to paste directly into Spotify for Podcasters, Apple Podcasts, or a website episode page. A Code node parses all 8 sections and computes word count. Google Sheets appends 19 columns with Status set to Draft.\n\n## How it works\n- **1. Form \u2014 Episode Recording + Details** collects the recording URL, episode number, podcast name, host name, optional guest name and title, episode topic, niche, and CTA link (9 fields \u2014 guest fields are optional)\n- **2. WayinVideo \u2014 Submit Transcription** submits the URL to the Transcription API\n- **3. Wait \u2014 90 Seconds** gives the API initial processing time\n- **4. WayinVideo \u2014 Get Transcript Results** polls the transcripts results endpoint\n- **5. IF \u2014 Transcription Complete?** checks for SUCCEEDED \u2014 if not, retries via 30-second wait\n- **7. Code \u2014 Format Transcript** formats segments with speaker labels and timestamps, computes MM:SS duration, sets isInterviewEpisode flag\n- **8. AI Agent \u2014 Write Show Notes** uses GPT-4o-mini with 8 labeled output sections \u2014 AI prompt adapts for interview vs solo episode format\n- **9. OpenAI \u2014 GPT-4o-mini Model** language model attached to the AI Agent\n- **10. Code \u2014 Parse Show Notes Output** extracts all 8 sections via regex and validates required fields\n- **11. Google Sheets \u2014 Save Show Notes Library** appends 19 columns with Status set to Draft\n\n## Set up steps\n1. In **2** and **4** \u2014 replace `YOUR_WAYINVIDEO_API_KEY`\n2. In **9. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **11. Google Sheets \u2014 Save Show Notes Library** \u2014 connect your Google Sheets OAuth2 credential and replace `YOUR_GOOGLE_SHEET_ID`\n4. Create a Google Sheet tab named Show Notes Library with columns: Episode Number, Episode Title, Podcast Name, Host, Guest, Topic, Duration, Recording URL, SEO Description, Key Takeaways, Resources Mentioned, Timestamped Highlights, Guest Bio, CTA Block, Full Show Notes, Word Count, CTA Link, Generated On, Status"
      },
      "typeVersion": 1
    },
    {
      "id": "7089277c-3fc2-4cfd-ab09-4262c27b5d20",
      "name": "Section \u2014 Form Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 328,
        "height": 532,
        "content": "## Form Input\nHost submits episode recording URL, episode number, podcast name, host name, optional guest name and title, episode topic, podcast niche, and CTA link. Guest fields are optional \u2014 the workflow adapts for interview vs solo episodes."
      },
      "typeVersion": 1
    },
    {
      "id": "183545f4-176d-4a81-a48a-7efb988cd4d3",
      "name": "Section \u2014 WayinVideo Transcription Submit and Poll",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        0
      ],
      "parameters": {
        "color": 6,
        "width": 692,
        "height": 308,
        "content": "## WayinVideo Transcription Submit and Poll\nSubmits the episode recording URL to the Transcription API. Waits 90 seconds for initial processing. Polls the results endpoint until status equals SUCCEEDED."
      },
      "typeVersion": 1
    },
    {
      "id": "99238ef2-983a-453b-988c-0accee34c459",
      "name": "Section \u2014 Transcription Status Check and Retry Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        -144
      ],
      "parameters": {
        "color": 6,
        "width": 276,
        "height": 692,
        "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 transcript is ready."
      },
      "typeVersion": 1
    },
    {
      "id": "51209ba1-a7c4-45a8-a55c-7871bf5ed078",
      "name": "Section \u2014 Transcript Formatting and AI Show Notes Writing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        -80
      ],
      "parameters": {
        "color": 6,
        "width": 468,
        "height": 548,
        "content": "## Transcript Formatting and AI Show Notes Writing\nFormats segments with speaker labels and MM:SS timestamps. Computes duration and sets isInterviewEpisode flag. GPT-4o-mini writes 8 labeled sections adapting for interview vs solo format."
      },
      "typeVersion": 1
    },
    {
      "id": "01daf78b-301d-4480-8982-b2982d4ac14d",
      "name": "Section \u2014 Show Notes Parse and Google Sheets Save",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1744,
        -64
      ],
      "parameters": {
        "color": 4,
        "width": 548,
        "height": 356,
        "content": "## Show Notes Parse and Google Sheets Save\nRegex extracts all 8 labeled sections. Validates required fields. Appends 19 columns to Google Sheets with Status set to Draft \u2014 ready to paste into Spotify, Apple Podcasts, or a website."
      },
      "typeVersion": 1
    },
    {
      "id": "c9fb0e1b-7015-4d0b-bef4-422e072674c9",
      "name": "1. Form \u2014 Episode Recording + Details",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -96,
        96
      ],
      "parameters": {
        "options": {},
        "formTitle": "Podcast Show Notes Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Episode Recording URL",
              "placeholder": "https://zoom.us/rec/xxxxxxx or YouTube/Loom/Vimeo link",
              "requiredField": true
            },
            {
              "fieldLabel": "Episode Number",
              "placeholder": "e.g. 47",
              "requiredField": true
            },
            {
              "fieldLabel": "Podcast Name",
              "placeholder": "e.g. The Marketing Playbook, Built Different, Founder Stories",
              "requiredField": true
            },
            {
              "fieldLabel": "Host Name",
              "placeholder": "e.g. John Smith",
              "requiredField": true
            },
            {
              "fieldLabel": "Guest Name",
              "placeholder": "e.g. Sarah Johnson \u2014 leave blank for solo episodes"
            },
            {
              "fieldLabel": "Guest Title / Company",
              "placeholder": "e.g. CEO of Acme Corp \u2014 leave blank for solo episodes"
            },
            {
              "fieldLabel": "Episode Main Topic",
              "placeholder": "e.g. How to scale a SaaS from $0 to $1M ARR",
              "requiredField": true
            },
            {
              "fieldLabel": "Podcast Niche",
              "placeholder": "e.g. Entrepreneurship, Marketing, Personal Development, Tech",
              "requiredField": true
            },
            {
              "fieldLabel": "CTA / Subscribe Link",
              "placeholder": "e.g. https://yourpodcast.com or Spotify/Apple link",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Paste your podcast episode recording URL. AI will transcribe the full episode and generate complete show notes \u2014 SEO description, key takeaways, resources, timestamps, guest bio, and CTA \u2014 all ready to publish."
      },
      "typeVersion": 2.2
    },
    {
      "id": "fd972c27-6038-4667-a4f5-e7c5e988388c",
      "name": "2. WayinVideo \u2014 Submit Transcription",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        240,
        96
      ],
      "parameters": {
        "url": "https://wayinvideo-api.wayin.ai/api/v2/transcripts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"video_url\": \"{{ $json['Episode 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": "7b950e50-d2fb-4742-9fed-fe0686bcfb09",
      "name": "3. Wait \u2014 90 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        480,
        96
      ],
      "parameters": {
        "amount": 90
      },
      "typeVersion": 1.1
    },
    {
      "id": "2039f0d7-a571-407d-b9c5-d6a635a68db9",
      "name": "4. WayinVideo \u2014 Get Transcript Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        720,
        96
      ],
      "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"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "a152e912-5630-4e49-95e0-a8f8cd1fead0",
      "name": "5. IF \u2014 Transcription Complete?",
      "type": "n8n-nodes-base.if",
      "position": [
        960,
        96
      ],
      "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": "f799dd41-8e64-4aff-9ca8-acdad2bdfebf",
      "name": "6. Wait \u2014 30 Seconds Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        960,
        304
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "a1d9163b-2efc-426a-89f8-a5dd3d9cbae2",
      "name": "7. Code \u2014 Format Transcript",
      "type": "n8n-nodes-base.code",
      "position": [
        1248,
        80
      ],
      "parameters": {
        "jsCode": "// Format transcript with speaker labels and timestamps\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 recording URL is valid and publicly accessible.');\n}\n\n// Format with speaker labels and timestamps\nconst formattedTranscript = segments\n  .map(s => {\n    const ms = Math.floor(s.start / 1000);\n    const mm = Math.floor(ms / 60);\n    const ss = ms % 60;\n    return `[${s.speaker} | ${mm}:${ss.toString().padStart(2, '0')}] ${s.text.trim()}`;\n  })\n  .join('\\n');\n\n// Duration\nconst lastSegment = segments[segments.length - 1];\nconst totalMs = lastSegment?.end || 0;\nconst totalMinutes = Math.floor(totalMs / 60000);\nconst totalSeconds = Math.floor((totalMs % 60000) / 1000);\nconst durationFormatted = `${totalMinutes}:${totalSeconds.toString().padStart(2, '0')}`;\n\n// Speakers\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\n// Form data\nconst episodeNumber = $('1. Form \u2014 Episode Recording + Details').item.json['Episode Number'];\nconst podcastName = $('1. Form \u2014 Episode Recording + Details').item.json['Podcast Name'];\nconst hostName = $('1. Form \u2014 Episode Recording + Details').item.json['Host Name'];\nconst guestName = $('1. Form \u2014 Episode Recording + Details').item.json['Guest Name'] || '';\nconst guestTitle = $('1. Form \u2014 Episode Recording + Details').item.json['Guest Title / Company'] || '';\nconst episodeTopic = $('1. Form \u2014 Episode Recording + Details').item.json['Episode Main Topic'];\nconst podcastNiche = $('1. Form \u2014 Episode Recording + Details').item.json['Podcast Niche'];\nconst ctaLink = $('1. Form \u2014 Episode Recording + Details').item.json['CTA / Subscribe Link'];\nconst recordingUrl = $('1. Form \u2014 Episode Recording + Details').item.json['Episode Recording URL'];\n\nconst isInterviewEpisode = guestName.trim().length > 0;\n\nreturn [{\n  json: {\n    formattedTranscript,\n    durationFormatted,\n    totalMinutes,\n    wordCount,\n    speakerCount: speakers.length,\n    speakers: speakers.join(', '),\n    episodeNumber,\n    podcastName,\n    hostName,\n    guestName,\n    guestTitle,\n    episodeTopic,\n    podcastNiche,\n    ctaLink,\n    recordingUrl,\n    isInterviewEpisode\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "205b7ec4-a9d6-4eea-be08-1e7f9edd57ef",
      "name": "8. AI Agent \u2014 Write Show Notes",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1440,
        80
      ],
      "parameters": {
        "text": "={{ $json.formattedTranscript }}",
        "options": {
          "systemMessage": "=You are an expert podcast producer and content writer who specializes in writing complete, high-quality show notes that help episodes rank on Spotify, Apple Podcasts, and Google.\n\nRead this podcast episode transcript and write a complete show notes package \u2014 based ONLY on what was actually discussed in the episode.\n\n---\n\n## EPISODE DETAILS\n- Podcast: {{ $json.podcastName }}\n- Episode: #{{ $json.episodeNumber }}\n- Host: {{ $json.hostName }}\n{{ $json.isInterviewEpisode === 'true' || $json.isInterviewEpisode === true ? '- Guest: ' + $json.guestName + ' (' + $json.guestTitle + ')' : '- Format: Solo Episode' }}\n- Topic: {{ $json.episodeTopic }}\n- Niche: {{ $json.podcastNiche }}\n- Duration: {{ $json.durationFormatted }}\n- Speakers detected: {{ $json.speakers }}\n- CTA Link: {{ $json.ctaLink }}\n\n---\n\n## SHOW NOTES WRITING RULES\n1. Write ONLY from the transcript \u2014 no invented content\n2. SEO description must include the main topic keyword in first sentence\n3. Key takeaways must be specific and actionable \u2014 not vague\n4. Resources must only include things explicitly mentioned in the transcript\n5. Timestamped highlights: pick 6-8 most interesting moments \u2014 exact MM:SS from transcript\n6. Guest bio: write only if guest info appears in transcript \u2014 otherwise write 'Solo episode'\n7. CTA block: always end with subscribe + review prompt\n8. Full show notes must be ready to paste directly into Spotify for Podcasters or a website\n\n---\n\n## OUTPUT FORMAT\nReturn in this exact structure:\n\nEPISODE_TITLE:\n[Write a compelling SEO episode title \u2014 60-70 characters \u2014 include main keyword]\n\nSEO_DESCRIPTION:\n[150-200 word episode description for Spotify/Apple \u2014 keyword in first sentence \u2014 tells listener exactly what they will learn]\n\nKEY_TAKEAWAYS:\n- [Specific takeaway 1 from episode]\n- [Specific takeaway 2]\n- [Specific takeaway 3]\n- [Specific takeaway 4]\n- [Specific takeaway 5]\n[Minimum 5, maximum 8 takeaways]\n\nRESOURCES_MENTIONED:\n- [Resource 1: name or URL if mentioned verbally]\n- [Resource 2]\n[Write 'No resources mentioned in this episode' if none found]\n\nTIMESTAMPED_HIGHLIGHTS:\n[00:00] Introduction\n[MM:SS] [What was discussed at this moment]\n[MM:SS] [What was discussed]\n[Continue for 6-8 key moments \u2014 use exact timestamps from transcript]\n\nGUEST_BIO:\n[2-3 sentence guest bio based only on what was said in the episode \u2014 or 'Solo episode \u2014 no guest' if no guest]\n\nCTA_BLOCK:\n[3-4 line CTA block: subscribe + review prompt + link \u2014 warm and conversational tone]\n\nFULL_SHOW_NOTES:\n[Compile all sections above into one complete show notes block \u2014 formatted for copy-paste into Spotify or a website episode page \u2014 include all sections in clean readable format]"
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "4d9cfbf2-c35c-464d-9359-bd0f58ffe5f5",
      "name": "9. OpenAI \u2014 GPT-4o-mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1440,
        288
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "536fd143-abc4-4da5-a0a8-3660f4ebbcc5",
      "name": "10. Code \u2014 Parse Show Notes Output",
      "type": "n8n-nodes-base.code",
      "position": [
        1808,
        80
      ],
      "parameters": {
        "jsCode": "// Parse AI show notes output\nconst output = $input.first().json.output || '';\n\n// Extract all sections\nconst episodeTitleMatch = output.match(/EPISODE_TITLE:\\s*([\\s\\S]*?)(?=\\nSEO_DESCRIPTION:|$)/);\nconst seoDescMatch = output.match(/SEO_DESCRIPTION:\\s*([\\s\\S]*?)(?=\\nKEY_TAKEAWAYS:|$)/);\nconst takeawaysMatch = output.match(/KEY_TAKEAWAYS:\\s*([\\s\\S]*?)(?=\\nRESOURCES_MENTIONED:|$)/);\nconst resourcesMatch = output.match(/RESOURCES_MENTIONED:\\s*([\\s\\S]*?)(?=\\nTIMESTAMPED_HIGHLIGHTS:|$)/);\nconst timestampsMatch = output.match(/TIMESTAMPED_HIGHLIGHTS:\\s*([\\s\\S]*?)(?=\\nGUEST_BIO:|$)/);\nconst guestBioMatch = output.match(/GUEST_BIO:\\s*([\\s\\S]*?)(?=\\nCTA_BLOCK:|$)/);\nconst ctaMatch = output.match(/CTA_BLOCK:\\s*([\\s\\S]*?)(?=\\nFULL_SHOW_NOTES:|$)/);\nconst fullNotesMatch = output.match(/FULL_SHOW_NOTES:\\s*([\\s\\S]*)$/);\n\nconst episodeTitle = episodeTitleMatch ? episodeTitleMatch[1].trim() : '';\nconst seoDescription = seoDescMatch ? seoDescMatch[1].trim() : '';\nconst keyTakeaways = takeawaysMatch ? takeawaysMatch[1].trim() : '';\nconst resourcesMentioned = resourcesMatch ? resourcesMatch[1].trim() : 'No resources mentioned in this episode';\nconst timestampedHighlights = timestampsMatch ? timestampsMatch[1].trim() : '';\nconst guestBio = guestBioMatch ? guestBioMatch[1].trim() : 'Solo episode \u2014 no guest';\nconst ctaBlock = ctaMatch ? ctaMatch[1].trim() : '';\nconst fullShowNotes = fullNotesMatch ? fullNotesMatch[1].trim() : '';\n\nif (!episodeTitle || !seoDescription || !fullShowNotes) {\n  throw new Error('Could not parse show notes from AI output. Check the AI prompt format.');\n}\n\nconst wordCount = fullShowNotes.split(/\\s+/).filter(w => w.length > 0).length;\n\n// Get episode data\nconst epData = $('7. Code \u2014 Format Transcript').item.json;\n\nreturn [{\n  json: {\n    episodeTitle,\n    seoDescription,\n    keyTakeaways,\n    resourcesMentioned,\n    timestampedHighlights,\n    guestBio,\n    ctaBlock,\n    fullShowNotes,\n    wordCount,\n    episodeNumber: epData.episodeNumber,\n    podcastName: epData.podcastName,\n    hostName: epData.hostName,\n    guestName: epData.guestName,\n    episodeTopic: epData.episodeTopic,\n    durationFormatted: epData.durationFormatted,\n    recordingUrl: epData.recordingUrl,\n    ctaLink: epData.ctaLink\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "45c354bd-ea13-49b2-acb9-9c1705467313",
      "name": "11. Google Sheets \u2014 Save Show Notes Library",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2048,
        80
      ],
      "parameters": {
        "columns": {
          "value": {
            "Host": "={{ $json.hostName }}",
            "Guest": "={{ $json.guestName }}",
            "Topic": "={{ $json.episodeTopic }}",
            "Status": "Draft",
            "CTA Link": "={{ $json.ctaLink }}",
            "Duration": "={{ $json.durationFormatted }}",
            "CTA Block": "={{ $json.ctaBlock }}",
            "Guest Bio": "={{ $json.guestBio }}",
            "Word Count": "={{ $json.wordCount }}",
            "Generated On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
            "Podcast Name": "={{ $json.podcastName }}",
            "Episode Title": "={{ $json.episodeTitle }}",
            "Key Takeaways": "={{ $json.keyTakeaways }}",
            "Recording URL": "={{ $json.recordingUrl }}",
            "Episode Number": "={{ $json.episodeNumber }}",
            "Full Show Notes": "={{ $json.fullShowNotes }}",
            "SEO Description": "={{ $json.seoDescription }}",
            "Resources Mentioned": "={{ $json.resourcesMentioned }}",
            "Timestamped Highlights": "={{ $json.timestampedHighlights }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Show Notes Library"
        },
        "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 Write Show Notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9. OpenAI \u2014 GPT-4o-mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "8. AI Agent \u2014 Write Show Notes",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "8. AI Agent \u2014 Write Show Notes": {
      "main": [
        [
          {
            "node": "10. Code \u2014 Parse Show Notes Output",
            "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
          }
        ]
      ]
    },
    "10. Code \u2014 Parse Show Notes Output": {
      "main": [
        [
          {
            "node": "11. Google Sheets \u2014 Save Show Notes Library",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. WayinVideo \u2014 Submit Transcription": {
      "main": [
        [
          {
            "node": "3. Wait \u2014 90 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Episode Recording + Details": {
      "main": [
        [
          {
            "node": "2. WayinVideo \u2014 Submit Transcription",
            "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

Submit any podcast episode recording URL along with the episode number, podcast name, host name, episode topic, niche, and CTA link — and optionally a guest name and title if it is an interview episode — and the workflow transcribes and analyzes the full episode automatically.…

Source: https://n8n.io/workflows/15732/ — 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

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

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.

HTTP Request, N8N Nodes Firecrawl Scraper, Google Sheets +5
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10
AI & RAG

The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical

Google Sheets, Agent, OpenAI Chat +5
AI & RAG

This n8n workflow automates turning short user ideas into production-ready real-estate marketing assets (photorealistic images and optional 360° videos). A form submission seeds a prompt board → an LL

Form Trigger, Google Sheets, Agent +6