Back to Alchemy
Alchemy RecipeIntermediateworkflow

Build an Automated YouTube Channel with AI

Creating consistent YouTube content is time-consuming. Script writing, voiceover, visuals, and editing can take 20+ hours per video.

Saves 15-20 hrs/week ~$60/mo24 March 2026

Introduction

Running a YouTube channel is time consuming. You need video ideas, scripts, voiceovers, thumbnails, and then you have to upload, tag, and promote each video. Most creators do this manually, spending hours per week on repetitive work. Even with a content calendar, there is still plenty of friction between each step.

What if you could automate the entire pipeline? An idea enters your system, and days later a fully produced video sits on YouTube, ready for viewers. No manual handoffs. No copying and pasting between tools. Just a continuous workflow that turns raw concepts into published content.

This is exactly what we will build in this post. We will combine a handful of AI tools and an orchestration platform to create a self-running YouTube channel. You will own the entire system, control what gets published, and spend your time on strategy instead of production tasks.

The Automated Workflow

We will build this workflow using n8n, an open-source orchestration platform that gives you the most control and the lowest ongoing costs. However, Zapier and Make also work; I will note where they differ.

Here is the complete flow:

  1. Idea collection: A Google Form or RSS feed supplies video topics
  2. Script generation: Claude AI writes a full script based on the topic
  3. Voiceover creation: Eleven Labs converts the script into audio
  4. Video assembly: Synthesia or D-ID generates video footage to match the voiceover
  5. Thumbnail creation: DALL-E generates a thumbnail image
  6. YouTube upload: The finished video, metadata, and thumbnail upload to YouTube
  7. Social promotion: Links post to Twitter, LinkedIn, and email

Let me walk through each step with actual configuration details.

Step 1:

Trigger with Google Forms

We start by collecting video ideas. A Google Form feeds topics into our system. When someone submits the form, n8n receives a webhook notification.

First, deploy n8n locally or use the cloud version. Create a new workflow and add a webhook trigger node.


Webhook URL: https://your-n8n-instance.com/webhook/youtube-ideas
Method: POST

Connect your Google Form to Zapier or a simple webhook forwarder. When the form submits, it sends a JSON payload like this:

{
  "topic": "How to build an AI chatbot",
  "description": "A beginner's guide to chatbots",
  "length_preference": "10 minutes",
  "style": "educational"
}

In n8n, extract these fields using a "Set" node so later steps can reference them.

Step 2:

Generate Script with Claude

Now we have a topic. We need a full script. Use the Anthropic API to call Claude directly.

Add an HTTP Request node in n8n:


Method: POST
URL: https://api.anthropic.com/v1/messages
Authentication: Bearer YOUR_API_KEY
Body (JSON):
{
  "model": "claude-3-5-sonnet-20241022",
  "max_tokens": 2000,
  "messages": [
    {
      "role": "user",
      "content": "Write a {{ length_preference }} minute YouTube script about: {{ topic }}. Style: {{ style }}. Include natural pauses for visuals. Format as plain text, not a markdown list."
    }
  ]
}

The response will be a JSON object. Extract the text content:

{
  "content": [
    {
      "type": "text",
      "text": "Welcome to our channel. Today we're going to cover..."
    }
  ]
}

Use a JavaScript node to clean up the script and remove any unwanted formatting:

const script = $input.all()[0].json.content[0].text;
const cleanedScript = script
  .replace(/\*\*/g, "")
  .trim();
return { script: cleanedScript };

Step 3:

Generate Voiceover with Eleven Labs

Pass the script to Eleven Labs, which converts text to speech with natural sounding voices.

Add another HTTP Request node:


Method: POST
URL: https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM
Authentication: Bearer YOUR_ELEVEN_LABS_KEY
Headers:
  Content-Type: application/json
Body (JSON):
{
  "text": "{{ script }}",
  "model_id": "eleven_turbo_v2_5",
  "voice_settings": {
    "stability": 0.5,
    "similarity_boost": 0.75
  }
}

The voice ID 21m00Tcm4TlvDq8ikWAM is a professional male voice. You can list all available voices by calling the voices endpoint:


GET https://api.elevenlabs.io/v1/voices

Eleven Labs returns audio as binary data. Store it in a temporary location. Use a File Write node to save it locally or upload to S3:

const audioData = $input.all()[0].binary.data;
const filename = `voiceover_${Date.now()}.mp3`;
return { audio_file: filename, audio_binary: audioData };

Cost note: Eleven Labs charges per character. A 10-minute script is roughly 2000 characters, which costs about 0.24 USD at standard rates. Turbo v2.5 is cheaper and faster than earlier models.

Step 4:

Generate Video with Synthesia

Now we have audio. We need visuals. Synthesia generates video from text and audio, with AI avatars and automatic scene transitions.

Call the Synthesia API to create a new video:


Method: POST
URL: https://api.synthesia.io/v2/videos
Authentication: Bearer YOUR_SYNTHESIA_KEY
Headers:
  Content-Type: application/json
Body (JSON):
{
  "title": "{{ topic }}",
  "description": "{{ description }}",
  "visibility": "private",
  "script": {
    "type": "text",
    "input": "{{ script }}"
  },
  "output": {
    "format": "mp4",
    "resolution": "1080p"
  },
  "avatars": [
    {
      "avatar_id": "default_avatar_1",
      "offset_x": 0,
      "offset_y": 0
    }
  ]
}

Synthesia returns a video ID immediately. The video renders asynchronously. You must poll the status endpoint until rendering completes:


GET https://api.synthesia.io/v2/videos/{video_id}

In n8n, add a Loop node that checks every 30 seconds until the status field equals "COMPLETED":

const status = $input.all()[0].json.status;
if (status === "COMPLETED") {
  return { download_url: $input.all()[0].json.download_url };
}
throw new Error("Video still rendering. Retry.");

Once complete, download the video file and store it. This typically takes 2-5 minutes per video.

Step 5:

Generate Thumbnail with DALL-E

Whilst the video renders (it is asynchronous), generate a thumbnail in parallel. Use OpenAI's DALL-E API:


Method: POST
URL: https://api.openai.com/v1/images/generations
Authentication: Bearer YOUR_OPENAI_KEY
Body (JSON):
{
  "model": "dall-e-3",
  "prompt": "Create a YouTube thumbnail for a video about {{ topic }}. Include bold text with the main idea. Use bright, contrasting colours. 1280x720 pixels.",
  "n": 1,
  "size": "1792x1024",
  "quality": "standard"
}

DALL-E returns a URL to the generated image. Download and store it:

const imageUrl = $input.all()[0].json.data[0].url;
const fetch_response = await fetch(imageUrl);
const buffer = await fetch_response.buffer();
return { thumbnail_binary: buffer };

Step 6:

Upload to YouTube

Once the video is ready, upload it to YouTube using the YouTube Data API. This requires OAuth authentication, which n8n handles natively.

First, authorise your YouTube account in n8n. Then add an HTTP Request node:


Method: POST
URL: https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable
Authentication: OAuth2 (YouTube)
Headers:
  X-Goog-Upload-Protocol: resumable
Body (JSON):
{
  "snippet": {
    "title": "{{ topic }}",
    "description": "{{ description }}\n\nAuto-generated by AI.",
    "tags": ["ai", "tutorial", "{{ topic }}"],
    "categoryId": "27"
  },
  "status": {
    "privacyStatus": "public",
    "madeForKids": false
  }
}

YouTube requires resumable uploads for large files. The API returns a session URI. Use it to upload the video file:


Method: PUT
URL: {resumable_session_uri}
Headers:
  Content-Type: video/mp4
Body: {binary video file}

After the upload succeeds, you get back a video ID. Use it to upload the thumbnail:


Method: POST
URL: https://www.googleapis.com/upload/youtube/v3/videos/{{ video_id }}/thumbnail?uploadType=media
Authentication: OAuth2 (YouTube)
Headers:
  Content-Type: image/jpeg
Body: {binary thumbnail file}

For n8n, use the "Binary to File" node to handle video and image uploads properly:

// For video upload
const videoFile = $input.all()[0].binary.video;
const sessionUri = $input.all()[1].json.session_uri;

// For thumbnail upload
const thumbnailFile = $input.all()[0].binary.thumbnail;
const videoId = $input.all()[1].json.id;

Step 7:

Promote on Social Media

Once the video is live, share it across your channels. Use the Twitter API, LinkedIn API, and a mailing list service.

For Twitter (X):


Method: POST
URL: https://api.twitter.com/2/tweets
Authentication: Bearer YOUR_TWITTER_KEY
Body (JSON):
{
  "text": "New video: {{ topic }}\n\nhttps://youtube.com/watch?v={{ video_id }}\n\n#ai #tutorial"
}

For LinkedIn (requires OAuth):


Method: POST
URL: https://api.linkedin.com/v2/ugcPosts
Authentication: OAuth2 (LinkedIn)
Body (JSON):
{
  "author": "urn:li:person:YOUR_PERSON_ID",
  "lifecycleState": "PUBLISHED",
  "specificContent": {
    "com.linkedin.ugc.ShareContent": {
      "shareCommentary": {
        "text": "New video on {{ topic }}: https://youtube.com/watch?v={{ video_id }}"
      },
      "shareMediaCategory": "VIDEO",
      "media": [
        {
          "status": "READY",
          "description": {
            "text": "{{ description }}"
          },
          "originalUrl": "https://youtube.com/watch?v={{ video_id }}"
        }
      ]
    }
  }
}

For email, integrate with Mailchimp or SendGrid:


Method: POST
URL: https://api.sendgrid.com/v3/mail/send
Authentication: Bearer YOUR_SENDGRID_KEY
Body (JSON):
{
  "personalizations": [
    {
      "to": [{"email": "subscribers@yourlist.com"}],
      "subject": "New video: {{ topic }}"
    }
  ],
  "from": {"email": "noreply@yoursite.com"},
  "content": [
    {
      "type": "text/html",
      "value": "<p>Watch our latest video: <a href='https://youtube.com/watch?v={{ video_id }}'>{{ topic }}</a></p>"
    }
  ]
}

Putting It Together in n8n

Here is a simplified workflow outline. You will adjust timing based on render times:


Google Form Webhook
  ↓
Set Variables (topic, description, length, style)
  ↓
Claude Script Generation
  ↓
Parallel Branch 1: Eleven Labs Voiceover → Store Audio
Parallel Branch 2: Synthesia Video → Poll Status → Download
Parallel Branch 3: DALL-E Thumbnail → Download
  ↓
Wait for All Branches (all files ready)
  ↓
YouTube Upload (Video + Metadata + Thumbnail)
  ↓
Parallel Social Posts (Twitter, LinkedIn, Email)
  ↓
Success Notification (Slack or Email)

Deploy this workflow and toggle it to Active. The entire process runs end-to-end with zero human involvement.

The Manual Alternative

If you want tighter control over quality or need to review before publishing, keep human checkpoints in the workflow.

After script generation, insert an approval step. Send the script to yourself via email or post it in a Slack channel. If you approve within the Slack thread, the workflow continues. If you request changes, it pauses.

Similarly, before YouTube upload, you might want to review the final video. Use n8n's built-in file storage or upload to a private S3 bucket. Watch it yourself, then manually trigger the upload step if satisfied.

This hybrid approach trades some automation for quality assurance. Your choice depends on how much you trust the AI outputs and your risk tolerance if something goes wrong.

Pro Tips

1. Handle Rate Limits Gracefully

Eleven Labs, DALL-E, and Synthesia all have rate limits. If you plan to publish multiple videos per day, upgrade your plans or space out uploads. In n8n, add retry logic with exponential backoff:

let retries = 0;
let delay = 1000;
while (retries < 5) {
  try {
    // API call here
    return result;
  } catch (error) {
    if (error.status === 429) {
      retries++;
      await new Promise(r => setTimeout(r, delay));
      delay *= 2;
    } else {
      throw error;
    }
  }
}

2. Store Metadata in a Database

After each successful upload, log the video ID, topic, script, audio duration, and thumbnail URL in a database. Use PostgreSQL, Airtable, or Google Sheets. This gives you a searchable archive and helps you spot patterns in what performs well.

3. Monitor for Failures

n8n lets you configure error notifications. If any step fails, send yourself an alert on Slack or email immediately. Check the logs and retry manually if needed. Do not let broken workflows run silently.

4. Optimise Costs with Caching

If you generate scripts on similar topics repeatedly, cache the Claude responses. Store scripts in a database and check for matches before calling the API. Same for voiceovers; reuse audio if the script is identical.

5. Test with Dummy Data First

Before connecting real YouTube accounts, run the workflow with test data. Generate a script and thumbnail locally, upload a private test video. Verify all steps work before automating fully.

Cost Breakdown

Here is a realistic monthly cost for running this system at scale (10 videos per month):

ToolPlan NeededMonthly CostNotes
Claude APIPay-as-you-go15 USD~1,500 tokens per script
Eleven LabsProfessional99 USD100k characters/month, includes text-to-speech
SynthesiaCreator Plan100 USD5 videos/month, unlimited length
DALL-EPay-as-you-go10 USD~0.08 USD per image at standard quality
n8nSelf-hosted0 USDOpen-source, your own server
YouTube APIFree0 USDIncluded with Google account
Twitter/LinkedIn/SendGridFree or existing0–50 USDDepends on subscriber count
Total224 USDScales linearly with videos

If you use Zapier instead of n8n, add 50–500 USD depending on task volume. Make (Integromat) costs 150–300 USD. Self-hosting n8n on a cheap VPS saves money if you run many workflows.

For 10 videos per month, 224 USD is roughly 22 USD per video in AI costs alone. Add hosting, domain, and email if needed. It is far cheaper than hiring a video production team.

This workflow is ready to deploy today. Pick your orchestration platform, connect the APIs, and let your automated channel run.

Tool Pipeline Overview

How each tool connects in this workflow

1
ChatGPT

ChatGPT

Step 1

2
Descript

Descript

Step 2

3
ElevenLabs

ElevenLabs

Step 3

4
Midjourney

Midjourney

Step 4

5
Runway

Runway

Step 5