You have a looping video on a landing page and a "free tier" that sounds generous. Before you pick a platform, do one thing: list your video files with byte counts and durations. I did that for the repo behind this site on 30 September 2026. The hero loop (public/hero-avatar-video.mp4) is 8.0 seconds of 1080p and weighs 4,015,025 bytes, about 4 MB.
That single number decides more than any pricing page. A common assumption is that the free tier is the wall you will hit, and the arithmetic below says the wall sits somewhere else. Every price is from the vendor's own page, fetched on 30 September 2026, and the assumptions are labelled.
What does the Mux free tier actually cover?
Mux delivers the first 100,000 minutes each month free, at any quality or resolution, and the allowance resets monthly. Basic-quality encoding is free too, so a small library costs almost nothing to keep on Mux.
The Mux Video pricing documentation lists delivery at $0.0008 per minute for 720p and $0.001 per minute for 1080p after the free allowance, with storage at $0.0024 and $0.003 per minute per month. At 1080p, one play of my 8-second loop is 0.133 minutes, so the free allowance covers about 750,000 plays. Storage for a clip that short is a rounding error.
One metering rule matters for autoplay. Mux's docs state that "if a segment of video is delivered, it is charged, even if the viewer doesn't actually watch the video," and give the example of a player buffering 20 seconds ahead. My model below assumes each visit delivers the whole 8 seconds once, so a looping player that replays the clip would consume more delivered minutes than the table shows.
When does self-hosting an MP4 on Vercel cost more than Mux?
For a 4 MB loop, self-hosting on Vercel Pro starts costing money at roughly a third of the traffic where Mux would. The reason is that the CDN meters bytes while the video platform meters minutes, and a short clip is cheap in minutes and expensive in bytes.
The Vercel Pro plan page says the included Flat Rate CDN tier covers 1 million CDN requests and 1 TB of data transfer each month. Beyond that, the regional pricing table lists Fast Data Transfer at $0.15 to $0.35 per GB depending on region. Divide 1 TB by 4.015 MB and you get about 249,000 hero loads. Mux's 100,000 free minutes divided by 8 seconds gives 750,000 plays. Same clip, same visits, and the byte meter runs out first.
Why one video is rarely the whole payload
The hero is not the only clip in the repo. A file listing of public/ shows 14 MP4 files totalling about 39.3 MB, including the Callidus demo (6.5 MB, 56.9 seconds) and the BookBed case study reel (3.4 MB, 42 seconds). Consider a visitor who lands on a page with the hero and then opens two case studies: that is roughly 4 + 6.5 + 3.4 = 14 MB, not 4. That is a hypothetical path, not a measured one, but it shows why you count files instead of pages. If you run the Next.js on Vercel stack with Postgres, transfer is the meter that decides this question, not compute.
Vercel's own guidance points the same way. Its guide to hosting videos says large video files can consume excessive bandwidth, and lists Vercel Blob, Vimeo, S3 with a CDN, Mux and Cloudinary as options.
The Hobby plan is not a fallback
If you exceed a usage limit on Hobby, the plan documentation says that in most cases you wait 30 days before using the feature again. It includes 100 GB of Fast Data Transfer, about 25,000 loads of a 4 MB clip, and restricts the plan to non-commercial personal use. That makes it a poor place to put video for anything that sells.
How do Mux, self-hosting and Cloudflare Stream compare at each traffic level?
Below about a million monthly visits, Mux is the cheapest of the three options, and it is cheapest because the free tier absorbs everything. The table models one 8-second 1080p play per visit and counts video bytes only.
| Monthly visits | Self-hosted MP4 on Vercel Pro (on-demand rates beyond 1 TB) | Mux | Cloudflare Stream |
|---|---|---|---|
| 100,000 | $0 (about 401 GB, inside the 1 TB) | $0 (13.3k min, inside the free tier) | about $18 |
| 250,000 | about $1 (1,004 GB, just over) | $0 (33.3k min) | about $38 |
| 500,000 | $151 to $353 (about 1 TB over) | $0 (66.7k min) | about $72 |
| 1,000,000 | $452 to $1,055 (about 3 TB over) | about $33 (33.3k billable min) | about $138 |
Cloudflare Stream has no free allowance: $1 per 1,000 minutes delivered and $5 per month per 1,000 minutes of storage capacity, with ingress, encoding and bandwidth included. The Stream column above is delivery plus one $5 storage block. It costs the most at low traffic and grows in a straight line, which suits you if you would rather have a predictable bill than a free tier that ends.
Flat Rate CDN changes the self-hosting column
Vercel announced Flat Rate CDN for Pro teams on 8 September 2026: a fixed monthly bill for data transfer and CDN requests, with higher capacity tiers you can buy and spike protection within fair use. The overage ranges in my table are on-demand list rates. If you would hit them, read the tier prices before deciding, because a fixed tier may beat them. I have not modelled those tiers.
When self-hosting the MP4 is still the right call
Self-host when the clip is short, cached hard and your monthly transfer sits inside what your plan already includes. That describes most portfolios and marketing sites, where a video platform adds an integration for no saving.
Three conditions favour keeping the file in public/:
- The clip is under ten seconds and loops. Adaptive bitrate has almost nothing to adapt to in an 8-second window.
- You control the encode. My hero works out to about 4 Mbps (4,015,025 bytes over 8 seconds), which is generous for a background loop. Re-encoding at a lower bitrate, or adding a 720p rendition for narrow screens, would cut transfer. I have not re-encoded it, so I can't quote the saving.
- The video is decorative and nobody scrubs it.
Move to a platform when viewers seek through long-form video, when the library grows every month, or when your audience is on connections you can't predict. A single MP4 has one bitrate, so a visitor on weak wifi gets the same stream as one on fibre. How far bytes travel also changes their price, which is the edge computing angle behind Vercel's per-GB range.
How do you find your own crossover point?
Multiply the bytes each visit loads by monthly visits and compare the result with the transfer already included in your plan, before you open any vendor page. It takes about twenty minutes from a terminal.
- List every video with its exact size:
find public -type f -name "*.mp4" -printf "%s\t%p\n" | sort -rnranks them largest first. - Get each duration with
ffprobe -v error -show_entries format=duration -of csv=p=0 <file>. You need seconds as well as bytes, because platforms bill minutes and CDNs bill bytes, and the two rank your files differently. - Open analytics and count the sessions that reach each page carrying video. Total sessions will overstate it.
- Multiply bytes by sessions for the CDN column. Multiply seconds by sessions, divided by 60, for the platform column.
- Compare both with the allowance in the plan you already pay for. If both fit, you have no decision to make this quarter.
- Set a spend alert at 75% of your included usage. Vercel's Pro plan page says it notifies you at 75% of the monthly credit, and you can add your own thresholds under spend management.
If you also want the wider build economics, the app cost estimator covers the rest of the picture, and the same byte arithmetic applies to WordPress versus a custom website once media is heavy.
Run the find command in step 1 against your own public/ folder now and read the top line. What is the biggest file you serve, and does anyone on your team know how many sessions load it?



