{"id":18127,"date":"2026-07-13T12:01:37","date_gmt":"2026-07-13T05:01:37","guid":{"rendered":"https:\/\/www.cipher.co.th\/blogs\/cloudflare-r2-vs-s3-2\/"},"modified":"2026-07-13T12:01:37","modified_gmt":"2026-07-13T05:01:37","slug":"cloudflare-r2-vs-s3","status":"publish","type":"post","link":"https:\/\/www.cipher.co.th\/en\/blogs\/cloudflare-r2-vs-s3\/","title":{"rendered":"Cloudflare R2 vs Amazon S3: What Zero Egress Actually Saves You"},"content":{"rendered":"<p><strong>Quick answer:<\/strong> Cloudflare R2 charges nothing for egress. Amazon S3 charges $0.09 per GB after the first 100 GB per month. If you push data out to the internet at any real volume, video, images, downloadable files, R2 saves you an enormous amount. If your monthly egress is under 100 GB, or your data never leaves AWS at all, zero egress is worth almost nothing to you. Pricing as of July 2026.<\/p>\n<p>Zero egress is R2 headline feature and it has been marketed hard. But very few people sit down and put their own numbers through it. The variable that decides the outcome is not how much data you store, it is how many times people pull it back out.<\/p>\n<p>This article runs three real scenarios using official Cloudflare and AWS pricing as of July 2026, shows the arithmetic in full, and is explicit about the cases where S3 still wins.<\/p>\n<h2>Why egress decides the argument<\/h2>\n<p>S3 Standard storage is $0.023 per GB per month for the first 50 TB in us-east-1. R2 is $0.015 per GB per month. That is roughly 35 percent cheaper, which is nice but not life-changing.<\/p>\n<p>Egress is where the two diverge violently. AWS gives you 100 GB of data transfer out to the internet free per month, aggregated across all services and all regions, and then starts charging at $0.09 per GB. R2 charges $0 for egress in every case, whether you serve through the Workers API, the S3 API, or an r2.dev domain.<\/p>\n<p>The point people miss: your egress bill does not scale with how much you store, it scales with how many times the data is fetched. One 1 GB file downloaded 10,000 times is 10 TB of egress. This is why media companies, e-commerce sites and game publishers get hit far harder by S3 bills than other kinds of business.<\/p>\n<h2>The rate cards, as of July 2026<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Item<\/th>\n<th>Cloudflare R2 (Standard)<\/th>\n<th>Amazon S3 (Standard, us-east-1)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Storage<\/td>\n<td>$0.015 \/ GB \/ month<\/td>\n<td>$0.023 \/ GB \/ month (first 50 TB)<\/td>\n<\/tr>\n<tr>\n<td>Egress to internet<\/td>\n<td><strong>$0, always<\/strong><\/td>\n<td>First 100 GB\/month free, then from $0.09 \/ GB<\/td>\n<\/tr>\n<tr>\n<td>Writes (Class A \/ PUT)<\/td>\n<td>$4.50 \/ million requests<\/td>\n<td>$0.005 \/ 1,000 requests ($5.00 \/ million)<\/td>\n<\/tr>\n<tr>\n<td>Reads (Class B \/ GET)<\/td>\n<td>$0.36 \/ million requests<\/td>\n<td>$0.0004 \/ 1,000 requests ($0.40 \/ million)<\/td>\n<\/tr>\n<tr>\n<td>Deletes<\/td>\n<td>Free (DeleteObject is a free operation)<\/td>\n<td>Per the S3 rate card for the storage class<\/td>\n<\/tr>\n<tr>\n<td>Monthly free tier<\/td>\n<td>10 GB + 1M Class A + 10M Class B<\/td>\n<td>Free tier applies to new accounts only<\/td>\n<\/tr>\n<tr>\n<td>Infrequent Access tier<\/td>\n<td>$0.01 \/ GB \/ month + $0.01 \/ GB retrieval<\/td>\n<td>Several tiers, including Glacier<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Notice that the request pricing is remarkably close. R2 is slightly cheaper on both reads and writes, but not enough to matter. Egress is the only line that changes the order of magnitude.<\/p>\n<h2>The AWS egress tiers<\/h2>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Volume per month<\/th>\n<th>Price per GB<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>First 100 GB<\/td>\n<td>Free (aggregated across all services and regions)<\/td>\n<\/tr>\n<tr>\n<td>Next ~9.9 TB<\/td>\n<td>$0.09<\/td>\n<\/tr>\n<tr>\n<td>Next 40 TB<\/td>\n<td>$0.085<\/td>\n<\/tr>\n<tr>\n<td>Next 100 TB<\/td>\n<td>$0.07<\/td>\n<\/tr>\n<tr>\n<td>Beyond that<\/td>\n<td>$0.05<\/td>\n<\/tr>\n<tr>\n<td>Inter-region transfer<\/td>\n<td>Approximately $0.02<\/td>\n<\/tr>\n<tr>\n<td><strong>Cloudflare R2, any volume<\/strong><\/td>\n<td><strong>$0<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Note that even the cheapest AWS tier, $0.05 per GB, is still a real charge, and to reach it you have to be shipping more than 150 TB a month. Most Thai businesses will sit in the $0.09 or $0.085 band for their entire life.<\/p>\n<h2>Three worked scenarios<\/h2>\n<h3>Scenario A: a media platform. 5 TB stored, 50 TB\/month egress<\/h3>\n<p>A video-on-demand service or a busy image library. 5 TB of files, 200 million reads per month, 2 million writes per month, and 50 TB of egress.<\/p>\n<p><strong>On S3.<\/strong> Storage: 5,000 GB times $0.023 = $115.00. GET requests: 200,000,000 times $0.0000004 = $80.00. PUT requests: 2,000,000 times $0.000005 = $10.00. Egress: 50,000 GB minus the 100 GB free leaves 49,900 GB, which splits into 9,900 GB at $0.09 = $891.00 and 40,000 GB at $0.085 = $3,400.00, for $4,291.00 of egress. <strong>Total: $4,496.00 per month.<\/strong><\/p>\n<p><strong>On R2.<\/strong> Storage: (5,000 minus the 10 GB free) times $0.015 = $74.85. Class B operations: (200 million minus the 10 million free) = 190 million times $0.36 per million = $68.40. Class A operations: (2 million minus the 1 million free) = 1 million times $4.50 per million = $4.50. Egress: $0. <strong>Total: $147.75 per month.<\/strong><\/p>\n<p>A difference of $4,348.25 per month, or roughly $52,179 per year. Look at where the money is: 96 percent of the S3 bill is egress. Storage and requests are basically noise.<\/p>\n<h3>Scenario B: an internal data lake. 20 TB stored, 500 GB\/month egress<\/h3>\n<p>Lots of data, written often (20 million PUTs), read rarely (5 million GETs), and almost never sent out to the internet.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Line item<\/th>\n<th>Amazon S3<\/th>\n<th>Cloudflare R2<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Storage<\/td>\n<td>$460.00<\/td>\n<td>$299.85<\/td>\n<\/tr>\n<tr>\n<td>GET \/ Class B<\/td>\n<td>$2.00<\/td>\n<td>$0.00<\/td>\n<\/tr>\n<tr>\n<td>PUT \/ Class A<\/td>\n<td>$100.00<\/td>\n<td>$85.50<\/td>\n<\/tr>\n<tr>\n<td>Egress<\/td>\n<td>$36.00<\/td>\n<td>$0.00<\/td>\n<\/tr>\n<tr>\n<td><strong>Monthly total<\/strong><\/td>\n<td><strong>$598.00<\/strong><\/td>\n<td><strong>$385.35<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>R2 is still cheaper, but only by $212.65 a month, not by a factor of 30. And notice that the saving now comes almost entirely from the storage rate, not from egress. That matters, because if this data needs to be queried by Athena, Glue or EMR, moving it to R2 costs you the entire ecosystem in exchange for a couple of hundred dollars a month. That is usually a bad trade.<\/p>\n<h3>Scenario C: a small site. 50 GB stored, 80 GB\/month egress<\/h3>\n<p>On S3: storage 50 times $0.023 = $1.15. GET requests, 2 million = $0.80. PUT requests, 100,000 = $0.50. Egress: $0, because 80 GB is under the 100 GB free allowance. Total: $2.45 per month.<\/p>\n<p>On R2: storage (50 minus 10) times $0.015 = $0.60. Class A and Class B are both inside the free tier. Total: $0.60 per month.<\/p>\n<p>The gap is under two dollars a month. If this is you, migrating to save on egress is a waste of time. The rough threshold is somewhere around a terabyte of egress a month; below that, the numbers stop being interesting.<\/p>\n<h2>R2 gotchas you should know about<\/h2>\n<p><strong>The Infrequent Access class has a 30-day minimum.<\/strong> Storage is cheaper at $0.01 per GB per month, but there is a $0.01 per GB retrieval fee, Class A operations jump to $9.00 per million and Class B to $0.90 per million. Critically, the free tier does not apply to Infrequent Access at all. If you move data into IA and then read it back frequently, you can end up paying more than if you had just left it in Standard.<\/p>\n<p><strong>R2 rounds up.<\/strong> Cloudflare states that usage is rounded up to the next billing unit: one million and one operations bills as two million, and 1.1 GB-month bills as 2 GB-month. At scale this is a rounding error, but it is worth knowing.<\/p>\n<p><strong>R2 implements a subset of the S3 API.<\/strong> The S3-compatible API works with the AWS SDKs, but not every S3 API call is supported. Check the Cloudflare S3 API compatibility page against the calls your code actually makes before you commit.<\/p>\n<p><strong>Two genuinely nice details.<\/strong> R2 does not charge for requests that fail authorization with an HTTP 401, which removes a whole category of denial-of-wallet risk on public buckets. And DeleteObject is a free operation, so cleaning up costs nothing.<\/p>\n<h2>When Amazon S3 is still the right answer<\/h2>\n<p><strong>When your compute already lives in AWS.<\/strong> This is the big one. If your data never goes out to the internet because EC2 or Lambda in the same region is reading it, you have no internet egress charge to begin with. You pay storage and requests only. Zero egress is not a benefit if your egress is already zero.<\/p>\n<p><strong>When you depend on the AWS ecosystem.<\/strong> Athena, Glue, EMR, Redshift Spectrum, S3 event notifications triggering Lambda, S3 Batch Operations, S3 Object Lambda: all of these plug into S3 directly. Moving to R2 can mean rebuilding an entire data pipeline, not just changing a bucket name.<\/p>\n<p><strong>When you need genuinely cold archive storage.<\/strong> S3 offers Glacier storage classes for data that is essentially never read. R2 has no direct equivalent; its cheapest tier is Infrequent Access. Check the current S3 rate card for the specific class you need.<\/p>\n<p><strong>When data residency is a requirement.<\/strong> AWS made the Asia Pacific (Thailand) Region, ap-southeast-7, generally available on 7 January 2025 with three Availability Zones. If a regulator or a customer contract requires the data to physically stay in Thailand, that outranks any egress calculation.<\/p>\n<p>If you are deciding whether to pair R2 with Workers, we set out the decision criteria in <a href=\"https:\/\/www.cipher.co.th\/en\/blogs\/when-not-to-use-cloudflare-workers\/\">when you should not use Cloudflare Workers<\/a>.<\/p>\n<h2>Do the egress arithmetic first<\/h2>\n<p>Pull your last AWS invoice and find the Data Transfer line. If it is smaller than a few hundred dollars, a migration to R2 will not pay for itself. If it is several thousand dollars, this is one of the highest-return infrastructure decisions available to you.<\/p>\n<p>Getting data into R2 is also not as expensive as people fear. Cloudflare Super Slurper and Sippy are free to use; you only pay the Class A operations they generate on the R2 side. The source bucket on the AWS side may still charge you, so budget for that separately.<\/p>\n<p>Cipher designs and builds systems on the Cloudflare Developer Platform for businesses in Thailand, and can assess whether moving your object storage to R2 is worth doing.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>Is R2 egress really free or is there a catch<\/h3>\n<p>It is genuinely free. Cloudflare documentation states that egressing directly from R2 via the Workers API, the S3 API, or r2.dev domains does not incur data transfer charges, and this applies to both the Standard and Infrequent Access classes. What you still pay for is storage and operations. Pricing as of July 2026.<\/p>\n<h3>If our egress is low, is migrating to R2 still worth it<\/h3>\n<p>Probably not. AWS already gives you 100 GB of internet data transfer free per month, so below that threshold your egress cost is already zero. The remaining difference is the storage rate, $0.015 versus $0.023 per GB, which for a small dataset can amount to a few dollars a month.<\/p>\n<h3>Can I use the AWS SDK with R2<\/h3>\n<p>Yes. R2 offers an S3-compatible API that works with the AWS SDKs, but it implements a subset rather than the complete S3 API surface. Before migrating you should check the specific API calls your code makes against the Cloudflare S3 API compatibility page.<\/p>\n<h3>Is R2 Infrequent Access worth using<\/h3>\n<p>Only for data that is stored for a long time and read rarely. Storage drops to $0.01 per GB per month, but there is a $0.01 per GB retrieval fee, a 30-day minimum storage duration, higher operation prices, and the 10 GB free tier does not apply to this class at all.<\/p>\n<h3>How much does it cost to move terabytes from S3 to R2<\/h3>\n<p>Cloudflare Super Slurper and Sippy are free to use; you only pay for the Class A operations they generate on the R2 side. The source bucket on the AWS side may still charge you egress, so the total depends on how much data and how many objects you have and should be calculated in advance.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quick answer: Cloudflare R2 charges nothing for egress. Amazon S3 charges $0.09 per GB after the first 100 GB per [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_angie_page":false,"content-type":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"page_builder":"","footnotes":""},"categories":[152],"tags":[],"class_list":["post-18127","post","type-post","status-publish","format-standard","hentry","category-technology-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/posts\/18127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/comments?post=18127"}],"version-history":[{"count":0,"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/posts\/18127\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/media?parent=18127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/categories?post=18127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cipher.co.th\/en\/wp-json\/wp\/v2\/tags?post=18127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}