AutomationFlowsAI & RAG › Turn Video Recordings Into Twitter (x) Threads with Wayinvideo, Gpt-4o-mini…

Turn Video Recordings Into Twitter (x) Threads with Wayinvideo, Gpt-4o-mini…

Original n8n title: Turn Video Recordings Into Twitter (x) Threads with Wayinvideo, Gpt-4o-mini and Google Sheets

ByIncrementors @incrementors on n8n.io

Paste any YouTube, podcast, or Zoom URL into a simple form along with your video title, niche, and target audience and the workflow handles the rest. WayinVideo transcribes the full video with speaker labels and timestamps, then GPT-4o-mini writes exactly 10 tweets — a hook,…

Event trigger★★★★☆ complexityAI-powered21 nodesForm TriggerHTTP RequestAgentOpenAI ChatGoogle SheetsTwitter
AI & RAG Trigger: Event Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #15356 — 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": "499399d2-74f8-4e44-b0ab-82bc8840bdb9",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5264,
        -496
      ],
      "parameters": {
        "color": 4,
        "width": 508,
        "height": 1124,
        "content": "## YouTube Video to Twitter/X Thread Auto-Generator \u2014 WayinVideo + GPT-4o-mini + Sheets + Twitter\n\nFor content creators, marketers, and thought leaders who want to repurpose long-form video content into Twitter/X threads without watching or manually summarizing the video. Paste any YouTube, podcast, or Zoom URL via the form. WayinVideo transcribes the full video with speaker labels and timestamps. GPT-4o-mini reads the transcript and writes exactly 10 tweets \u2014 a hook tweet, 8 content tweets each under 270 characters, and a CTA tweet. Every tweet is saved individually to Google Sheets with a shared thread ID. If you set Auto Post to Yes in the form, each tweet is posted directly to Twitter/X in sequence and the Sheet row is updated with the live tweet ID and Posted status.\n\n## How it works\n- **1. Form \u2014 Video URL + Details** collects the video URL, title, niche, target audience, and auto-post preference\n- **2. WayinVideo \u2014 Submit Transcription** submits the URL for speaker-labeled transcription\n- **3. Wait \u2014 60 Seconds** gives the API initial processing time\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 45-second wait\n- **7. Code \u2014 Format Transcript** formats each segment as speaker label with timestamp and builds the GPT input\n- **8. AI Agent \u2014 Write Twitter Thread** uses GPT-4o-mini with 10 strict Twitter rules to write exactly 10 labeled tweets\n- **10. Code \u2014 Parse Tweets** extracts each TWEET 1 through TWEET 10 via regex and returns one item per tweet\n- **11. Google Sheets \u2014 Save Thread Draft** appends 10 rows with tweet text, character count, thread ID, and Draft status\n- **12. IF \u2014 Auto Post Enabled?** checks if the user set Auto Post to Yes\n- **13. Twitter/X \u2014 Post Tweet** posts each tweet to Twitter/X using the connected OAuth2 credential\n- **14. Google Sheets \u2014 Update Status to Posted** updates each row with the live tweet ID and Posted status\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 with your key from wayin.ai\n2. In **9. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **11. Google Sheets \u2014 Save Thread Draft** and **14. Google Sheets \u2014 Update Status to Posted** \u2014 connect your Google Sheets OAuth2 credential and replace YOUR_GOOGLE_SHEET_ID\n4. In **13. Twitter/X \u2014 Post Tweet** \u2014 connect your Twitter OAuth2 credential with tweet.write scope\n5. Create a Google Sheet tab named Twitter Threads with columns: Video Title, Video URL, Thread ID, Tweet Number, Tweet Text, Character Count, Generated On, Status"
      },
      "typeVersion": 1
    },
    {
      "id": "bc7188cf-0df1-4208-8a7f-c1cf51b369f6",
      "name": "Section \u2014 Form Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4720,
        -224
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 436,
        "content": "## Form Input\nUser submits video URL, title, niche, target audience, and whether to auto-post to Twitter/X or save as draft only."
      },
      "typeVersion": 1
    },
    {
      "id": "58971942-dbbf-4b11-82a5-ba8ce355c25d",
      "name": "Section \u2014 Transcription Submit and Poll",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4432,
        -240
      ],
      "parameters": {
        "color": 6,
        "width": 676,
        "height": 484,
        "content": "## WayinVideo Transcription Submit and Poll\nSubmits the video URL for speaker-labeled transcription. Waits 60 seconds for initial processing. Polls the results endpoint until status equals SUCCEEDED."
      },
      "typeVersion": 1
    },
    {
      "id": "8ef8845d-35a0-4e56-945d-8df531d6e9f5",
      "name": "Section \u2014 Status Check and Retry Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3712,
        -384
      ],
      "parameters": {
        "color": 6,
        "width": 292,
        "height": 820,
        "content": "## Transcription Status Check and Retry Loop\nIF checks for SUCCEEDED status. TRUE proceeds to transcript formatting. FALSE waits 45 seconds and polls again. Loop continues until ready."
      },
      "typeVersion": 1
    },
    {
      "id": "85930a13-3b6d-4652-80d2-a2106ec4ab8b",
      "name": "Section \u2014 Transcript Formatting and AI Thread Writing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3376,
        -272
      ],
      "parameters": {
        "color": 6,
        "width": 468,
        "height": 532,
        "content": "## Transcript Formatting and AI Thread Writing\nFormats each segment with speaker label and timestamp. GPT-4o-mini writes exactly 10 tweets using strict Twitter rules \u2014 hook, 8 insights each under 270 chars, and a CTA tweet."
      },
      "typeVersion": 1
    },
    {
      "id": "eced4495-ee6b-4fdc-a08c-4fc66dc6f0ed",
      "name": "Section \u2014 Tweet Parsing and Sheet Save",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2848,
        -224
      ],
      "parameters": {
        "color": 4,
        "width": 388,
        "height": 372,
        "content": "## Tweet Parsing and Sheet Save\nRegex extracts each tweet from labeled AI output and returns one item per tweet. Google Sheets logs 10 rows with thread ID, tweet number, character count, and Draft status."
      },
      "typeVersion": 1
    },
    {
      "id": "24abd023-5005-4714-82c2-379e48d0fa85",
      "name": "Section \u2014 Auto-Post to Twitter/X",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2368,
        -288
      ],
      "parameters": {
        "color": 4,
        "width": 756,
        "height": 452,
        "content": "## Auto-Post to Twitter/X\nIF Auto Post equals Yes, posts each tweet to Twitter/X using the connected OAuth2 credential. Google Sheets row is updated with the live tweet ID and Status changes from Draft to Posted."
      },
      "typeVersion": 1
    },
    {
      "id": "b1dc43ff-b017-4fef-bc54-b338cb148855",
      "name": "1. Form \u2014 Video URL + Details",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -4656,
        -64
      ],
      "parameters": {
        "options": {},
        "formTitle": "YouTube to Twitter/X Thread Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Video URL",
              "placeholder": "https://www.youtube.com/watch?v=xxxxxxx or Zoom/Vimeo/Podcast link",
              "requiredField": true
            },
            {
              "fieldLabel": "Video Title",
              "placeholder": "e.g. How to Build a $10K/Month Business Using AI Tools",
              "requiredField": true
            },
            {
              "fieldLabel": "Your Niche / Topic",
              "placeholder": "e.g. Entrepreneurship, AI Tools, Marketing, Productivity",
              "requiredField": true
            },
            {
              "fieldLabel": "Target Audience",
              "placeholder": "e.g. Startup founders, freelancers, digital marketers",
              "requiredField": true
            },
            {
              "fieldLabel": "Auto Post to Twitter/X?",
              "placeholder": "Yes or No",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Paste any YouTube or video URL. AI will transcribe the full content and write a viral Twitter/X thread ready to post."
      },
      "typeVersion": 2.2
    },
    {
      "id": "b0e4e656-f24e-4d78-9e53-b2892d26f76e",
      "name": "2. WayinVideo \u2014 Submit Transcription",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -4368,
        -64
      ],
      "parameters": {
        "url": "https://wayinvideo-api.wayin.ai/api/v2/transcripts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"video_url\": \"{{ $json['Video 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": "e943f3a5-5135-4cb6-9b0f-ef04463b7c7b",
      "name": "3. Wait \u2014 60 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        -4128,
        -64
      ],
      "parameters": {
        "amount": 60
      },
      "typeVersion": 1.1
    },
    {
      "id": "0289ebe3-2288-4881-9cb1-803e8bbef180",
      "name": "4. WayinVideo \u2014 Get Transcript Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -3888,
        -64
      ],
      "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": "542ffc06-e601-43e3-980f-0c2697afde60",
      "name": "5. IF \u2014 Transcription Complete?",
      "type": "n8n-nodes-base.if",
      "position": [
        -3648,
        -64
      ],
      "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": "93f54cf4-af25-461d-9638-a67c43f54c8d",
      "name": "6. Wait \u2014 45 Seconds Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        -3632,
        176
      ],
      "parameters": {
        "amount": 45
      },
      "typeVersion": 1.1
    },
    {
      "id": "719486d1-979a-4d37-ba94-9ebd034758e3",
      "name": "7. Code \u2014 Format Transcript",
      "type": "n8n-nodes-base.code",
      "position": [
        -3344,
        -80
      ],
      "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 video URL is valid and publicly accessible.');\n}\n\n// Format transcript \u2014 clean and readable for GPT\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// Total duration\nconst lastSegment = segments[segments.length - 1];\nconst totalDurationMs = lastSegment?.end || 0;\nconst totalMinutes = Math.round(totalDurationMs / 60000);\n\n// Word count\nconst wordCount = segments.map(s => s.text).join(' ').split(/\\s+/).length;\n\n// Unique speakers\nconst speakers = [...new Set(segments.map(s => s.speaker))];\n\nreturn [{\n  json: {\n    formattedTranscript,\n    wordCount,\n    totalMinutes,\n    speakerCount: speakers.length,\n    speakers: speakers.join(', '),\n    videoTitle: $('1. Form \u2014 Video URL + Details').item.json['Video Title'],\n    videoUrl: $('1. Form \u2014 Video URL + Details').item.json['Video URL'],\n    niche: $('1. Form \u2014 Video URL + Details').item.json['Your Niche / Topic'],\n    targetAudience: $('1. Form \u2014 Video URL + Details').item.json['Target Audience'],\n    autoPost: $('1. Form \u2014 Video URL + Details').item.json['Auto Post to Twitter/X?']\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "0aa9d859-ddc0-42de-abc7-fd5f8367d1ad",
      "name": "8. AI Agent \u2014 Write Twitter Thread",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -3152,
        -80
      ],
      "parameters": {
        "text": "={{ $json.formattedTranscript }}",
        "options": {
          "systemMessage": "=You are an expert Twitter/X content writer who specializes in writing viral threads from video transcripts.\n\nYour job is to read the video transcript below and write a high-engagement Twitter/X thread that makes people stop scrolling, read every tweet, and retweet.\n\n---\n\n## VIDEO DETAILS\n- Video Title: {{ $json.videoTitle }}\n- Niche / Topic: {{ $json.niche }}\n- Target Audience: {{ $json.targetAudience }}\n- Video Duration: {{ $json.totalMinutes }} minutes\n- Speakers: {{ $json.speakers }}\n\n---\n\n## TWITTER THREAD RULES\n1. Write EXACTLY 10 tweets \u2014 no more, no less\n2. Every tweet MUST be under 270 characters (leave room for thread numbering)\n3. Tweet 1 = The HOOK \u2014 make it a bold claim, a surprising stat, or a question that creates curiosity. Do NOT start with 'I'. Start with the insight.\n4. Tweets 2\u20139 = The CONTENT \u2014 one key insight per tweet. Each tweet must stand alone and make sense without reading the others.\n5. Tweet 10 = The CTA \u2014 tell people to like, retweet, follow, or reply with their opinion\n6. Use line breaks inside tweets for readability \u2014 short punchy lines work better than long sentences\n7. Use numbers, bullets, or emojis sparingly \u2014 only where they genuinely add value\n8. Write ONLY from what is in the transcript \u2014 no invented facts\n9. Sound like a real person sharing what they learned \u2014 not a robot summarizing\n10. Each tweet must create a reason to read the next one\n\n---\n\n## OUTPUT FORMAT\nReturn ONLY the 10 tweets in this exact format \u2014 nothing else before or after:\n\nTWEET 1:\n[Hook tweet text here]\n\nTWEET 2:\n[Content tweet text here]\n\nTWEET 3:\n[Content tweet text here]\n\nTWEET 4:\n[Content tweet text here]\n\nTWEET 5:\n[Content tweet text here]\n\nTWEET 6:\n[Content tweet text here]\n\nTWEET 7:\n[Content tweet text here]\n\nTWEET 8:\n[Content tweet text here]\n\nTWEET 9:\n[Content tweet text here]\n\nTWEET 10:\n[CTA tweet text here]\n\n---\n\nNow read the transcript and write the 10-tweet thread:"
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "454fcf71-b86f-4402-b36b-0f7df272153c",
      "name": "9. OpenAI \u2014 GPT-4o-mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -3152,
        112
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "55b466f5-8df0-4c79-9f7a-71b4c856b5e0",
      "name": "10. Code \u2014 Parse Tweets",
      "type": "n8n-nodes-base.code",
      "position": [
        -2800,
        -80
      ],
      "parameters": {
        "jsCode": "// Parse AI output \u2014 extract each tweet individually\nconst output = $input.first().json.output || '';\nconst videoTitle = $('7. Code \u2014 Format Transcript').item.json.videoTitle;\nconst videoUrl = $('7. Code \u2014 Format Transcript').item.json.videoUrl;\nconst autoPost = $('7. Code \u2014 Format Transcript').item.json.autoPost;\n\n// Generate a unique thread ID for grouping\nconst threadId = 'thread_' + Date.now();\n\n// Extract all 10 tweets\nconst tweets = [];\nfor (let i = 1; i <= 10; i++) {\n  const regex = new RegExp(`TWEET ${i}:\\s*([\\\\s\\\\S]*?)(?=TWEET ${i + 1}:|$)`);\n  const match = output.match(regex);\n  if (match) {\n    const tweetText = match[1].trim();\n    tweets.push({\n      json: {\n        tweetNumber: i,\n        tweetText: tweetText,\n        charCount: tweetText.length,\n        videoTitle: videoTitle,\n        videoUrl: videoUrl,\n        threadId: threadId,\n        autoPost: autoPost,\n        generatedOn: new Date().toISOString(),\n        status: 'Draft'\n      }\n    });\n  }\n}\n\nif (tweets.length === 0) {\n  throw new Error('Could not parse tweets from AI output. Check the AI prompt output format.');\n}\n\nreturn tweets;"
      },
      "typeVersion": 2
    },
    {
      "id": "756a7b8b-2878-4112-ad2b-7abcc6588eb0",
      "name": "11. Google Sheets \u2014 Save Thread Draft",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2624,
        -80
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Draft",
            "Thread ID": "={{ $json.threadId }}",
            "Video URL": "={{ $json.videoUrl }}",
            "Tweet Text": "={{ $json.tweetText }}",
            "Video Title": "={{ $json.videoTitle }}",
            "Generated On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
            "Tweet Number": "={{ $json.tweetNumber }}",
            "Character Count": "={{ $json.charCount }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Twitter Threads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "6d96e863-d1fc-4c8e-9916-43f8d2fd57ad",
      "name": "12. IF \u2014 Auto Post Enabled?",
      "type": "n8n-nodes-base.if",
      "position": [
        -2320,
        -80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "auto-post-check",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('10. Code \u2014 Parse Tweets').item.json.autoPost }}",
              "rightValue": "Yes"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b3fb206f-b54f-493a-a73d-b7cca1bcdb94",
      "name": "13. Twitter/X \u2014 Post Tweet",
      "type": "n8n-nodes-base.twitter",
      "position": [
        -2064,
        -96
      ],
      "parameters": {
        "text": "={{ $('10. Code \u2014 Parse Tweets').item.json.tweetText }}",
        "additionalFields": {}
      },
      "typeVersion": 2
    },
    {
      "id": "33bb56c0-bd4e-4781-b930-ca976a6b9cab",
      "name": "14. Google Sheets \u2014 Update Status to Posted",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1824,
        -96
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Posted",
            "Tweet ID": "={{ $json.id }}",
            "Thread ID": "={{ $('10. Code \u2014 Parse Tweets').item.json.threadId }}",
            "Tweet Number": "={{ $('10. Code \u2014 Parse Tweets').item.json.tweetNumber }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Thread ID",
            "Tweet Number"
          ]
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Twitter Threads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "connections": {
    "3. Wait \u2014 60 Seconds": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Transcript Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "10. Code \u2014 Parse Tweets": {
      "main": [
        [
          {
            "node": "11. Google Sheets \u2014 Save Thread Draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13. Twitter/X \u2014 Post Tweet": {
      "main": [
        [
          {
            "node": "14. Google Sheets \u2014 Update Status to Posted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. Wait \u2014 45 Seconds Retry": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Transcript Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "12. IF \u2014 Auto Post Enabled?": {
      "main": [
        [
          {
            "node": "13. Twitter/X \u2014 Post Tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7. Code \u2014 Format Transcript": {
      "main": [
        [
          {
            "node": "8. AI Agent \u2014 Write Twitter Thread",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Video URL + Details": {
      "main": [
        [
          {
            "node": "2. WayinVideo \u2014 Submit Transcription",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9. OpenAI \u2014 GPT-4o-mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "8. AI Agent \u2014 Write Twitter Thread",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "5. IF \u2014 Transcription Complete?": {
      "main": [
        [
          {
            "node": "7. Code \u2014 Format Transcript",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6. Wait \u2014 45 Seconds Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8. AI Agent \u2014 Write Twitter Thread": {
      "main": [
        [
          {
            "node": "10. Code \u2014 Parse Tweets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. WayinVideo \u2014 Submit Transcription": {
      "main": [
        [
          {
            "node": "3. Wait \u2014 60 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "11. Google Sheets \u2014 Save Thread Draft": {
      "main": [
        [
          {
            "node": "12. IF \u2014 Auto Post Enabled?",
            "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 YouTube, podcast, or Zoom URL into a simple form along with your video title, niche, and target audience and the workflow handles the rest. WayinVideo transcribes the full video with speaker labels and timestamps, then GPT-4o-mini writes exactly 10 tweets — a hook,…

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

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

A comprehensive n8n automation that fetches the latest news based on keywords, generates AI-powered social media content, and automatically publishes to X (Twitter) with complete tracking and notifica

Form Trigger, Agent, OpenAI Chat +4
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

This workflow is designed for marketers, content creators, agencies, and solo founders who want to publish long‑form posts with visuals on autopilot using n8n and AI agents. ​

Tool Http Request, Agent, HTTP Request +27