I ran ffprobe against my own hero video last Tuesday, expecting to feel fine about it. Eight seconds. 1080p. 4,015,025 bytes.
Four megabytes for eight seconds of a person turning toward a camera, pulled by every visitor who lands on the homepage before they read a single word. I opened this investigation convinced that Mux free tier pricing was the wall I was about to hit, because I assumed a free allowance sized for demos and an autoplay loop served on every page load could only end one way. Then I read the actual numbers, and the wall turned out to be somewhere else entirely.
What does the Mux free tier actually cover?

Mux gives you 100,000 minutes of video delivery free every month at any resolution, and that allowance resets each month. It is a recurring allowance rather than a trial credit that burns down once. The Mux Video pricing documentation puts the 2026 rate after that allowance at $0.001 per minute delivered for 1080p on Basic or Plus quality, and $0.0008 per minute at 720p.
Run my eight-second loop through that. One play costs 0.133 minutes. The free allowance covers roughly 750,000 plays a month before Mux invoices a cent. Storage is similarly small at $0.003 per minute per month for 1080p, so keeping my entire video library hot would cost under a dime. Encoding at Basic quality is free outright.
One detail deserves a flag, because it is the part that catches people out. Mux charges for segments that were delivered, not segments that were watched. A player that buffers three segments ahead for a visitor who bounces after two seconds still bills you for three segments, and autoplay widens that gap on every single session.
The bandwidth bill lands before the video bill

Self-hosting the MP4 starts costing you money at roughly a third of the traffic Mux would charge you for. That finding inverted the assumption I walked in with, and it is the whole argument of this post.
Vercel includes the first 1 TB of Fast Data Transfer on Pro, then charges $0.15 to $0.35 per GB depending on which region the request came from, per its regional pricing table. Divide that 1 TB by my 4.015 MB hero file and you get about 249,000 page loads. Divide Mux's 100,000 free minutes by an eight-second play and you get 750,000. Same video, same traffic, and the metered CDN runs out three times sooner than the video platform everyone assumes is the expensive option.
Actually, that understates it. My hero is not the only video on the site. A find across public/ turns up eighteen files totalling 39.66 MB, including a 56.9-second Callidus demo at 6.2 MB and the 42-second reel on the BookBed property management case study. A visitor who lands on the homepage and then opens two project pages pulls closer to fifteen megabytes than four. If you are running the standard Next.js on Vercel with a Postgres backend, Fast Data Transfer is the meter that decides this question, not compute.
Vercel has been saying this for a while, in politer language than mine. Its knowledge base article on hosting video files on Vercel recommends against serving video from your deployment at all, and points instead at Blob, Mux, Cloudinary, or S3 with a CDN in front. When the platform whose bandwidth you would be buying tells you to buy someone else's, that is worth reading twice.
Mux free tier pricing against self-hosting and Cloudflare Stream

At every traffic level below half a million monthly visits, Mux is the cheapest of the three options, and it is cheapest by being free. The table models one eight-second 1080p autoplay loop per visit, which is the honest floor rather than a worst case.
| Monthly visits | Self-hosted MP4 on Vercel Pro | Mux | Cloudflare Stream |
|---|---|---|---|
| 100,000 | $0 (401 GB, inside the 1 TB) | $0 (13.3k min, inside free tier) | ~$18 |
| 250,000 | ~$1 (1,004 GB, just over) | $0 (33.3k min) | ~$38 |
| 500,000 | $151–$353 (1 TB over) | $0 (66.7k min) | ~$72 |
| 1,000,000 | $452–$1,055 (3 TB over) | ~$33 (33.3k billable min) | ~$138 |
Cloudflare Stream charges from the first minute with no free allowance: $1 per 1,000 minutes delivered and $5 per month per 1,000 minutes stored, with encoding and egress included in that price. It is the most expensive option at low traffic and the second cheapest at high traffic, which is a reasonable trade if what you want is a bill that grows in a straight line instead of a step function.
One thing shifted two days before I wrote this. Vercel made Flat Rate CDN generally available for Pro teams on 8 September 2026, swapping usage-based CDN billing for a fixed monthly bill that bundles Fast Data Transfer and CDN requests, with spike protection on by default. If you sit in the 500,000-visit row and self-hosting was ruled out by that $151-to-$353 spread, the spread is now something you can convert into a flat number. Read the tier pricing before you assume it rescues the plan.
The Hobby plan is not a fallback here
You cannot fall back to the Hobby plan when the bill arrives, because exceeding a usage limit there pauses the feature for thirty days. That is what Vercel's Hobby plan documentation says happens. No overage to pay, no card to throw at the problem. Hobby is also restricted to non-commercial personal use, which rules it out the moment your portfolio starts doing sales work.
When is self-hosting the MP4 still the right call?
Self-host when the clip is short, cached hard, and your traffic sits comfortably inside the transfer already included in your plan. That describes most portfolios and most marketing sites, and at that scale a video platform adds an integration and a dependency for zero saving.
Three conditions push me toward keeping the file in public/:
- The clip is under ten seconds and loops. Adaptive bitrate has nothing to adapt to across an eight-second window, and the HLS manifest round trip costs more latency than a rendition switch would ever save you.
- You control the encode and you actually did the work. My hero sits at 4 MB for 8 seconds, which is roughly 4 Mbps, and that is lazy for a looping background. Re-encoding at 1.5 Mbps with a 720p rendition for narrow viewports cuts the transfer by more than half and nobody notices the difference.
- The video is decorative and nobody ever scrubs it.
Push toward a platform when any of those break: long-form video where viewers seek, a library that grows every month, or an audience on connections you cannot predict. That last one is the real argument for adaptive bitrate. A single MP4 has exactly one bitrate, so the viewer on hotel wifi is handed the same 4 Mbps stream as the viewer on fibre, and then waits.
There is a delivery question sitting underneath all of this that is worth understanding on its own terms, and it is why Vercel quotes a per-GB range instead of a number. Bytes cost different amounts depending on where they are served from, which is how edge delivery changes the cost of a byte.
How do you find your own crossover point?
Measure the payload per visit, multiply by monthly visits, and compare that against the transfer already included in your plan. Do it before you open a single vendor pricing page. Twenty minutes, from a terminal.
- List every video asset you ship, with its exact byte count.
find public -type f -name "*.mp4" -printf "%s\t%p\n" | sort -rnranks the whole set worst first. Mine surfaced a 6.2 MB file I had forgotten was autoplaying on a project page. - Get the duration of each one with
ffprobe -v error -show_entries format=duration -of csv=p=0 <file>. You need seconds as well as bytes, because platform pricing meters minutes while CDN pricing meters bytes, and the two rank your files in a different order. - Open analytics and find the real number of sessions that reach each page carrying video. Total sessions will overstate it badly. The homepage number and the project-page number are usually far apart.
- Multiply bytes by sessions for the CDN column. Multiply seconds by sessions and divide by sixty for the platform column.
- Compare both figures against the allowance included in the plan you are already paying for. If both land under it, you have no decision to make this quarter, and the correct move is to go build something else.
- Set a spend alert at seventy percent of the included transfer. Everyone skips this step, and it is the only one that catches the crawler that walks your whole library at 3am.
That last case is not hypothetical. A bot with no cache and no range-request discipline will pull every file you expose, and a metered CDN will bill you for the walk.
Run that find command against your own public/ directory tonight and read the top line. If the biggest file on the list is something you added for polish and never re-encoded, you have just found a bandwidth line item that costs nothing to fix and needs no vendor migration to fix it. If you are weighing the wider build economics rather than only the delivery bill, the app cost estimator covers the rest of the picture, and the same arithmetic decides whether WordPress or a custom website is cheaper to run once media enters the equation.
So: what is your payload per visit, and does anyone on your team know the number?
