Cloudflare R2 vs Backblaze B2
Cloudflare R2 and Backblaze B2 compared for S3-compatible object storage: storage and API prices, egress rules, free tiers, S3 API gaps, versioning and object lock, regions and data residency, event notifications, lifecycle rules and migration tools, as of November 2026.
Quick Answer
Both are S3-compatible object stores sold as cheaper alternatives to Amazon S3, but they price the opposite way. Cloudflare R2 charges $0.015 per GB-month for Standard storage plus per-request fees ($4.50 per million Class A writes and lists, $0.36 per million Class B reads), and egress is free with no cap. Backblaze B2 charges $6.95 per TB per month (about $0.007 per GB), makes Class A, B and C API calls free for pay-as-you-go accounts, and includes free egress up to 3x your average stored data, then $0.01 per GB. Egress to partner CDNs and compute providers such as Cloudflare, Fastly and bunny.net is unlimited and free. Both give the first 10 GB free. R2 is cheaper when you serve a lot of data straight to the internet relative to what you store, and it plugs into Workers, Queues and Cloudflare's CDN. B2 costs about half as much per stored terabyte, supports S3 Object Lock and file versioning that backup tools expect, and is the better home for backups and archives.
Last updated November 7, 2026. Covers R2 pricing, limits and S3 compatibility as documented by Cloudflare in October 2026, and Backblaze B2's $6.95/TB pay-as-you-go pricing, 3x free egress and API pricing from Backblaze's pricing pages, read in November 2026.
| Feature | Cloudflare R2 | Backblaze B2 |
|---|---|---|
| Storage Price | $0.015/GB-month Standard; $0.01/GB-month Infrequent Access | $6.95/TB/month (per byte-hour); volume and term discounts on annual capacity |
| Egress to Internet | Free, no cap, for every storage class | Free up to 3x average monthly storage, then $0.01/GB; unlimited free via partner CDNs/compute |
| API Request Pricing | Class A $4.50/M, Class B $0.36/M (Standard); $9.00/M and $0.90/M on IA; deletes free | Class A, B, C free on pay-as-you-go; Class D (event notification calls) 2,500/day free then $0.004 per 10,000 |
| Free Tier | 10 GB-month storage, 1M Class A, 10M Class B per month (Standard only) | First 10 GB storage always free |
| Storage Classes | Standard; Infrequent Access (30-day minimum, $0.01/GB retrieval) | One always-hot class (B2 Overdrive is a separate high-throughput product from $15/TB) |
| Main S3 API Gaps | No ACLs, object tagging, PutBucketVersioning, Object Lock headers, bucket website config or SSE-KMS (SSE-C supported) | No object-level ACLs, IAM roles, object tagging, website configuration or POST browser uploads; SSE-B2 and SSE-C supported |
| Object Versioning | Not supported through the S3 API (PutBucketVersioning unimplemented) | Yes: every upload of the same name creates a new version; hide/delete via lifecycle rules |
| Immutability / Object Lock | Bucket lock rules by prefix: retention period or indefinite (R2 API/Wrangler/dashboard, not S3 Object Lock) | S3-compatible Object Lock: governance and compliance modes, legal hold, default bucket retention, 1-3,000 days |
| Max Object Size | 4.995 TiB; single upload up to 4.995 GiB; 10,000 parts | 10 TB large files (parts 5 MB-5 GB); 5 GB per standard upload |
| Buckets per Account | 100,000 included, then $0.10 per bucket per month | 100 per account (Support can raise) |
| Regions & Data Residency | Automatic placement; best-effort location hints (wnam, enam, weur, eeur, apac, oc); EU, US and FedRAMP jurisdictions | US West, US East, EU Central or CA East, fixed per account at creation |
| Public Access / Custom Domain | Custom domain (zone in same Cloudflare account) with Cloudflare cache/WAF; r2.dev for testing only | Public buckets on Backblaze URLs; custom domains via Cloudflare or another CDN |
| Event Notifications | Cloudflare Queues: object-create / object-delete, up to 100 rules per bucket | Webhooks with optional signing secret; quickstart says to request access from Support |
| Lifecycle Rules | Expire objects or transition to Infrequent Access; up to 1,000 rules; default 7-day multipart abort | Hide and delete file versions, cancel unfinished large files; up to 100 rules per bucket |
| Migration Tools | Super Slurper (bulk) and Sippy (on demand), both free apart from R2 Class A ops | Assisted migration; Universal Data Migration add-on with qualifying commitment |
| Replication | Not covered on the pages we read | Cloud Replication within or between regions (Native API / web console); you pay storage only |
| Built-in Compute Integration | Workers binding, Queues, Cloudflare cache in front of custom domains | None built in; free egress to partners such as Vultr, CoreWeave, Equinix Metal and phoenixNAP |
Cloudflare R2
Cloudflare's S3-compatible object storage with zero egress fees. Buckets are reachable through the S3 API, a Workers binding and public custom domains on Cloudflare's network. Pricing is per GB-month of storage plus per-million Class A and Class B operations, with a Standard and an Infrequent Access storage class.
Pros
- No egress charges from R2 itself, whether data leaves through the S3 API, a Worker or an r2.dev domain, so read-heavy public workloads have no bandwidth line on the bill
- Strong global consistency for read-after-write, metadata updates, deletes and listings, per Cloudflare's consistency model
- Native Workers binding, Queues-based event notifications and Cloudflare cache, WAF and access controls on custom domains
- Infrequent Access class at $0.01 per GB-month with lifecycle rules that move objects from Standard automatically
- Free migration tooling: Super Slurper for one-off bulk copies and Sippy for copying objects on first request, paying only R2's own Class A operations
- 100,000 buckets per account included, which suits per-tenant bucket designs
Cons
- Per-request pricing adds up for small-object or chatty workloads: $4.50 per million writes or lists and $0.36 per million reads after the free tier
- Standard storage at $0.015 per GB-month costs roughly twice B2's rate, so capacity-heavy data such as backups costs more
- S3 API gaps that matter for backup tools: no bucket versioning API, no S3 Object Lock headers, no ACLs or object tagging
- Custom domains must be a zone in the same Cloudflare account, and r2.dev URLs are rate-limited and not meant for production
Best For
Apps and sites that serve a lot of data to the internet (user uploads, media, downloads, static assets), especially teams already on Cloudflare Workers, where free egress outweighs per-request fees.
Backblaze B2
Backblaze's always-hot object storage with an S3-compatible API and its own Native API. One storage class, billed per byte-hour at $6.95 per TB per month, with free Class A/B/C API calls on pay-as-you-go, free egress up to 3x stored data and unlimited free egress to partner CDNs. B2 Overdrive is a separate high-throughput tier for multi-petabyte buyers.
Pros
- About half R2's storage price: $6.95 per TB per month, with no minimum file size and no minimum storage duration
- Class A, B and C API calls are free for pay-as-you-go customers, so chatty and small-object workloads don't pay per request
- Free egress up to 3x average monthly storage, and unlimited free egress through partners including Cloudflare, Fastly, bunny.net, CacheFly, Vultr and CoreWeave
- S3 Object Lock with governance and compliance modes, legal hold and default bucket retention (1 to 3,000 days), which Veeam-style backup tools use
- File versions kept per name with lifecycle rules to hide and delete old versions, plus Cloud Replication within or between regions
- Fixed regional placement (US West, US East, EU Central, CA East) chosen at sign-up, with the same price in every region
Cons
- Egress past 3x stored data to non-partner destinations costs $0.01 per GB, which matters for download-heavy sites not behind a partner CDN
- You can't map a domain straight to a bucket; Backblaze points you to Cloudflare or another CDN for vanity URLs
- One region per account, fixed at creation; multi-region means separate accounts plus Cloud Replication
- S3 API gaps: no object-level ACLs, IAM roles, object tagging, bucket website config or browser POST uploads to pre-signed URLs
- 100 buckets per account by default; event notifications are webhooks that the docs say need Support to enable
Best For
Backups, archives, media libraries and other capacity-heavy data, especially anything that needs S3 Object Lock or versioning, or that is served through a partner CDN such as Cloudflare.
What each one costs at real sizes
R2 Standard costs $0.015 per GB-month, Class A operations (writes, lists, multipart steps) $4.50 per million, and Class B operations (reads, heads) $0.36 per million. The monthly free tier is 10 GB-month, 1 million Class A and 10 million Class B. Deletes are free, and usage is rounded up to the next billing unit. B2 bills $6.95 per TB per 30 days by the byte-hour, with the first 10 GB free and Class A, B and C calls free on pay-as-you-go. Some worked examples using decimal GB, list prices and the US West region for B2. 1 TB stored, 1 TB served, 1 million writes, 10 million reads: R2 is about $14.85 (operations fall inside the free tier) and B2 about $6.88. 10 TB stored with 20 TB served direct to users: R2 about $150 and B2 about $69.50, since 20 TB is inside B2's 30 TB of free egress. 10 TB stored with 50 TB served: R2 still about $150 plus operations, while B2 adds 20 TB of overage at $0.01 per GB, about $200, for roughly $270. Put that B2 bucket behind Cloudflare, a free-egress partner, and it drops back to about $70. On request-heavy workloads, 50 million small writes a month cost about $220 on R2 and nothing on B2.
Egress rules: free with no cap vs free up to 3x
Cloudflare's pricing footnote says egress straight from R2 is free whether it goes through the S3 API, the Workers API or an r2.dev domain. Other metered Cloudflare services in front of the bucket can still bill you. B2's base rule is free egress up to three times your average monthly storage, measured in byte-hours across the billing cycle, then $0.01 per GB. Backblaze also lists partners where egress is unlimited and free: Fastly, Cloudflare, bunny.net, CacheFly, CoreWeave, Equinix Metal, Vultr and phoenixNAP. B2 Overdrive, sold from $15 per TB a month with a multi-petabyte commitment, has unlimited free egress to any destination. For a site served through Cloudflare, both options end up with no bandwidth bill: R2 natively, or B2 through the Cloudflare partnership Backblaze documents. The real split is direct downloads without a CDN, such as API clients, CI runners pulling artifacts, or customers fetching large files from pre-signed URLs. There R2 never charges, and B2 starts charging once monthly downloads pass three times what you store. A 1 TB bucket that serves 5 TB of direct downloads a month pays about $20 in B2 overage, on top of $6.95 of storage.
S3 compatibility, versioning and object lock
Both claim S3 compatibility, and both have gaps. Cloudflare's compatibility table marks PutBucketVersioning, GetBucketVersioning, PutObjectLockConfiguration, bucket ACLs, object tagging and bucket website configuration as unimplemented. On PutObject it rejects x-amz-object-lock-* headers and AWS SSE-KMS headers but accepts SSE-C and the STANDARD and STANDARD_IA storage classes. R2's immutability feature is bucket locks: prefix-based rules with a retention period or indefinite retention, set from the dashboard, Wrangler or the Cloudflare API rather than the S3 Object Lock calls. B2's S3-Compatible API lists PutObjectLockConfiguration, PutObjectRetention and PutObjectLegalHold among its Class A calls. Object Lock supports governance and compliance modes, legal holds and default bucket retention from 1 to 3,000 days, and once enabled on a bucket it can't be disabled. B2 also keeps a version for every upload of the same file name and exposes them through b2_list_file_versions and ListObjectVersions. Backblaze's own gaps are object-level ACLs, IAM roles, object tagging, website configuration and browser POST uploads to pre-signed URLs. In practice, backup software that turns on S3 Object Lock for ransomware protection works against B2 and not against R2's S3 endpoint.
Regions, residency and where the data sits
R2 places a new bucket automatically in the closest available region to the request that created it. Location hints (wnam, enam, weur, eeur, apac, oc) let you steer that, but Cloudflare calls them best effort, not a guarantee, and a hint only counts the first time a bucket name is created. For hard requirements, R2 jurisdictions (eu, us and fedramp) guarantee objects are stored within that jurisdiction, chosen per bucket. Reads are strongly consistent everywhere: a write, metadata change, delete or listing is visible globally as soon as it completes. Only API token permission changes are eventually consistent, taking up to a minute. B2 fixes residency at the account level. At sign-up you choose US West (Sacramento and Phoenix), US East (Reston, Virginia), EU Central (Amsterdam) or CA East (Toronto), and you can't change it later. Prices don't vary by region. Data in a second region means a second account and Cloud Replication, which copies between buckets within or across regions. Backblaze charges only for storing the extra copy, not for the transfer. If one product needs EU-only buckets beside US buckets, R2 handles that in one account. With B2 you manage two accounts.
Events, lifecycle, compute and migration
R2 event notifications publish object-create and object-delete events (including lifecycle deletions) to a Cloudflare Queue, consumed by a Worker or pulled over HTTP from outside Cloudflare. Each bucket allows up to 100 rules, and Cloudflare advises splitting rules across queues past 5,000 messages a second. B2 posts events to a webhook, optionally signed with a secret. Its quickstart says you request access from Support, and outbound notification calls are Class D: 2,500 a day free, then $0.004 per 10,000. Lifecycle rules differ too. R2 can expire objects or move them to Infrequent Access, allows up to 1,000 rules, and aborts unfinished multipart uploads after seven days by default. B2 rules hide and delete file versions and cancel unfinished large files, up to 100 per bucket, with no storage tiers to move between. R2 is the one with built-in compute, through Workers bindings and Cloudflare's cache and WAF on custom domains. For moving data in, R2 has Super Slurper for bulk copies and Sippy, which copies each object from the old provider the first time it's requested. Both are free apart from the Class A operations they cause on R2. Backblaze offers assisted migration and a Universal Data Migration add-on with qualifying commitments.
Verdict
Pick by what you do more of: storing data or serving it. If the bucket backs a public app (user uploads, images, video, downloads, static assets) and monthly egress regularly runs past three times what you store, use Cloudflare R2. Egress is free with no ceiling, the free tier covers 10 million reads a month, and on Workers you get a native binding, Queues events and Cloudflare's cache in front of a custom domain. Watch the request count: millions of tiny writes or list calls are where R2 bills climb. For backups, archives, NAS offsite copies, media libraries and data you write once and read rarely, use Backblaze B2. Storage costs $6.95 per TB against R2's $15, API calls are free on pay-as-you-go, and its S3 Object Lock and file versioning work with backup tools that expect them. R2's bucket locks aren't exposed through the S3 Object Lock API. If you want B2's storage price and R2-style free delivery together, put B2 behind Cloudflare's CDN: Backblaze documents the setup, and egress to Cloudflare is free. If you need EU or FedRAMP data residency on a per-bucket basis, R2's jurisdictions are more flexible. B2 fixes the region per account.

