October 1, 2026 / Performance

Cloudflare CDN Cost Per GB: What You Actually Pay

Quick answer

Cloudflare does not bill CDN bandwidth per GB on its Free, Pro or Business plans. Those are flat rate: $0, $20 and $200 per month billed annually. Your Cloudflare CDN cost per GB is therefore a figure you derive, not one you are quoted: plan price divided by delivered GB, plus whatever metered add-ons such as Workers, R2 or Argo you switched on.

Every article that promises to tell you the Cloudflare CDN cost per GB has the same structural problem: there is no such line item on the invoice. Cloudflare sells flat monthly plans and then meters a specific, published list of add-on products. Bandwidth is not on that list.

That makes the real question different from the one people type into Google. It is not “what does Cloudflare charge per GB”, it is “what is my blended cost per delivered GB once I include the plan, the metered products I enabled, and the egress my origin host bills me for the traffic Cloudflare did not cache”. That last term is the one that ruins budgets, and almost nobody writes it down.

This post gives you the formula, the metered rates with sources, three worked examples with the arithmetic shown, the volume at which a per-GB CDN undercuts a flat plan, and a straight reading of the large-file terms clause everyone alludes to and nobody quotes.

Does Cloudflare charge per GB for CDN bandwidth?

No. On the Free, Pro and Business plans there is no per-GB charge for delivering cached or proxied traffic to visitors. You pay the plan fee and the byte count does not appear in the calculation.

The published prices on Cloudflare’s plans page are $0 per month for Free, $20 per month for Pro billed annually or $25 billed monthly, and $200 per month for Business billed annually or $250 billed monthly. Enterprise is contract priced and is the only tier where a bandwidth commit is normally negotiated.

The consequence is that your effective rate collapses as you grow. A Pro site delivering 200 GB a month is paying $0.10 per GB. The same Pro site delivering 4 TB a month is paying half a cent per GB. Nothing about the service changed. Only the denominator did. Anyone quoting you a single Cloudflare rate per GB has picked a traffic volume and not told you which one.

Cloudflare’s marginal cost for the next gigabyte of cached traffic is zero. Every dollar in your bill comes from something else you turned on.

Plan choice on the self-serve tiers is about features, not volume: image optimisation, WAF rulesets, cache TTL granularity, uptime commitments. If you are trying to work out which tier unlocks what, the companion piece on what the Cloudflare free plan actually limits covers the feature boundaries in detail. This post stays on the money.

What Cloudflare actually meters

Cloudflare publishes an explicit list of which products bill by usage, and CDN bandwidth is absent from it. The usage-based billing documentation names Workers, R2, Argo Smart Routing, Cache Reserve, Load Balancing, Stream, Images, Spectrum, Rate Limiting, Log Explorer, Zero Trust, Vectorize and Analytics Engine. Everything in the table below is opt-in. A zone that has never left the defaults generates none of these charges.

ProductBilled onPublished rateIncluded per month
CDN bandwidthNothingNo per-GB charge on Free, Pro or BusinessAll of it
Argo Smart RoutingData transfer$5 per domain per month plus a per-GB transfer rate; Cloudflare’s launch announcement set that rate at $0.10 per GBFirst 1 GB
Workers (Paid)Requests and CPU time$5 minimum monthly charge, then $0.30 per additional million requests and $0.02 per additional million CPU milliseconds10M requests, 30M CPU-ms
R2 storage (Standard)Stored data$0.015 per GB-month10 GB-month
R2 Class A operationsWrites and lists$4.50 per million1 million
R2 Class B operationsReads$0.36 per million10 million
R2 egressNothing$0Unlimited
Cache ReserveStorage, reads, writes$0.015 per GB-month, $4.50 per million Class A, $0.36 per million Class BNone; requires a paid plan
StreamMinutes stored and delivered$5 per 1,000 minutes stored, $1 per 1,000 minutes deliveredVaries by plan
ImagesStored, delivered, transformed$5 per 100,000 stored, $1 per 100,000 delivered, $0.50 per 1,000 unique transformations5,000 transformations
Workers KVReads, writes, storage$0.50 per million reads, $5.00 per million writes, $0.50 per GB-month10M reads, 1M writes, 1 GB
Load BalancingDNS queries to load-balanced hostnamesRate shown in the dashboard at subscription timeFirst 500,000 queries
Workers LogpushRequests$0.05 per millionRequires Workers Paid
Rates from Cloudflare’s own pricing documentation for Workers, R2, Stream, Images and Cache Reserve, and from the usage-based billing overview. Zone-level Logpush remains an Enterprise feature; Workers Trace Events Logpush is the self-serve path.

Two entries deserve flagging. R2 egress is genuinely $0 according to the R2 pricing page, which is the single most important number in this whole article for anyone shipping large files. And Cache Reserve is billed as object storage even though it looks like a caching toggle, so enabling it on a zone with millions of small assets buys you a bill full of Class A operations.

How to calculate your real Cloudflare CDN cost per GB

Your effective rate is total monthly spend attributable to delivery divided by gigabytes delivered to visitors, and the term people forget is the egress your origin host charges for cache misses.

origin_egress_GB = delivered_GB * (1 - cache_hit_ratio_by_bytes)

effective_cost_per_GB =
    ( plan_fee
    + metered_addons
    + origin_egress_GB * host_egress_rate )
  / delivered_GB

Note that the hit ratio in that formula is measured by bytes, not by requests. Cloudflare’s cache analytics will happily show a 95% request hit ratio on a site whose one uncached asset is a 40 MB PDF. Bytes are what your host bills on, so bytes are what you measure.

Run the same site at two hit ratios and the sensitivity is obvious. Take 1,200 GB delivered per month on Pro at $20, with a host that charges $0.05 per GB of egress. At a 96% byte hit ratio the origin serves 48 GB, costing $2.40, and the effective rate is $22.40 divided by 1,200, or $0.019 per GB. Drop the hit ratio to 60% and the origin serves 480 GB, costing $24, more than the plan itself, and the effective rate jumps to $0.037 per GB. The CDN price did not move. Your cache configuration doubled your bill.

Pro tip

Before you model anything, confirm the CDN layer is actually caching. Run the URL through the free Cache Inspector in the WPColt toolbox and check the cf-cache-status header on your real HTML and asset URLs. A cost model built on an assumed hit ratio is a guess with decimal places.

Three worked examples with the arithmetic

These are illustrative calculations built on stated assumptions, not measurements of any real site.

A. Content site on Pro, high hit ratio

Assume 1,200 GB delivered per month, a 96% byte hit ratio, Pro at $20 billed annually, a host charging $0.05 per GB of egress, and no add-ons. Origin pull is 1,200 x 0.04 = 48 GB, costing $2.40. Total is $22.40. Effective rate is $22.40 / 1,200 = $0.019 per GB, just under two cents.

B. SaaS front end on Business with heavy Workers use

Assume 800 GB delivered, 120 million requests per month, a Worker on every request averaging 8 ms of CPU, Business at $200 billed annually, and origin egress absorbed by a flat hosting contract. Workers requests: 120M minus the 10M included leaves 110M billable, at $0.30 per million that is $33. CPU: 120M x 8 = 960M CPU-ms, minus 30M included leaves 930M, at $0.02 per million that is $18.60. Add the $5 minimum and Workers costs $56.60.

Total is $256.60 for 800 GB. Effective rate is $0.32 per GB, roughly seventeen times example A. Bandwidth did not cause that. Compute did.

C. Large-file workload on R2 plus Workers

Assume 20,000 GB of installers and archives delivered per month, 500 GB stored in R2, 2 million object reads and 10,000 writes, Pro at $20, and a Worker fronting the bucket at 2 million requests with negligible CPU. R2 storage: 490 chargeable GB x $0.015 = $7.35. Class B reads at 2M sit inside the 10M free allowance, Class A writes inside the 1M allowance, both $0. Workers stays at the $5 minimum. R2 egress is $0.

Total is $32.35 for 20 TB. Effective rate is $0.0016 per GB, about a sixth of a cent. The same 20 TB on CloudFront pay-as-you-go in the US region, after the free first terabyte, is 9 TB at $0.085 and 10 TB at $0.080, which is $765 plus $800, or $1,565 before request charges.

Worked exampleDelivered GBMonthly totalEffective $/GBWhat drives it
A. Content site, Pro, 96% hit ratio1,200$22.40$0.019Plan fee
A2. Same site, 60% hit ratio1,200$44.00$0.037Origin egress
B. SaaS front end, Business plus Workers800$256.60$0.32Requests and CPU
C. Large files on R2 plus Workers20,000$32.35$0.0016Storage only
Illustrative calculations using Cloudflare’s published rates and the stated assumptions above. Not measurements.

The requests-per-GB test: bandwidth priced or compute priced?

Divide your monthly requests by your monthly delivered gigabytes. If the answer is large, you have a compute-priced workload and Workers will dominate your bill no matter how much bandwidth you save.

The arithmetic is simple: requests per GB is just the reciprocal of average response size. At 50,000 requests per GB your average response is roughly 21 KB. At 5,000 requests per GB it is roughly 210 KB. A media-heavy WordPress site sits at the low end. A JSON API or a heavily personalised app sits at the high end, and every one of those small requests is a billable Workers invocation if you have a Worker in front of it.

To check it: open the Cloudflare dashboard, go to Analytics & Logs, and read total requests and total bandwidth over the same 30-day window. Then open Caching, then Cache Analytics, and compare cached versus uncached bytes for the byte hit ratio the cost formula needs.

The practical rule: if you are compute priced, optimising images will not move your bill. Removing the Worker from routes that a static Cache Rule could serve will.

The non-HTML content clause, quoted properly

The restriction is real, it is narrower than the folklore suggests, and it now lives in Cloudflare’s Service-Specific Terms for Application Services rather than in the old numbered clause of the subscription agreement that people still cite as “Section 2.8”.

Under the heading “Content Delivery Network (Free, Pro, or Business)”, the terms say the CDN can be used to cache and serve web pages and websites, that non-Enterprise customers must use specific paid services such as the Developer Platform, Images and Stream in order to serve video and other large files, and that Cloudflare reserves the right to disable or limit CDN access where it believes the CDN is being used without those paid services to serve video or a disproportionate percentage of pictures, audio files or other large files.

Read what that does and does not say. It does not set a gigabyte threshold. It does not target sites with a lot of images. It targets the case where the proportion of your traffic that is large non-HTML files is disproportionate to your site being, in any recognisable sense, a website. A photography portfolio is fine. A WooCommerce store full of product photography is fine. A free MP4 or ISO mirror sitting on a Free plan zone is the shape of thing that gets a message.

Watch out

The remedy is architectural, not a plan upgrade. Buying Business does not buy permission to run a video host through the CDN. Move video to Stream, move large downloads to R2 fronted by Workers, or go Enterprise. R2 has no egress fee, so the compliant path is usually also the cheapest one.

Where Cloudflare stops being the cheapest

On raw bandwidth economics, essentially never, because the marginal rate is zero. Volume-priced CDNs beat Cloudflare on total cost only at low volumes, where a flat plan fee is larger than a small metered bill, or in the specific case where you need the contractual freedom to serve whatever file types you like without buying into Cloudflare’s product stack.

ProviderModelRepresentative rateRequests billed?Free tier or minimum
Cloudflare Free / Pro / BusinessFlat monthly$0 / $20 / $200 per month, bandwidth not meteredNoFree plan is $0
Bunny.net Standard networkPer GB by region$0.01 per GB Europe and North America; $0.03 Asia and OceaniaNo$1 monthly minimum
Bunny.net Volume networkPer GB, global$0.005 per GB for the first 500 TBNo$1 monthly minimum
KeyCDNPer GB, tiered$0.04 per GB for the first 10 TB in North America and Europe, falling to $0.01 above 100 TBNo$4 monthly minimum
AWS CloudFront (pay as you go)Per GB plus per request$0.085 per GB for the 9 TB after the free tier, US, Canada and MexicoYes, $0.01 per 10,000 HTTPS requests1 TB and 10M requests free monthly
Fastly (pay as you go)Per GB plus per request$0.12 per GB to 10 TB in North AmericaYes, $0.01 per 10,000 requests100 GB and 1M requests free monthly
Rates taken from each provider’s own published pricing page for a North America or Europe delivery region. Regional rates vary substantially; check the tier that matches your audience.

The crossover maths is easy once you have the table. Against Bunny’s $0.01 per GB standard rate in Europe and North America, a $20 Pro plan is the more expensive option below 2 TB per month and the cheaper one above it. A $200 Business plan crosses over at 20 TB. Against KeyCDN’s $0.04 first tier, Pro breaks even at 500 GB. Our KeyCDN performance and price review goes through what that per-GB model buys you in delivery terms.

Against the Cloudflare Free plan the comparison is different and blunt: nothing undercuts zero. The reason to pay a metered CDN is not price, it is that you want a provider whose terms are indifferent to your file mix.

Cutting the number on a WordPress site

Four levers move a WordPress site’s effective cost per GB, and they are all about the denominator and the origin egress term, not the plan.

1. Fix the byte hit ratio before anything else

Check what is actually being cached at the edge from the command line, on a real URL rather than the homepage:

curl -sIL https://example.com/some-post/ \
  | grep -iE 'cf-cache-status|cache-control|age|set-cookie'

A cf-cache-status of DYNAMIC on HTML means Cloudflare is not caching your pages at all, which is the default for HTML. A stray Set-Cookie header on an asset response will also keep it out of the cache. Our walkthrough of diagnosing Cloudflare cache bypass covers the headers that cause it.

2. Cache Everything, with the logged-in trap closed

Turning on Cache Everything for HTML is the single biggest lever on origin egress, and it is also the fastest way to serve one user’s dashboard to another if you do not exclude authenticated traffic first. Create a Cache Rule that bypasses cache when any WordPress session cookie or admin path is present, and order it above the Cache Everything rule:

(http.cookie contains "wordpress_logged_in_") or
(http.cookie contains "wp-postpass_") or
(http.cookie contains "comment_author_") or
(http.cookie contains "woocommerce_items_in_cart") or
(http.cookie contains "wp_woocommerce_session_") or
(starts_with(http.request.uri.path, "/wp-admin")) or
(http.request.uri.path eq "/wp-login.php") or
(starts_with(http.request.uri.path, "/cart")) or
(starts_with(http.request.uri.path, "/checkout")) or
(starts_with(http.request.uri.path, "/my-account"))

3. Shrink the payload, not just the count

Delivered gigabytes are mostly images on a typical WordPress site. Serving modern formats and correctly sized variants cuts the numerator on a metered CDN and cuts origin egress on Cloudflare, and it does it without a subscription. The guide to serving WebP images in WordPress is the cheapest change on this list.

4. Do not pay for Argo unless the map says so

Argo Smart Routing bills per gigabyte of transfer, on top of a per-domain monthly fee, and it optimises the path between Cloudflare and your origin. On a well-cached WordPress site most requests never reach the origin, so most of the traffic Argo is routing is traffic that did not need routing. If your audience and your origin are in the same region and your hit ratio is high, Argo is a per-GB charge bolted onto a service that had none.

Four costly mistakes

These are the specific decisions that turn a free CDN into a recurring line item for no measurable return.

  • Buying Pro for a site that was already 99% cached. Pro’s value is WAF rules, image optimisation and page rules, not throughput. If you upgraded to make a site faster and the hit ratio was already high, you spent $240 a year on nothing. Measure the hit ratio first, then decide.
  • Enabling Argo on a single-region audience. Argo adds a per-domain fee plus a metered per-GB rate to shorten a path that is already short. On a site whose visitors and origin both sit in one country, you are paying by the gigabyte for a routing improvement measured in single-digit milliseconds.
  • Letting a low byte hit ratio bleed origin egress. This is the one that hides. Cloudflare’s bill stays flat while your host’s overage line grows, so the cost never shows up in the column you are watching.
  • Running a Worker on every request when a Cache Rule would do. At $0.30 per million requests beyond the included 10 million, plus CPU time, a Worker doing header rewriting on static assets is a metered tax on traffic that Cloudflare would otherwise serve for free. Move the logic into Transform Rules or Cache Rules wherever it fits.

Which plan makes sense at which scale

For the overwhelming majority of WordPress sites the correct answer is the Free plan plus a properly configured cache, and the money is better spent on hosting. Here is the position, stated plainly.

Blog, brochure site or portfolio under about 2 TB a month: stay on Free. You get the same edge network and the same unmetered bandwidth. Spend the $20 on image optimisation or a better host instead.

Commercial site where downtime costs money: Pro at $20 a month is defensible for the WAF rulesets and the support path, not for bandwidth. Do not expect a speed change if your hit ratio was already good.

WooCommerce or SaaS with real traffic: Business at $200 a month earns its keep on cache control granularity and PCI-relevant controls. At 20 TB a month it also happens to be cheaper than any per-GB CDN in the comparison table.

Video, large downloads or an asset mirror: do not run it through the standard CDN on any self-serve plan. Stream for video, R2 plus Workers for files. Example C shows why: zero egress fees make it cheaper than the metered CDNs by two orders of magnitude, and it is the architecture the terms actually point you at.

Anyone quoted a Cloudflare cost per GB by a vendor or a consultant: ask which traffic volume the figure assumes and whether it includes origin egress. If they cannot answer both, the number is decoration.

Frequently asked questions

Is Cloudflare bandwidth really unlimited on the free plan?

Cloudflare does not meter CDN bandwidth on Free, Pro or Business, and its usage-based billing documentation lists the products that are metered without including CDN data transfer. The limit is contractual rather than numeric: the Application Services terms let Cloudflare restrict CDN use where a self-serve customer serves video or a disproportionate share of large non-HTML files without buying Stream, Images or the Developer Platform.

Why did my Cloudflare bill go up when my traffic did not?

Almost always because a metered add-on was enabled rather than because traffic grew. Argo Smart Routing bills per gigabyte of transfer on top of a per-domain fee, Workers bills per million requests and per million CPU milliseconds beyond the included allowances, and Cache Reserve bills storage plus Class A and Class B operations. Check the billing page for which subscriptions are active.

Does Cloudflare charge for cache misses?

Cloudflare itself does not charge you for a cache miss, but your origin host almost certainly does. Every miss pulls the full object from your server, and that egress is billed at your hosting provider’s rate. This is why byte hit ratio, not request hit ratio, is the number that controls your real blended cost per delivered gigabyte.

Is Cloudflare R2 cheaper than S3 for serving files?

For delivery, yes, because R2 charges no egress fee at all. R2 Standard storage is 0.015 dollars per GB-month with Class A operations at 4.50 dollars per million and Class B at 0.36 dollars per million, and the first 10 GB of storage is free. Serving 20 TB from R2 costs single-digit dollars in storage where a metered CDN would charge hundreds.

How many requests per gigabyte means I have a compute problem?

Requests per delivered gigabyte is the reciprocal of average response size. Around 50,000 requests per GB your average response is roughly 21 KB, which is API-shaped rather than page-shaped. Above that range, Workers invocations and CPU time will dominate your Cloudflare bill and image or bandwidth optimisation will barely move it.

Do I need to upgrade to Business to serve large downloads?

No, and upgrading does not solve it. The Application Services terms apply the large-file restriction to Free, Pro and Business alike, and point self-serve customers at specific paid products instead. The supported paths are Stream for video, R2 fronted by Workers for downloads, or an Enterprise contract. A plan upgrade buys features, not permission.

At what traffic volume does Bunny or KeyCDN beat a Cloudflare plan?

Against Bunny’s 0.01 dollars per GB standard rate in Europe and North America, a 20 dollar Pro plan breaks even at 2 TB per month and a 200 dollar Business plan at 20 TB. Against KeyCDN’s 0.04 dollars first tier, Pro breaks even at 500 GB. Below those volumes a metered CDN is cheaper; above them the flat plan wins.

Does Cache Everything on WordPress risk leaking logged-in pages?

Yes, if you do not exclude authenticated traffic first. Create a Cache Rule that bypasses cache whenever a WordPress or WooCommerce session cookie is present, such as wordpress_logged_in_, wp-postpass_ or wp_woocommerce_session_, and whenever the path is an admin, cart, checkout or account route. Order that rule above the Cache Everything rule so it evaluates first.