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.
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
Claude Code + Cursor: How a 2-Person Startup Shipped a SaaS in 30 Days
Two non-technical Vietnamese founders built a full dental clinic management SaaS — booking, patient records, invoicing, SMS reminders — in 30 days using Claude Code and Cursor. 15 paying clinics in month one. Pre-seed raised on traction.
Gemini for Enterprise: Building a Multi-Modal Knowledge Base for a Hospital Network
A private hospital group in Vietnam with 12 locations unified 50,000+ medical records — PDFs, handwritten notes, X-rays, lab results — into a single AI-powered search system using Gemini 1.5 Pro. Diagnosis lookup time dropped from 15 minutes to 30 seconds.
Enterprise AI Adoption: Deploying OpenAI Codex for Internal Dev Teams
How an Australian fintech startup reduced developer onboarding from 3 months to 3 weeks, cut PR review time by 40%, and lifted test coverage from 45% to 89% — by integrating Codex across their entire development workflow.