How to Convert iPhone MOV to MP4 Automatically (API + n8n Recipe)

Your team drops iPhone footage in a shared folder, and half of it never plays in the browser. The upload succeeds, the thumbnail generator returns nothing, and someone spends their afternoon dragging files through HandBrake. The file extension isn't the problem.
Quick answer: To convert an iPhone MOV to MP4 format automatically, send the file to a transcode API from your automation tool instead of converting by hand. In n8n, Make, or Zapier, add an HTTP step that posts the MOV URL to the FFmpeg Micro API, wait for the webhook, then pass the returned MP4 URL to your next step. One API call, no servers to run, works on files iPhones record in HEVC.
Why iPhone MOV files break your pipeline, and it's not the container
Conventional wisdom says MOV is an Apple format and MP4 is the web format, so you need to change the container. That's partly true, and it's why so many "converters" just remux and call it done. The actual failure is the codec inside.
Since iOS 11, iPhones default to HEVC (H.265) inside a .mov container when Camera settings are set to High Efficiency. Chrome on Windows and most server-side thumbnail tools won't decode H.265. Safari will, which is exactly why the footage plays fine on the marketing lead's Mac and dies in the CMS.
So a rename doesn't work. A remux (-c copy into .mp4) also doesn't work, because the H.265 stream comes along for the ride. You need a real re-encode to H.264 + AAC.
Two other things ride along with iPhone MOV files:
- Rotation metadata. iPhones record sensor-native and set a rotate flag. Naive tools ignore it and you get sideways video.
- PCM audio. iPhone MOV audio is often uncompressed PCM, which MP4 doesn't officially support. That alone can make an otherwise-fine remux unplayable.
The FFmpeg command, and the one API call that replaces it
Here's the conversion that actually works, both ways.
Raw FFmpeg on your own machine:
ffmpeg -i IMG_4821.MOV \
-c:v libx264 -preset medium -crf 23 \
-pix_fmt yuv420p \
-c:a aac -b:a 128k \
-movflags +faststart \
output.mp4
Three flags matter more than people expect. -pix_fmt yuv420p forces 8-bit 4:2:0 chroma, because iPhone HEVC is often 10-bit and Chrome will refuse it. -movflags +faststart moves the moov atom to the front of the file so the video starts playing before it fully downloads. -c:a aac fixes the PCM problem.
Same job as a single HTTP request:
curl -X POST https://api.ffmpeg-micro.com/v1/jobs \
-H "Authorization: Bearer $FFMPEG_MICRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input_url": "https://storage.example.com/uploads/IMG_4821.MOV",
"operation": "transcode",
"options": {
"format": "mp4",
"video_codec": "h264",
"audio_codec": "aac",
"faststart": true
},
"webhook_url": "https://hooks.example.com/n8n/webhook/mov-done"
}'
The response comes back immediately with a job ID and a queued status. The webhook fires when the output URL is ready. Check the docs for the current option names before you wire it into production.
| Manual / self-hosted | FFmpeg Micro | |
|---|---|---|
| Setup | Install FFmpeg, match a build with libx265 decode | API key |
| Where it runs | Your laptop or a container you maintain | No servers to run |
| 4K 60s clip | Minutes on a laptop CPU, blocks the machine | Async job, webhook on completion |
| Fails when | Someone updates FFmpeg and a flag moves | Stable job semantics |
| Fits in n8n | Only with a self-hosted node and a custom Docker image | HTTP Request node |
Build the n8n recipe: catch the MOV, ship the MP4
This is the copy-paste workflow. Five nodes, and it handles every MOV that lands in your bucket.
- Trigger. Google Drive Trigger on "File Created" in your upload folder, or a Webhook node if your app posts uploads directly. Dropbox and S3 triggers work the same way.
- IF node. Route on file extension. Condition:
{{ $json.name.toLowerCase().endsWith('.mov') }}. MP4s skip the whole branch and go straight to delivery. Don't burn conversion minutes on files that are already fine. - HTTP Request node. POST to
https://api.ffmpeg-micro.com/v1/jobswith the JSON body above. Setinput_urlto the file's public or signed URL andwebhook_urlto a Webhook node in this same workflow. - Webhook node (separate workflow or a Wait node). This is where most builds break. n8n's default HTTP timeout is 300 seconds, and a 4K clip can outlast it. Use the webhook, not a synchronous wait. We wrote up the full pattern in How to Fix n8n Timeout Errors When Processing Video.
- Delivery node. Take
output_urlfrom the webhook payload and push it wherever it was going: your CMS, a Slack message, an Airtable record, the next step in your repurposing chain.
Make and Zapier
Same shape, different boxes. In Make, use a Watch Files module, a Router with a filter on .mov, then an HTTP "Make a request" module posting the same JSON. In Zapier, use Webhooks by Zapier (POST) with the body as JSON, then a second Zap triggered by a Catch Hook for the completion webhook. Zapier can't wait on a long job in one Zap, so the two-Zap split isn't optional.
Common pitfalls when converting MOV to MP4 automatically
These are the ones that actually cost people an afternoon.
- Renaming
.movto.mp4. Still HEVC inside. Chrome still fails. This is the single most common "fix" in r/iOS threads and it doesn't work. - Remuxing with
-c copy. Faster, and produces a valid MP4 container with an H.265 stream your CMS won't play. Only safe if the source was already H.264, which iPhone footage usually isn't. - Forgetting
+faststart. The file plays, but only after the whole thing downloads. On a 200 MB clip over hotel wifi, that reads as broken to the viewer. - Dropping rotation metadata. Portrait iPhone video comes out sideways. Verify with
ffprobebefore and after, or read ffprobe: How to Inspect Video Metadata Before Processing. - 10-bit HEVC without
-pix_fmt yuv420p. Encodes fine, plays nowhere. Silent failure, worst kind. - Assuming every
.movis HEVC. Set the iPhone to "Most Compatible" and you get H.264 in a MOV. Probe the stream instead of guessing from the extension.
What the failure actually looks like
Send a corrupt or truncated MOV and you don't get a mystery. The job comes back failed with the FFmpeg error attached, usually moov atom not found for a file that stopped uploading partway. That's the tell that your upload step failed, not your conversion step. Retry the upload, not the job.
When not to bother with an API
If you're converting one file, use HandBrake or QuickTime's Export. A single conversion doesn't need a pipeline.
If you're serving adaptive streaming to a large audience with per-viewer analytics, look at Mux or Cloudflare Stream. Those are streaming platforms with players attached. FFmpeg Micro is a processing API. It hands you a file.
And if you already run a media microservice with an FFmpeg build you trust and it isn't costing you time, keep it. The math on that is laid out in FFmpeg in the cloud vs running FFmpeg yourself.
Where the API earns its keep is volume plus unpredictability: a shared folder that gets 30 clips a day from five different iPhones on three different iOS versions, and you can't be the person who checks each one.
FAQ
Does converting MOV to MP4 lose quality?
Yes, slightly, because you're re-encoding rather than copying. At CRF 23 with libx264 the loss is not visible at normal viewing distance for social and web delivery. If you need a true archive master, keep the original MOV and treat the MP4 as a delivery copy.
Can I convert MOV to MP4 without installing FFmpeg?
Yes. Post the file URL to a hosted transcode API and get back an MP4 URL. There's no binary to install, no version to pin, and no container to maintain. That's the whole point of the FFmpeg API approach for teams working in n8n, Make, or Zapier.
Why does my iPhone video play on Mac but not on Windows?
Because it's HEVC (H.265) in a MOV container. Safari and macOS decode HEVC natively; Chrome on Windows generally doesn't. Re-encoding to H.264 fixes it everywhere.
How long does an automated MOV to MP4 conversion take?
It scales with resolution and length, not container. A 60-second 1080p clip is typically well under a minute; 4K takes longer. Because the job is async with a webhook callback, your workflow doesn't sit blocked either way.
Can my AI agent do this conversion?
Yes. The MCP server exposes the same jobs as tool calls, so Claude or another agent can convert a MOV as a step in its own loop without you wiring up an HTTP node.
Grab an API key, point it at one of the MOV files currently sitting broken in your uploads folder, and see what comes back. The free tier covers enough to test the whole workflow before you commit to it: Sign up free.
About Javid Jamae
Founder & CEO at FFmpeg Micro
Javid is a software engineer, author, and entrepreneur with over 25 years of professional software development experience across enterprise, startup, and consulting environments. He founded FFmpeg Micro to make video processing accessible to developers through a simple, automation-first REST API.
You might also like

FFmpeg Concat Different Resolutions: Normalize, Then Copy
FFmpeg concat different resolutions fails with -c copy. Two fixes that work: normalize then demux, or a one-pass filter_complex concat, plus how to pick.

How to Fix n8n Running Out of Memory on Large Video Files
n8n large video files crash the instance because binary data sits in memory. Learn the real cause, the env vars that buy headroom, and the URL-passing fix.

Zapier video processing timeout isn't a plan limit. Go async.
A Zapier video processing timeout is an architecture problem, not a plan problem. Beat the 30-second cap and file size limits with an async video API.
Ready to process videos at scale?
Start using FFmpeg Micro's simple API today. No infrastructure required.
Get Started Free