Media Storage Comparison: Firebase, Cloudflare R2, and Cloudinary

Before choosing where to store your app's photos and videos, here's a direct comparison between the three available options. Each item below has a plain-language explanation, since some of these terms might be new to you.

Prices and limits are taken from each provider's official pages and are subject to change at any time from the provider itself.
🔥 Firebase Storage 🔵 Cloudflare R2 🟢 Cloudinary
Free storage per month Total size of all photos/videos kept on the server at once — like your phone's storage. Has nothing to do with how many times something is viewed.
🔥 Firebase Storage5 GB
🔵 Cloudflare R210 GB — a fixed cumulative allowance that does not renew on its own; freed only by deleting data (see the renewal row below)
🟢 CloudinaryA pool of 25 credits per month (up to 25 GB if fully spent on storage alone), shared with bandwidth and transformations
Free bandwidth per month (data transfer) How much data is sent to users' devices every time they open/view a photo or video. Different from storage: a 1 MB photo viewed by 1,000 people = 1,000 MB of bandwidth, even though the storage used is still only 1 MB.
🔥 Firebase Storage100 GB per month
🔵 Cloudflare R2Unlimited and always free — no cap at all
🟢 CloudinaryShared with the same 25-credit pool (1 credit = 1 GB of bandwidth)
Does it require linking a bank card for free activation? Important for you as a buyer: will you be asked for an active card from day one, even if your usage always stays within the free limit?
🔥 Firebase StorageYes, mandatory — but no money is ever charged for linking it. Everything stays exactly as free as before; the card only gets billed if your actual usage crosses the free limits. Google places a small temporary $0–$1 authorization hold to confirm the card is valid (not a real charge, auto-released within days). A zero-balance virtual/prepaid card often works, but Google's checks are stricter than Cloudflare's, so a card with a small balance is safer here.
🔵 Cloudflare R2Yes — Cloudflare requires linking a payment method to enable the R2 service itself, even to only use the free tier. Exactly like Firebase, no money is charged just for linking it, and you stay fully free unless you exceed the limits. Cloudflare's checks are more lenient than Google's — a zero-balance virtual/prepaid card is commonly reported to work fine here.
🟢 CloudinaryNo, no card needed within the free 25-credit limit
How the free limit renews All three renew monthly — but the renewal only applies to bandwidth and operations, never to storage itself.
🔥 Firebase StorageRenews monthly. This applies only to the bandwidth quota (100GB); the storage quota (5GB) is a fixed cumulative allowance that does not renew on its own — it only frees up when data is actually deleted.
🔵 Cloudflare R2Renews monthly. This applies to bandwidth (already unlimited) and to read/write operations only; the storage quota (10GB) is a fixed cumulative allowance that does not renew on its own. The free operations quota is 1 million write operations per month (these happen when media is uploaded to the app) and 10 million read operations per month (every single view or display of a photo or video counts as one read operation)
🟢 CloudinaryRenews monthly. This applies to the shared 25-credit pool covering bandwidth and transformations; the storage actually kept on the server does not renew on its own.
What happens when you exceed the free limit? The most important row for service continuity: is the extra usage billed quietly, or does everything stop at once for all users?
🔥 Firebase StorageAutomatic billing for the extra usage only (nothing stops, as long as the card is valid)
🔵 Cloudflare R2Automatic billing for extra storage/operations only — bandwidth stays free forever, no matter how much is used
🟢 CloudinaryA warning when close to the limit, then — if it keeps happening — full delivery of existing files and new uploads are blocked account-wide, all at once
Approximate price after exceeding the free limit Cost of each extra unit after the free limit is fully used (approximate prices, subject to change by each provider).
🔥 Firebase Storage≈$0.026 per extra GB stored, ≈$0.12–$0.15 per extra GB transferred
🔵 Cloudflare R2$0.015 per GB stored, $4.50 per million write operations, $0.36 per million read operations — bandwidth always free
🟢 Cloudinary$89/month on the Plus plan when billed annually (or $99/month billed monthly) for 225 credits instead of 25 — a direct jump to a full plan, no small incremental option
Best fit for a chat app with growing photos and videos The practical recommendation based on all the criteria above combined.
🔥 Firebase StorageA solid choice if you already have a working card and don't mind a small, gradual monthly bill
🔵 Cloudflare R2The best long-term fit, mainly because bandwidth — usually the biggest cost driver for chat apps — is always free
🟢 CloudinarySuitable mainly for a small project (roughly under 100 users). Note specific to your app: since it supports switching between multiple Cloudinary accounts, an admin can redirect new uploads to a fresh account once an account reaches about half its credit balance, while keeping the other half of the old account's balance reserved for bandwidth — because content already uploaded there keeps being viewed by users and needs ongoing monthly bandwidth. This stretches the free tier further but requires continuous manual account management; the simpler alternative is a single permanent account on a paid subscription.
Ranking — from most to least efficient for a continuously growing chat app:
  1. 🔵 Cloudflare R2 (recommended) — bandwidth (the cost driver that actually scales with your users) is free forever with no cap, storage is cheap ($0.015/GB), and overages are billed gradually and predictably.
  2. 🔥 Firebase Storage — a solid second choice if you're already on the Blaze plan for other Firebase services anyway. Renews monthly with gradual billing, but its free bandwidth (100GB/month) is still smaller than R2's unlimited allowance, so it becomes the more expensive option first as usage grows.
  3. 🟢 Cloudinary — the weakest fit for a growing app, not because of price, but because of what happens when you exceed the free 25 credits: full delivery and uploads can be blocked account-wide instead of a small gradual bill. Best used only for a small project or as a temporary option before switching.

Prices and limits can change from each provider at any time — it's always a good idea to check the official page for each service before making your final decision.

Back to the homepage