Back to Blog
ai11 min read

AI Video Generation at Scale: Helping a Marketing Agency Produce 200 Videos/Month

A Vietnamese digital marketing agency serving 30+ e-commerce brands slashed video production cost from $800 to $35 per video and scaled to 200+ videos/month using an AI pipeline built on Claude, ElevenLabs, Runway Gen-3, and FFmpeg.

V
By Ventra Rocket Team
·Published on 28 April 2026
#Video AI#AI#Enterprise#Marketing#Runway#ElevenLabs#Claude

Every e-commerce brand on TikTok and Instagram Reels needs a constant stream of short-form video content. The problem: producing a single quality product video costs $500–$1,000 and takes 3 days. For a marketing agency managing 30+ brands, each needing 5–10 videos per week, manual production is mathematically impossible. This is how Ventra Rocket helped one agency build an AI video pipeline that produces 200+ videos per month at $35 per video.

The Economics That Made Manual Production Impossible

The agency had a straightforward problem: their clients' content demands had grown faster than their production capacity.

Before AI:

  • Average cost per video: $800 (videographer, editor, voiceover artist, post-production)
  • Production time: 3 days per video
  • Maximum capacity: ~40 videos/month (1 production team)
  • Client demand: 150–200 videos/month across 30+ brands

The gap meant turning down clients or delivering lower quality than promised. The agency needed to 5x output without 5x headcount.

The Solution: A Tiered AI Video Pipeline

The key insight was not to replace all video production with AI — it was to create a tier system:

  • Tier 1 (AI-generated, 80% of volume): Product showcases, promotional clips, testimonial compilations, seasonal offers
  • Tier 2 (AI-assisted, 15% of volume): More complex brand narratives with AI script + human director
  • Tier 3 (Human-produced, 5% of volume): Premium brand films, campaign hero videos

The AI pipeline handles Tier 1 entirely. This unlocked capacity for human teams to focus on Tier 2 and 3 work, where their creativity adds irreplaceable value.

The Tech Stack

Product Assets + Brand Guidelines
         ↓
Claude API (Script Generation)
         ↓
ElevenLabs (Voiceover Synthesis)
         ↓
Runway Gen-3 / Kling (Video Generation)
         ↓
FFmpeg (Assembly + Brand Templates)
         ↓
React Dashboard (Client Review + Approval)
         ↓
TikTok / Instagram / YouTube (Auto-publish)

Component 1: Script Generation with Claude

Claude generates platform-optimized scripts from a product brief:

import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic();

interface VideoScriptInput {
  productName: string;
  productDescription: string;
  targetAudience: string;
  platform: 'tiktok' | 'reels' | 'youtube_shorts';
  duration: 15 | 30 | 60; // seconds
  brandVoice: string;
  keyMessages: string[];
  callToAction: string;
}

async function generateVideoScript(input: VideoScriptInput): Promise<VideoScript> {
  const PLATFORM_CONSTRAINTS = {
    tiktok: 'Energetic, trend-aware, hook in first 2 seconds, casual Vietnamese/English mix OK',
    reels: 'Visually-driven, aesthetic, hook in first 3 seconds',
    youtube_shorts: 'More informational, can be slightly longer setup',
  };

  const message = await client.messages.create({
    model: 'claude-opus-4-6',
    max_tokens: 1024,
    messages: [{
      role: 'user',
      content: `Generate a ${input.duration}-second ${input.platform} video script for:

Product: ${input.productName}
Description: ${input.productDescription}
Target audience: ${input.targetAudience}
Brand voice: ${input.brandVoice}
Key messages: ${input.keyMessages.join(', ')}
CTA: ${input.callToAction}
Platform style: ${PLATFORM_CONSTRAINTS[input.platform]}

Output JSON with:
- hook: opening line (must grab attention in 2 seconds)
- scenes: array of {timestamp, visual_description, voiceover_text, text_overlay}
- voiceover_full: complete voiceover script
- hashtags: 5 relevant hashtags`
    }]
  });

  return JSON.parse((message.content[0] as { text: string }).text);
}

Sample output for a skincare product:

{
  "hook": "Da mụn 5 năm — hết trong 3 tuần. Đây là sự thật.",
  "scenes": [
    {
      "timestamp": "0-3s",
      "visual_description": "Close-up of product bottle, soft lighting, minimal background",
      "voiceover_text": "Da mụn 5 năm — hết trong 3 tuần.",
      "text_overlay": "BEFORE/AFTER"
    },
    {
      "timestamp": "3-10s",
      "visual_description": "Split screen: before/after skin comparison, product featured",
      "voiceover_text": "Serum vitamin C 20% kết hợp niacinamide — công thức của chúng tôi đã được 50,000 khách hàng tin dùng.",
      "text_overlay": "50,000 khách hàng"
    }
  ],
  "voiceover_full": "...",
  "hashtags": ["#skincare", "#serum", "#damat", "#beautyvietnam", "#skincareroutine"]
}

Component 2: Voiceover with ElevenLabs

from elevenlabs.client import ElevenLabs
from elevenlabs import Voice, VoiceSettings

client = ElevenLabs(api_key=ELEVENLABS_API_KEY)

BRAND_VOICES = {
    'luxury': 'voice_id_calm_professional',
    'energetic': 'voice_id_upbeat_young',
    'authoritative': 'voice_id_confident_expert',
}

def generate_voiceover(script: str, brand_voice_type: str, output_path: str) -> str:
    audio = client.generate(
        text=script,
        voice=Voice(
            voice_id=BRAND_VOICES[brand_voice_type],
            settings=VoiceSettings(
                stability=0.71,
                similarity_boost=0.85,
                style=0.5,
                use_speaker_boost=True
            )
        ),
        model='eleven_multilingual_v2'  # Vietnamese support
    )

    with open(output_path, 'wb') as f:
        for chunk in audio:
            f.write(chunk)

    return output_path

Component 3: Video Generation with Runway Gen-3

import runwayml

runway = runwayml.RunwayML(api_key=RUNWAY_API_KEY)

def generate_video_scene(
    scene_description: str,
    product_image_url: str,
    duration: int = 5
) -> str:
    task = runway.image_to_video.create(
        model='gen3a_turbo',
        prompt_image=product_image_url,
        prompt_text=f"{scene_description}. Professional product video, clean background, high quality.",
        duration=duration,
        ratio='9:16',  # Vertical for TikTok/Reels
        watermark=False
    )

    # Poll until complete
    task = task.wait_for_task_output()
    return task.output[0]  # Returns video URL

Component 4: Assembly with FFmpeg

import subprocess
from pathlib import Path

def assemble_video(
    scene_videos: list[str],
    voiceover_path: str,
    brand_template: str,
    output_path: str,
    background_music: str | None = None
) -> str:

    # Concatenate scene videos
    concat_list = Path('/tmp/concat.txt')
    concat_list.write_text('\n'.join(f"file '{v}'" for v in scene_videos))

    concat_output = '/tmp/raw_concat.mp4'
    subprocess.run([
        'ffmpeg', '-f', 'concat', '-safe', '0',
        '-i', str(concat_list), '-c', 'copy', concat_output
    ], check=True)

    # Mix voiceover + background music + apply brand template
    audio_filter = (
        f'[1:a]volume=1.0[vo];'
        f'[2:a]volume=0.15[bg];'
        f'[vo][bg]amix=inputs=2:duration=first[audio]'
    )

    subprocess.run([
        'ffmpeg',
        '-i', concat_output,
        '-i', voiceover_path,
        '-i', background_music or 'silence.mp3',
        '-i', f'templates/{brand_template}/overlay.png',
        '-filter_complex', audio_filter,
        '-map', '0:v', '-map', '[audio]', '-map', '3:v',
        '-c:v', 'libx264', '-c:a', 'aac',
        '-preset', 'fast', '-crf', '18',
        output_path
    ], check=True)

    return output_path

Component 5: Client Review Dashboard

The agency's clients access a React dashboard to review and approve videos before publishing:

  • Batch view: See all 10 videos for the week at once
  • In-app editing: Request script changes, swap product images, adjust voiceover speed
  • 1-click approve: Auto-queues for scheduled publishing
  • Brand library: Templates, voiceover profiles, and brand guidelines stored per client

Results

| Metric | Before AI | After AI | Change | |--------|-----------|----------|--------| | Cost per video | $800 | $35 | -96% | | Production time per video | 3 days | 2 hours | -97% | | Monthly capacity | 40 videos | 200+ videos | +400% | | Client retention rate | Baseline | +60% | — | | Human team headcount | 4 people | 4 people | 0% growth | | Client count | 18 brands | 34 brands | +89% |

Key Insights

The Tier System is the Strategy, Not the Tech

The critical decision was not which AI tools to use — it was designing a tier system that preserves human creativity for high-value work. Agencies that try to AI-generate everything end up with generic content. Agencies that use AI only for volume content while humans focus on premium work create a sustainable competitive advantage.

Claude for Scripts, Not Just Summaries

Claude's ability to understand brand voice, platform context, and Vietnamese language nuances makes it the right tool for script generation — not just content summarization. The output is platform-native, brand-consistent, and linguistically natural.

Runway + FFmpeg is More Flexible Than All-in-One Tools

Runway generates individual scenes; FFmpeg assembles them with brand templates. This two-layer approach is more flexible than all-in-one video AI tools, because brand templates — logos, lower thirds, color grading — are applied deterministically, not generated. Consistency across 200+ videos requires determinism.

Client Review UX Determines Adoption

The best pipeline fails if clients do not trust it. The review dashboard — showing all videos for the week, enabling easy feedback, with 1-click approval — was as important as the generation pipeline. Build the human-in-the-loop interface first.

Conclusion

AI video generation at scale is not about replacing videographers — it is about creating a tier system where AI handles volume and humans handle premium. The agency now runs at 200+ videos per month with the same team, at $35 per video instead of $800, with client retention up 60%.

The tools exist. The bottleneck is workflow design, not technology.

Contact Ventra Rocket to build an AI video pipeline for your agency or marketing team.

Related Articles