Dropshipping Video Automation: Process Supplier Videos for TikTok

March 17, 2026 · RenderIO

Supplier videos aren't ready for TikTok

Your supplier sends product videos. They're 16:9, have the supplier's watermark, inconsistent audio, and look like every other dropshipper's listing. Upload them raw to TikTok Shop and you'll blend into the sea of identical content.

The gap between supplier video and TikTok-ready content is where most dropshippers get stuck. They either post the raw video and get no traction, or spend $5-15 per video on freelance editing that eats into already-thin margins.

FFmpeg bridges this gap. Crop the watermark, add your brand, create variations, format for TikTok. All automated. All at scale.

The supplier video problems

Watermarks

Most suppliers watermark their product videos. Common positions: bottom-right corner, center overlay, top banner. You can't use the supplier's branding on your TikTok Shop.

Wrong format

Supplier videos are typically:

  • 16:9 or 4:3 aspect ratio (TikTok needs 9:16)

  • 1080p or 720p landscape

  • Often lower quality from phone recordings in warehouses

No branding

Generic supplier video with no brand identity means customers can't distinguish you from 50 other sellers with the same product.

Audio issues

Background noise from the factory/warehouse. No music. Inconsistent volume. Sometimes no audio at all.

FFmpeg processing pipeline

Step 1: Remove supplier watermark by cropping

For bottom-right watermarks (most common):

ffmpeg -i supplier-video.mp4 \
  -vf "crop=iw:ih-100:0:0" \
  -c:v libx264 -crf 20 -c:a copy \
  no-watermark.mp4

This removes the bottom 100 pixels. Adjust based on watermark size.

For corner watermarks:

# Remove bottom-right corner (200x100 area)
ffmpeg -i supplier-video.mp4 \
  -vf "delogo=x=iw-220:y=ih-120:w=200:h=100" \
  -c:v libx264 -crf 20 -c:a copy \
  no-watermark.mp4

The delogo filter blurs the specified area. Less precise than cropping but preserves more content.

For center watermarks, crop to avoid the area:

ffmpeg -i supplier-video.mp4 \
  -vf "crop=iw:ih*0.4:0:0" \
  -c:v libx264 -crf 20 -c:a copy \
  top-portion.mp4

Step 2: Convert to 9:16

ffmpeg -i no-watermark.mp4 \
  -filter_complex "[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920[v]" \
  -map "[v]" -map 0:a? \
  -c:v libx264 -crf 20 -c:a aac \
  portrait.mp4

Step 3: Add your branding

ffmpeg -i portrait.mp4 -i brand-logo.png \
  -filter_complex "\
    [1:v]scale=100:-1,format=rgba,colorchannelmixer=aa=0.5[logo];\
    [0:v][logo]overlay=W-w-20:20,\
    drawtext=text='@YourBrandName':fontsize=28:fontcolor=white:x=20:y=H-60[v]" \
  -map "[v]" -map 0:a \
  -c:v libx264 -crf 20 -c:a copy \
  branded.mp4

Step 4: Fix audio

Replace factory audio with music:

ffmpeg -i branded.mp4 -i background-music.mp3 \
  -filter_complex "[1:a]volume=0.5,afade=t=out:st=14:d=1[music]" \
  -map 0:v -map "[music]" \
  -c:v copy -c:a aac -b:a 128k -t 15 \
  final.mp4

Or normalize existing audio and add music underneath:

ffmpeg -i branded.mp4 -i background-music.mp3 \
  -filter_complex "\
    [0:a]loudnorm=I=-14:TP=-2:LRA=7[voice];\
    [1:a]volume=0.15[music];\
    [voice][music]amix=inputs=2:duration=first[a]" \
  -map 0:v -map "[a]" \
  -c:v copy -c:a aac -b:a 128k \
  final.mp4

Combined pipeline

All steps in one command (assuming bottom watermark, no music replacement):

ffmpeg -i supplier-video.mp4 -i brand-logo.png \
  -map_metadata -1 \
  -filter_complex "\
    [0:v]crop=iw:ih-100:0:0,scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920[bg];\
    [1:v]scale=100:-1,format=rgba,colorchannelmixer=aa=0.5[logo];\
    [bg][logo]overlay=W-w-20:20,\
    drawtext=text='@YourBrand':fontsize=28:fontcolor=white:x=20:y=H-60[v]" \
  -map "[v]" -map 0:a? \
  -af "loudnorm=I=-14:TP=-2:LRA=7" \
  -c:v libx264 -crf 22 -c:a aac -b:a 128k \
  -movflags +faststart -t 15 \
  tiktok-ready.mp4

Automate with RenderIO API

Single video

curl -X POST https://renderio.dev/api/v1/run-ffmpeg-command \
  -H "X-API-KEY: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "ffmpeg_command": "-i {in_video} -i {in_logo} -map_metadata -1 -filter_complex \"[0:v]crop=iw:ih-100:0:0,scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920[bg];[1:v]scale=100:-1,format=rgba,colorchannelmixer=aa=0.5[logo];[bg][logo]overlay=W-w-20:20,drawtext=text=@YourBrand:fontsize=28:fontcolor=white:x=20:y=H-60[v]\" -map \"[v]\" -map 0:a? -af \"loudnorm=I=-14:TP=-2:LRA=7\" -c:v libx264 -crf 22 -c:a aac -b:a 128k -movflags +faststart -t 15 {out_video}",
    "input_files": {
      "in_video": "https://supplier-cdn.example.com/product-123.mp4",
      "in_logo": "https://storage.example.com/brand-logo.png"
    },
    "output_files": { "out_video": "product-123-tiktok.mp4" }
  }'

Batch process supplier catalog

const supplierVideos = [
  { sku: "P-001", url: "https://supplier.com/videos/item-001.mp4" },
  { sku: "P-002", url: "https://supplier.com/videos/item-002.mp4" },
  { sku: "P-003", url: "https://supplier.com/videos/item-003.mp4" },
  // ... hundreds of products
];

const BRAND_LOGO = "https://storage.example.com/brand-logo.png";
const PIPELINE = `-i {in_video} -i {in_logo} -map_metadata -1 -filter_complex "[0:v]crop=iw:ih-100:0:0,scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920[bg];[1:v]scale=100:-1,format=rgba,colorchannelmixer=aa=0.5[logo];[bg][logo]overlay=W-w-20:20,drawtext=text=@YourBrand:fontsize=28:fontcolor=white:x=20:y=H-60[v]" -map "[v]" -map 0:a? -af "loudnorm=I=-14:TP=-2:LRA=7" -c:v libx264 -crf 22 -c:a aac -b:a 128k -movflags +faststart -t 15 {out_video}`;

async function processSupplierVideos(videos) {
  const jobs = videos.map(video =>
    fetch("https://renderio.dev/api/v1/run-ffmpeg-command", {
      method: "POST",
      headers: {
        "X-API-KEY": process.env.RENDERIO_API_KEY,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        ffmpeg_command: PIPELINE,
        input_files: {
          in_video: video.url,
          in_logo: BRAND_LOGO,
        },
        output_files: { out_video: `${video.sku}-tiktok.mp4` },
      }),
    }).then(r => r.json())
  );

  return Promise.all(jobs);
}

const results = await processSupplierVideos(supplierVideos);

Create variations per product

After base processing, create 5 unique variations per product:

const variationFilters = [
  { suffix: "v1", vf: "eq=saturation=1.15:contrast=1.05" },
  { suffix: "v2", vf: "hflip" },
  { suffix: "v3", vf: "colortemperature=temperature=6000" },
  { suffix: "v4", vf: "eq=brightness=0.03:saturation=1.1" },
  { suffix: "v5", vf: "noise=alls=12:allf=t,eq=contrast=1.08" },
];

async function createVariations(baseUrl, sku) {
  const jobs = variationFilters.map(v =>
    fetch("https://renderio.dev/api/v1/run-ffmpeg-command", {
      method: "POST",
      headers: {
        "X-API-KEY": process.env.RENDERIO_API_KEY,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        ffmpeg_command: `-i {in_video} -vf "${v.vf}" -c:v libx264 -crf 22 -c:a copy {out_video}`,
        input_files: { in_video: baseUrl },
        output_files: { out_video: `${sku}-${v.suffix}.mp4` },
      }),
    }).then(r => r.json())
  );

  return Promise.all(jobs);
}

200 products x (1 base + 5 variations) = 1,200 API calls. That fits the Pro plan at $49/month (5,000 commands).

Dropshipping economics

ItemCost
RenderIO Pro (5,000 commands)$49/mo
Storage (Cloudflare R2, 10GB)~$1/mo
Total$50/mo

Alternative approaches:

  • Freelance editor (200 videos): $1,000-3,000/mo

  • CapCut + manual work (200 videos): 40+ hours/mo of your time

  • Fiverr per video (35each):3-5 each): 600-1,000/mo

The API approach costs 95% less than freelance editing and saves 40+ hours of manual work.

Running a dropshipping video pipeline? The Pro plan at $49/mo covers 5,000 commands. Learn more about automating video at scale or get your API key and start processing supplier videos today.

Turn supplier videos into branded TikTok content. At scale. Automatically.