In short
- R2 charges $0.015 per GB-month for standard storage, includes 10 GB-month free, and charges nothing for egress.
- A 10-minute Full HD video from our app is about 250 MB; kept for 30 days it costs under half a cent in storage.
- Because links expire, storage per user stays flat instead of growing every month.
- Operations, Workers requests and D1 queries fit in the free allowances at the volumes we expect at launch.
- We haven't launched: these are calculations from published prices, not invoices.
On Cloudflare R2, the storage for one client video costs fractions of a cent. Standard storage is $0.015 per GB-month, the first 10 GB-month are free, and there are no egress fees, so it doesn’t matter how many times your client presses play. A 10-minute Full HD video from JustRec is about 250 MB, and keeping it online for 30 days costs us less than half a cent.
We haven’t launched yet, so there’s no invoice to show you. Everything below is a calculation from Cloudflare’s published prices and the limits in our own server code. When real bills arrive, we’ll publish them next to these numbers.
What we’re storing
JustRec records on the Mac and uploads one MP4 when you share. The server is a Cloudflare Worker written with Hono. Videos, subtitles and thumbnails go to an R2 bucket restricted to the EU jurisdiction; metadata (title, sender name, size, duration, expiry date) goes to a D1 database, also restricted to the EU. Links expire after 3 days on Lifetime and 30 days on Personal and Team, and then the online copy is deleted.
How big is a video? Our planning document estimated 100 to 150 MB for 10 minutes of 1080p in HEVC. Then we switched the export to H.264, because it plays in every browser on every client’s computer. H.264 is bigger for the same quality. At the bitrate our exporter currently asks for, the numbers are:
| Resolution | Video + audio bitrate | 1 minute | 10 minutes |
|---|---|---|---|
| Full HD (1920×1080) | about 3.3 Mbit/s | about 25 MB | about 245 MB |
| Retina (2880×1800) | about 7.9 Mbit/s | about 60 MB | about 595 MB |
Bitrate targets set in our exporter, not measured averages.
Most client videos are much shorter than 10 minutes. For the rest of this article we use 250 MB per video: a long Full HD recording, rounded up. If you want smaller files from any recorder, our guide to making a screen recording smaller on Mac covers the trade-offs.
Two server limits cap the worst case: a single video can’t exceed 1 GB, and one Mac can have at most 5 GB of active links at the same time.
Cloudflare R2 pricing for video, the parts that matter
From Cloudflare’s R2 pricing page, standard storage class:
| Item | Price | Free each month |
|---|---|---|
| Storage | $0.015 per GB-month | 10 GB-month |
| Class A operations (writes) | $4.50 per million | 1 million |
| Class B operations (reads) | $0.36 per million | 10 million |
| Egress (Workers API, S3 API, r2.dev) | ✓ free | |
| Deletes and aborted multipart uploads | ✓ free |
Class A covers writes such as PutObject, CreateMultipartUpload, UploadPart and CompleteMultipartUpload; Class B covers reads such as GetObject and HeadObject. From Cloudflare's R2 pricing page, checked November 2026.
The detail that matters most for expiring links is how storage is measured: R2 averages the daily peak storage over a 30-day billing period. A file that exists for 3 days is billed for 3 days, not for the month.
There’s also an Infrequent Access class at $0.01 per GB-month, but it has a 30-day minimum storage duration and charges $0.01 per GB retrieved. For files that live 3 days and get watched right away, it’s the wrong tool.
One video, priced by how long it stays online
| Link lasts | Storage used | Storage cost |
|---|---|---|
| 3 days (Lifetime) | 0.025 GB-month | $0.000375 |
| 30 days (Personal, Team) | 0.25 GB-month | $0.00375 |
| One year, never deleted | 3 GB-month over the year | $0.045 per year, every year |
Estimates from published prices, before the free allowance, checked November 2026.
The first two rows are the whole lifetime cost of that upload. The third row is what a permanent library costs, and it keeps going.
Per user, per month
| How links behave | Storage online | Monthly storage cost |
|---|---|---|
| 3-day links | about 0.5 GB-month | about $0.0075 |
| 30-day links | about 5 GB-month | about $0.075 |
| Never expire, after 12 months | 60 GB, growing 5 GB a month | about $0.90, and rising |
Estimates from published prices, before the free allowance, checked November 2026.
With 30-day links, a user who shares every month reaches a steady state: old videos leave as new ones arrive, and the bill stays flat. With a permanent library, the same user costs more every month forever. That’s the core of why we made our links expire, and storage is only one of the reasons.
Scaled up to 1,000 users like the one in the example:
| Scenario | Storage online | Monthly storage cost |
|---|---|---|
| All on 3-day links | about 500 GB-month | about $7.35 |
| All on 30-day links | about 5,000 GB-month | about $75 |
Estimates from published prices, after the free 10 GB-month, checked November 2026.
Personal costs €6.90 a month billed yearly, so storage is a small line next to payment fees and VAT. The 5 GB active quota per Mac also means no single user can push storage past 5 GB-month.
Operations, Workers and D1 at our scale
Storage is only part of it. Here is what one share goes through, and what each step is billed as.
Press stop
Upload in 32 MB parts
About 12 Class A operations for a 250 MB video, including subtitles and thumbnail.
Client watches
Range requests
Each range is one Class B operation and one Worker request. No egress fees.
Day 3 or day 30
The link expires
The video page says so and asks the viewer to request a new link.
Within the hour
Cleanup deletes the files
An hourly Cron Trigger removes the online copy. Deletes are free.
Uploading. Our Worker receives the video in 32 MB parts and writes them to R2 as a multipart upload. The part size isn’t random: on Cloudflare’s Free and Pro plans a request body can be at most 100 MB, and R2 needs parts of at least 5 MiB, all the same size except the last. Sending parts through the Worker also means the app never holds storage credentials, and the server checks every part’s size and reads the real duration from the MP4 before the link goes live.
A 250 MB share costs about 12 Class A operations: one to create the multipart upload, 8 parts, one to complete it, plus the subtitle file and the thumbnail. 20 shares a month for 1,000 users is about 240,000 Class A operations, inside the free million.
Watching. Every time the browser asks for a piece of the video with a Range request, the Worker reads that range from R2: one Class B operation and one Worker request. How many ranges a view takes depends on the browser and how much the viewer skips around. Even at 50 per view, the free 10 million Class B operations cover 200,000 views a month. Data transfer costs nothing on either side: R2 doesn’t charge egress through the Workers API, and Workers have no bandwidth charges.
Workers. The Free plan includes 100,000 requests a day; the Paid plan starts at $5 a month with 10 million requests included, then $0.30 per million. Streaming a file is mostly waiting on the network, which doesn’t count as CPU time. The hourly cleanup job runs as a Cron Trigger, billed like any other request.
D1. Each page view and each video range reads one row by its id. Each share writes a few rows. The Free plan allows 5 million rows read and 100,000 rows written per day, with 5 GB of storage; metadata for a video is a few hundred bytes.
Deleting is free: DeleteObject and AbortMultipartUpload aren’t billed. Expiring links cost nothing to clean up.
What egress pricing would change
The reason we picked R2 is the line that says egress is free. With storage that bills for data transferred out, every full view of a 250 MB video costs 0.25 GB times the provider’s rate per GB. A handover video watched ten times by the client’s team is 2.5 GB of transfer; a link forwarded around an office is more. The bill would then depend on how popular your videos are, which you don’t control, and the cost of a share would be impossible to quote in advance.
With R2, the cost of a share is known when you press stop: its size times how long it stays online. Views only add read operations, at $0.36 per million.
What we don’t know yet
- Real file sizes. The bitrates above are what we ask the encoder for. Real files from mostly static screens may come out different; we’ll measure once people use the app.
- Views per video and ranges per view. We don’t track viewers, by design, so we’ll only see aggregate request counts in Cloudflare’s dashboard.
- When we’ll outgrow the Workers Free plan. It depends on how many range requests a view really takes. The Paid plan starts at $5 a month, so it’s a small decision either way.
- Costs outside Cloudflare. The Apple Developer Program is $99 a year, and payment fees and VAT take a bigger share of each sale than storage ever will.
Our first invoices will replace these estimates. Until then, the honest summary is: hosting short-lived client videos on R2 costs cents per user per month, and expiring links are what keep it that way.
If the privacy side interests you more than the cost, read why expiring video links are safer than a permanent library, or see how our video pages keep data in the EU. The plans these numbers support are on the pricing section.
Sources
- Cloudflare R2 pricing: storage, Class A and B operations, free tier, egress, GB-month calculation, checked November 2026.
- Cloudflare Workers pricing: Free and Paid plans, no bandwidth charges, Cron Triggers, checked November 2026.
- Cloudflare Workers limits: request body size by plan, CPU time, checked November 2026.
- Cloudflare D1 pricing: rows read, rows written, storage, checked November 2026.
- Cloudflare R2 multipart uploads: part size limits, checked November 2026.
- Cloudflare R2 data location and jurisdictions, checked November 2026.
- Cloudflare D1 data location, checked November 2026.
- Apple Developer Program: $99 annual membership, checked November 2026.
Frequently asked questions
How much does Cloudflare R2 cost for video?
Standard storage costs $0.015 per GB-month, with 10 GB-month free each month. Egress is free, so the number of views doesn't change the storage bill. You also pay for operations: writes at $4.50 per million and reads at $0.36 per million, after a free allowance.
Does Cloudflare R2 charge for bandwidth when people watch videos?
No. R2 doesn't charge egress for data read through the Workers API, the S3 API or r2.dev domains. Each read still counts as a Class B operation, and other Cloudflare services you put in front of the bucket may have their own charges.
How is R2 storage billed for files kept only a few days?
R2 averages the daily peak storage over a 30-day billing period. A 250 MB file kept for 3 days counts as about 0.025 GB-month, a tenth of what it would cost kept all month.
Is Cloudflare R2 good for streaming video?
It works well for progressive MP4 playback with range requests, which is what a single shared video needs. Adaptive streaming with many small segments multiplies the number of read operations, so model those before choosing it.



