Skip to content

Cloudflare R2 to Backblaze B2: Move Cold Buckets and Cut Storage Cost by More Than Half

Move objects from Cloudflare R2 to Backblaze B2 for cheaper long-term storage — rclone, small manual copies, or a server-side copy with CloudsLinker.

Introduction

Backblaze B2 charges $6.95 per TB per month for storage, while Cloudflare R2 Standard costs $0.015 per GB-month — about $15 per TB. R2 earns that premium with free egress, which matters for images, downloads and Worker assets that get read constantly. It stops mattering for the buckets that are written once and rarely opened again: database dumps, backup sets, log archives, finished media projects. A 5 TB archive sitting in R2 Standard costs roughly $75 a month; the same data in B2 costs about $35.

Leaving R2 is cheap because R2 charges nothing for egress, so the move itself mostly costs read operations — usually inside the free tier. Neither vendor offers a migration tool for this direction: Cloudflare's Super Slurper only imports into R2, and Backblaze's migration service does not list R2 as a source. The guide below is a four-phase runbook — prepare B2, copy, verify, cut over — with rclone and CloudsLinker as the two ways to do the copy.

The short answer

  • B2 stores data for $6.95 per TB-month; R2 Standard costs $0.015 per GB-month, about $15 per TB. Cold data costs 54% less on B2.
  • Leaving R2 costs almost nothing. R2 has no egress fee, and reading objects uses Class B operations, 10 million of which are free every month.
  • Keep a bucket on R2 if it is downloaded more than about 3.8 times its size every month — beyond that, B2's egress charges outweigh the storage saving.

The Cost Math

Cloudflare R2 and Backblaze B2 price the same thing in opposite ways: R2 charges more to store and nothing to download, B2 charges less than half as much to store and includes free downloads only up to three times what you keep there.

Monthly storage cost 1 TB 5 TB 20 TB
R2 Standard ($0.015 / GB-month, first 10 GB free) $14.85 $74.85 $299.85
R2 Infrequent Access ($0.01 / GB-month, no free tier) $10.00 $50.00 $200.00
Backblaze B2 ($6.95 / TB-month, first 10 GB free) $6.88 $34.68 $138.93

Storage only, 1 TB = 1,000 GB. Prices checked October 2026 on the R2 pricing page and the B2 pricing page.

Where the break-even sits. B2 includes free egress up to 3x your average stored volume, then charges $0.01 per GB. Each TB moved to B2 saves $8.05 a month, which pays for 805 GB of overage, so B2 stays cheaper until a bucket is downloaded about 3.8 times its own size in a month. Backups, database dumps, log archives and finished projects sit far below that line; public images, downloads and Worker assets often sit above it and belong on R2.

What the move itself costs. Listing a bucket is a Class A operation (up to 1,000 keys per call, 1 million free per month, then $4.50 per million). Reading each object is Class B (10 million free, then $0.36 per million). There is no egress fee and no retrieval fee on Standard storage, and B2 charges nothing for uploads. A 5 TB bucket of 1 million Standard objects therefore costs close to nothing to move. Objects in R2 Infrequent Access are the exception: they carry a $0.01 per GB retrieval fee, about $50 for 5 TB.

Phase 1 — Prepare the B2 Side

Most migration problems on this route come from B2 defaults that nobody changed. Do these before any data moves:

  1. Create the bucket under Buckets → Create a Bucket and leave it private.
  2. Change its versioning. B2 keeps every version of a file by default, and a deleted file is only hidden, so overwrites during a re-run are stored — and billed — twice. Open the bucket's Lifecycle Settings and choose Keep only the last version; the old copy is then hidden for a day and deleted (lifecycle rules).
  3. Check Caps & Alerts. A daily storage or transaction cap set long ago will stop a large upload halfway.
  4. Create an application key under Application Keys → Add a New Application Key, with Read and Write access to all buckets or to the target bucket. Copy the keyID and applicationKey; the key is shown only once.
    Backblaze Add Application Key dialog with key name, bucket access set to All, Read and Write selected, and the Create New Key button
  5. Collect the R2 credentials. In the Cloudflare dashboard, open R2, copy your Account ID (it forms the endpoint https://<ACCOUNT_ID>.r2.cloudflarestorage.com) and open Manage R2 API Tokens.
    Cloudflare R2 Overview page with the Account details box highlighted as Step 1, Copy your Account ID, and an arrow to the Manage R2 API Tokens link as Step 2; the account email and the Account ID value are blurred
    Create a token. Admin Read & Write can list every bucket; an Object Read & Write token cannot list buckets even when applied to all of them, so with that type you will have to name the bucket. Copy the Access Key ID and Secret Access Key — Cloudflare shows them once.
    Cloudflare R2 API token form listing the four permission types — Admin Read & Write, Admin Read only, Object Read & Write, Object Read only — with Object Read & Write selected, Apply to all buckets in this account chosen, TTL set to Forever and empty client IP filters; the account email in the sidebar is blurred

Phase 2 — Copy the Objects

Super Slurper and Sippy only copy data into R2, and Backblaze's Universal Data Migration lists AWS, Azure, Google Cloud and Wasabi as sources, so the copy needs a third tool. Two handle whole buckets well. For a few gigabytes, a desktop S3 client such as S3 Browser or Cyberduck plus the B2 web uploader is enough, at the cost of routing everything through your own connection twice.

Option A: rclone on a server you already run

rclone reads R2 through its S3 backend and writes B2 through its native backend. The data streams through the machine running it, so use a server with good bandwidth. In rclone.conf:

[r2]
type = s3
provider = Cloudflare
access_key_id = YOUR_R2_ACCESS_KEY_ID
secret_access_key = YOUR_R2_SECRET_ACCESS_KEY
endpoint = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com

[b2]
type = b2
account = YOUR_B2_KEY_ID
key = YOUR_B2_APPLICATION_KEY
rclone copy r2:archive-bucket b2:archive-bucket --fast-list --transfers 16 --progress

Use copy, not sync or move, until Phase 4.

Option B: CloudsLinker, with nothing to run yourself

CloudsLinker reads R2 over the S3 API and writes B2 over the native B2 API on its own servers, so there is no machine to rent or watch. It uses the keys you collected in Phase 1.

Step 1: Connect Cloudflare R2

Click Add Cloud and choose Cloudflare R2. Enter a name, the Access Key ID, the Secret Access Key and the Endpoint with your own account ID. Fill in Bucket only if you created an Object Read & Write token.

CloudsLinker Add Cloud page filtered to S3 providers with the Connect Your Cloud Storage dialog for Cloudflare R2 open: a notice that browsing all buckets needs an Admin Read & Write token, the Name field set to Cloudflare R2, empty Access Key ID and Secret Access Key fields, an Endpoint field with the placeholder https://ACCOUNT_ID.r2.cloudflarestorage.com, an optional Bucket field and the I got it, Authorize Now Cloudflare R2 button

Step 2: Connect Backblaze B2

Click Add Cloud again and choose Backblaze B2. Put the keyID in Account ID or Application Key ID and the secret in Application Key; B2 connects through its native API, so the Endpoint field can stay empty.

CloudsLinker Connect Your Cloud Storage dialog for Backblaze B2: the Name field set to Backblaze B2, empty Account ID or Application Key ID and Application Key fields, an Endpoint field showing only the placeholder option, and the I got it, Authorize Now Backblaze B2 button; Cloudflare R2 is already listed under My clouds in the sidebar

Step 3: Configure the Transfer

On Create transfer task, pick the R2 bucket or a prefix as the source and a folder in the B2 bucket as the target (the target side selects folders only and can create a new one). Leave the mode on Copy — Move deletes each object from R2 after copying. The default conflict strategy re-sends a same-name file only when its size differs or its date is newer, which keeps re-runs from creating B2 versions. Filters accept file extensions or a size range in MB.

CloudsLinker Create transfer task page with Cloudflare R2 as the source — backups and logs checked inside archive-bucket, public-assets left unchecked — and the from-r2 folder inside the archive-bucket bucket on Backblaze B2 selected as the target; the conflict strategy is on its default, Filter and Schedule are off, Skip Empty Folder and Copy are checked, Move is not

Step 4: Start and Monitor the Transfer

Click Create transfer and follow the task in Task monitor (All, Running, Scheduled and Failed tabs, Retry on finished tasks). The browser can be closed while it runs. In the example below, Task1 was a trial run on the logs prefix; when Task2 reaches those objects they already sit in B2 unchanged, so they are counted under Skipped instead of being uploaded a second time.

CloudsLinker Task monitor with two Cloudflare R2 to Backblaze B2 tasks: Task2 from archive-bucket/backups running at 35.43 percent with Files 1846/5210, Completed 147.73 GB/412.6 GB, Speed 58.21 MB/s, Skipped 1204 and a Cancel button, and Task1 from archive-bucket/logs Finished with Files 1204/1204, Completed 2.31 GB/2.31 GB and a Retry button

Phase 3 — Verify the Copy

Check Where Why it matters
Object count and total size R2 bucket → Metrics; B2 bucket list (Current Files, Current Size) A count mismatch means objects were skipped; tiny size differences are usually rounding
Per-object sizes rclone check r2:archive-bucket b2:archive-bucket --size-only R2's S3 API uses MD5 and B2 uses SHA-1, so the two have no checksum in common
Contents, if you need certainty add --download to the check Compares bytes by reading every object again — Class B operations on R2, bandwidth on your server
A sample by hand Download from the B2 console The largest object, a few small ones, and names with spaces or non-Latin characters

Object size limits are not a concern: R2 objects top out at 4.995 TiB and B2 large files at 10 TB (R2 limits, B2 large files).

Phase 4 — Cut Over and Clean Up

  1. Catch up on new writes. If the bucket is still in use, re-run the copy — or save the CloudsLinker task with a weekly or monthly schedule (paid plans) — so only new or changed objects are sent.
  2. Repoint what reads the data. Backup tools, scripts, Workers and public URLs that use R2 need the B2 endpoint and keys.
  3. Stop writing to R2 and run one last pass.
  4. Delete from R2 after a waiting period. Deletes are free; objects in Infrequent Access are billed for 30 days regardless. If you use rclone sync or move against B2 from here on, remember that files removed on the B2 side are hidden and still billed unless you add --b2-hard-delete.
  5. Revoke the migration keys — the R2 API token and the B2 application key.

Frequently Asked Questions

Yes. Save the CloudsLinker transfer as a scheduled task — weekly or monthly, available on paid plans — and each run copies only objects that are new or have changed in size or date. Pick a cut-over day, stop writing to R2, run one last pass, then point your application at B2.

Through R2's S3-compatible API. Create an R2 API token in the Cloudflare dashboard, then enter its Access Key ID and Secret Access Key plus your account endpoint https://<ACCOUNT_ID>.r2.cloudflarestorage.com. To browse every bucket the token needs the Admin Read & Write permission; an Object Read & Write token cannot list buckets, so if you use one, type the bucket name into the optional Bucket field.

B2 keeps every version of a file by default. If a transfer overwrites an object, the older copy is hidden but still stored and billed. Set the bucket's lifecycle setting to Keep only the last version before you start, or use a custom rule that deletes hidden versions after a set number of days.

In practice, no. R2 objects can be up to 4.995 TiB and B2 large files up to 10 TB, so anything that fits in R2 fits in B2. Files over 5 GB are written to B2 as multi-part large files, which transfer tools handle automatically.

Yes. Object keys are copied as they are, so prefixes such as backups/2026/ become the same folder paths in the B2 bucket. If you choose a target folder inside the B2 bucket, the whole tree is placed under that folder.

Yes. Select a single prefix as the source instead of the whole bucket, and use CloudsLinker's filters to include or exclude file extensions or limit file size in MB. Running one task per top-level prefix also makes it easier to verify and retry.

B2 has no fixed plan size, but account owners can set Caps & Alerts on daily storage and transactions. If a storage cap is reached, uploads fail until it is raised. Check the caps in the Backblaze console before moving a large bucket.

Both connections use API keys that you can scope and revoke: an R2 token can be limited to specific buckets, and a B2 application key can be limited to one bucket and to read or write access. Data moves between the providers over HTTPS. After the migration, delete both keys from their dashboards.

Conclusion

For a few gigabytes, a desktop S3 client and the B2 web console are enough. For whole buckets, rclone works well if you have a server with good bandwidth to run it on, and it gives you full control over flags and verification. If you would rather not run anything yourself, CloudsLinker connects R2 with its S3 credentials and B2 with an application key, then copies bucket to bucket on its own servers. Whichever route you pick, set the B2 bucket's lifecycle to Keep only the last version before the first run, and keep R2 for the hot, publicly served data where its free egress pays off.

Related: Backblaze B2 to IDrive e2, Amazon S3 vs Backblaze B2, Amazon S3 vs Cloudflare R2, and the cloud storage pricing comparison.

Online Storage Services Supported by CloudsLinker

Transfer data between over 58 cloud services with CloudsLinker

OneDrive

OneDrive

Google Drive

Google Drive

Google Photos

Google Photos

Shared Drive

Shared Drive

OneDrive for Business

OneDrive for Business

Dropbox

Dropbox

Box

Box

Mega

Mega

pCloud

pCloud

Yandex

Yandex

ProtonDrive

ProtonDrive

AWS

AWS

GCS

GCS

iDrive

iDrive

Storj

Storj

DigitalOcean

DigitalOcean

Wasabi

Wasabi

1fichier

1fichier

PikPak

PikPak

TeleBox

TeleBox

OpenDrive

OpenDrive

Backblaze B2

Backblaze B2

Fastmail file

Fastmail file

SharePoint

SharePoint

Nextcloud

Nextcloud

ownCloud

ownCloud

Premiumize me

Premiumize me

HiDrive

HiDrive

Put.io

Put.io

Sugar Sync

Sugar Sync

Jottacloud

Jottacloud

Seafile

Seafile

Ftp

Ftp

SFtp

SFtp

NAS

NAS

WebDav

WebDav

4shared

4shared

Icedrive

Icedrive

Cloudflare R2

Cloudflare R2

Scaleway

Scaleway

Hetzner Object Storage

Hetzner Object Storage

Synology C2 Object Storage

Synology C2 Object Storage

S3 Compatible

S3 Compatible

Doi

Doi

iCloud Drive

iCloud Drive

iCloud Photos

iCloud Photos

FileLU

FileLU

Zoho WorkDrive

Zoho WorkDrive

Telia Cloud / Sky

Telia Cloud / Sky

Drime

Drime

Filen

Filen

TeraBox

TeraBox

Internxt

Internxt

Degoo

Degoo

Gofile

Gofile

Pixeldrain

Pixeldrain

Shade

Shade

Koofr

Koofr

Didn' t find your cloud service? Be free to contact: [email protected]

Further Reading

Effortless FTP connect to google drive: Transfer Files in 3 Easy Ways

Explore three efficient methods to connect Google Drive with FTP, enabling seamless file transfers. This comprehensive guide provides detailed instructions, benefits, and tips for effective file management.

Learn More >

Google Photos to OneDrive: 3 Innovative Transfer Strategies

Learn three effective methods to transfer your Google Photos to OneDrive. Explore Web-Based Transfers, Rclone, and CloudsLinker for an efficient shift.

Learn More >

Google Photos to Proton Drive: 3 Effective Transfer Techniques

Discover three practical methods to move your Google Photos to Proton Drive. Learn about Web-Based Uploading, Rclone, and CloudsLinker for a smooth transition.

Learn More >

Interested in learning more?