Dropshipping Video Automation for TikTok Shop

March 19, 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. If you're unfamiliar with FFmpeg commands, the FFmpeg command reference has the fundamentals.

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. It looks unprofessional and some platforms flag it.

For more on watermark techniques (opacity, positioning, animation), the watermark guide goes deep.

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 or warehouse. No music. Inconsistent volume. Sometimes no audio at all.

Dropshipping video automation with FFmpeg

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. Measure the watermark area by opening the video in any player and noting the pixel dimensions.

For corner watermarks, the delogo filter blurs a specific region instead of cropping:

# 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

delogo interpolates surrounding pixels to fill the watermark area. It works well on simple backgrounds but leaves visible smearing on detailed scenes. For those cases, cropping is cleaner.

For center watermarks (the hardest to deal with), you have two options. Crop above and below the watermark and join the pieces, or accept some content loss and crop to the portion of the frame that's clean:

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

TikTok's native format is 1080x1920 (9:16 portrait). Landscape supplier footage needs to be cropped and scaled:

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

The force_original_aspect_ratio=increase flag scales the video so the smaller dimension fills the target, then crop trims the excess. This avoids black bars, but you lose some content from the edges. For product videos, center-cropping usually works fine because the product is in the middle of the frame.

If your supplier sends vertical video already (some do for TikTok-aware suppliers), skip this step.

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

This adds a semi-transparent logo in the top-right corner and your handle text in the bottom-left. The aa=0.5 sets 50% opacity on the logo so it doesn't overpower the product footage.

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

The loudnorm filter normalizes volume to broadcast standards (-14 LUFS). Mixing the original audio with background music at 15% volume gives you a professional sound without drowning out product demos that have voiceover.

TikTok Shop video requirements

Before processing, know the platform specs:

  • Aspect ratio: 9:16 (1080x1920 preferred)

  • Max file size: 287MB (under 500MB for some regions)

  • Max duration: 10 minutes, but 15-60 seconds performs best

  • Codec: H.264 (libx264) is safest; H.265 support varies by device

  • Audio: AAC, 128kbps minimum

  • Frame rate: 30fps recommended (TikTok re-encodes to 30fps anyway)

If your supplier videos exceed 10 minutes, trim them before processing. The -t 15 flag in the audio step already handles duration, but explicit trimming gives you control over which 15 seconds to keep.

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

The -map_metadata -1 flag strips all metadata from the output. This matters for two reasons: it removes the supplier's identifying information, and it prevents TikTok from using metadata for duplicate detection. Read more about making video variations unique for the full picture on what TikTok checks.

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" }
  }'

For the full submit-poll-download pattern, see the FFmpeg API guide.

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 to post across multiple accounts. Each variation applies different visual filters so TikTok's fingerprinting system treats them as distinct uploads. The duplicate detection guide explains what TikTok checks and why these specific filters work.

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 × (1 base + 5 variations) = 1,200 API calls. The Growth plan (29/mo,1,000commands)coversmostofthatwithasmalloverage,ortheBusinessplan(29/mo, 1,000 commands) covers most of that with a small overage, or the Business plan (99/mo, 20,000 commands) gives you plenty of headroom.

Troubleshooting

Cropped video looks stretched or squished: The force_original_aspect_ratio flag only works correctly when paired with crop or pad. If your output looks distorted, check that you have both scale and crop in the filter chain. Scale alone will stretch the video to fit the target dimensions.

Audio disappears after processing: The -map 0:a? flag (note the ?) makes audio optional. If the supplier video has no audio track, FFmpeg skips it instead of failing. But if you then try to mix in background music, the amix filter will fail because there's no input audio to mix. Check for audio first with ffprobe -v error -select_streams a:0 -show_entries stream=codec_name input.mp4.

TikTok rejects the upload: Usually a file size issue. TikTok Shop has a 287MB limit in most regions. Long supplier videos at CRF 20 can exceed this. Either trim the video shorter or increase CRF to 24-26 (smaller file, slightly lower quality).

Variations look identical to the eye: They're supposed to. The differences are in the encoding: different CRF values, pixel-level noise, minor color shifts. TikTok's system checks at the data level, not the visual level. If you want visually distinct versions, use more aggressive filters like hflip (mirror) or larger brightness shifts.

Dropshipping video economics

ItemCost
RenderIO Growth (1,000 commands/mo)$29/mo
Storage (Cloudflare R2, 10GB)~$1/mo
Total~$30/mo

For larger catalogs (200+ products with variations), the Business plan at $99/mo covers 20,000 commands, enough for thousands of variations.

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 a fraction of freelance editing and saves 40+ hours of manual work per month.

FAQ

Can I process videos from any supplier platform (Alibaba, 1688, CJ Dropshipping)?

Yes. As long as you have a direct URL to the video file (or can download it first), the pipeline handles it. Some supplier platforms require logging in to access videos. In that case, download locally first and upload to your own storage (S3, R2, etc.) before sending to the API.

How do I handle different watermark positions across suppliers?

Adjust the crop/delogo filter parameters per supplier. If Supplier A always puts watermarks in the bottom-right and Supplier B uses a top banner, create two FFmpeg command templates and route videos to the right one based on supplier. A simple lookup table in your code handles this.

Will TikTok detect that these are the same product video?

The variation filters (different CRF, noise, brightness, pitch) change the video at the encoding level. TikTok's fingerprinting looks at perceptual hashes and encoding signatures. Small parameter changes are enough to pass as distinct content. For the full breakdown of what TikTok checks, see the duplicate detection guide.

What's the fastest way to process a large catalog?

Submit all API calls in parallel using Promise.all() as shown in the batch example above. RenderIO processes each command in its own sandbox, so 50 simultaneous requests finish in roughly the same time as one. The bottleneck is encoding time per video, not concurrency.

Can I add captions or product info text to the video?

Yes. Extend the drawtext filter in the combined pipeline command. For example, add a product name at the top: drawtext=text='Product Name':fontsize=36:fontcolor=white:x=(w-text_w)/2:y=40. You can also burn in subtitles from an SRT file. The watermark guide covers subtitle burn-in.