File storage and egress fees, explained
Why downloads can cost more than storage, and how Cloudflare R2, Backblaze B2, Amazon S3, Bunny and DigitalOcean Spaces compare as you grow.
· 5 min read
In short: storing files is cheap everywhere. What changes the bill is egress, the data sent out when people download or view your files. Amazon S3 charges for it past 100 GB a month; Cloudflare R2 never does. All prices below were checked in October 2026.
What file storage is for
Most apps need somewhere to keep files that users upload: profile photos, images in posts, PDFs, videos. These go in object storage, a service that stores each file (an "object") in a bucket and gives it a web address. Your database keeps the address; the storage keeps the file.
Three things are billed:
- Storage: how many gigabytes you keep, priced per GB per month.
- Operations: each upload, listing or download is a request. Some services charge per million requests.
- Egress: the data sent out to the internet. A 2 MB photo viewed 1,000 times is 2 GB of egress.
Egress is the one that surprises people, because it grows with how popular your files are, not how many you have.
The five services
Cloudflare R2
Cloudflare R2 has no egress fees at all, including through its S3-compatible API. There is no monthly fee. The first 10 GB of storage, 1 million writes and listings (Class A operations) and 10 million reads (Class B operations) each month are free. After that, storage is $0.015 per GB-month, Class A is $4.50 per million and Class B is $0.36 per million.
Backblaze B2
Backblaze B2 is the cheapest to store: the first 10 GB is free, then $6.95 per TB for 30 days. Uploads and most API calls are free on pay-as-you-go accounts. The exception is Class D calls (outbound calls and event notifications): the first 2,500 a day are free, then $0.004 per 10,000, and the builder does not count them.
Downloads are free up to 3 times the data you store each month, then $0.01 per GB. Downloads through partner CDNs such as Cloudflare, Fastly and bunny.net are free without that limit. A CDN (content delivery network) keeps copies of your files on servers around the world, so visitors download from one nearby.
Amazon S3
Amazon S3 Standard in US East costs $0.023 per GB-month for storage. Uploads and listings are $0.005 per 1,000 requests, and downloads $0.0004 per 1,000.
The first 100 GB of data out to the internet each month is free, shared across all your AWS services. After that, egress is $0.09 per GB for the first 10 TB. That rate is why S3 gets expensive for popular files. New AWS customers can get up to $200 in credits, which is not an ongoing free plan.
Bunny.net
Bunny.net combines a storage zone with its CDN. Standard storage in one region is $0.01 per GB, and CDN traffic to visitors in Europe and North America is $0.01 per GB. Traffic from storage to the Bunny CDN is free, and API calls have no fees. There is a $1 monthly minimum and a 14-day free trial.
CDN traffic costs more elsewhere: $0.03 per GB in Asia and Oceania, $0.045 in South America and $0.06 in the Middle East and Africa.
DigitalOcean Spaces
DigitalOcean Spaces is one flat $5 a month for 250 GiB of storage and 1,024 GiB of outbound transfer, shared across all your buckets. A CDN is included. Above that, storage is $0.02 per GiB and transfer $0.01 per GiB.
How they compare as you grow
The stack builder assumes each user uploads 20 MB of files and each stored file is downloaded twice a month. These are its estimates at that rate, including operations:
| Monthly users | Stored | Downloaded | R2 | B2 | S3 | Bunny | Spaces |
|---|---|---|---|---|---|---|---|
| 1,000 | 20 GB | 40 GB | $0.15 | $0.07 | $0.58 | $1.00 | $5.00 |
| 10,000 | 200 GB | 400 GB | $2.85 | $1.32 | $32.76 | $6.00 | $5.00 |
| 100,000 | 2,000 GB | 4,000 GB | $34.35 | $13.83 | $409 | $60.00 | $69.76 |
At 1,000 users, every option costs $5 a month or less. At 10,000 users, S3 already costs more than five times any of the others, and $27 of its $32.76 is egress. At 100,000 users, S3 is $409 a month.
B2 looks cheapest here because downloads at twice the stored data stay inside its free 3x allowance. If your files are downloaded more often than three times a month, B2 starts charging $0.01 per GB, unless you serve them through a partner CDN.
Bunny's figures assume visitors in Europe and North America. Spaces is flat until you pass its allowances, then rises.
Ways to keep egress low
- Pick storage with free or cheap egress if your files are public and popular: R2, or B2 behind a partner CDN.
- Put a CDN in front of files that many people view, so repeat downloads come from the CDN's copies.
- Shrink what you serve. Resize images on upload, so a thumbnail is not a full-size photo.
- Check where egress is counted. On S3, the free 100 GB is shared across all your AWS services, so another AWS service can use it up first.
What to pick
- Public files, images, anything popular: Cloudflare R2. No egress fees, and a 10 GB free allowance.
- Lots of stored data, few downloads, or served through a CDN: Backblaze B2 has the lowest storage price.
- You want storage and a CDN in one bill: Bunny.net, or DigitalOcean Spaces if a flat $5 suits you.
- You are already on AWS: S3 is fine for files that are rarely downloaded. For files the public downloads often, watch egress.
Try your own numbers in the stack builder, or browse every option under Object Storage & CDN.