September 19, 2026 / Caching Diagnostics

Cloudflare Free Plan Limits: What You Really Get

Quick answer

The Cloudflare free plan limits that matter are rule counts and features, not traffic. You get unmetered DDoS protection, a global CDN with no published bandwidth cap, Universal SSL, 3 Page Rules, 10 Cache Rules and 5 custom WAF rules. HTML is not cached until you tell Cloudflare to cache it. Most WordPress sites never outgrow this plan.

Almost every article about Cloudflare free plan limits is really an article about upselling you to Pro. The genuine restrictions are duller and more useful than that: a fixed number of rules, a set of features held back for paid tiers, and one clause in the terms of service that almost nobody reads.

The thing that actually catches WordPress owners out is not a cap at all. It is that Cloudflare does not cache your HTML by default, on any plan, so people switch it on, see no change in Time to First Byte, and conclude the free tier is throttled. It is not. It is doing exactly what it says it does.

This post covers what is capped, what is genuinely missing, what the terms say about bandwidth, and the specific symptoms that justify paying. If you want the money side of the argument instead, the effective cost per GB of Cloudflare’s CDN is worked through separately.

What the Cloudflare free plan actually includes

The free plan includes the full global CDN, unmetered DDoS protection, Universal SSL, DNS, the free managed WAF ruleset, and Cache Rules, with no published limit on requests or bandwidth. Cloudflare’s own plan comparison lists unmetered DDoS protection, CDN, Universal SSL and the free managed ruleset as present at every tier, including $0.

What is capped is configuration surface. You get three Page Rules instead of twenty. Five custom WAF rules instead of a hundred. Ten Cache Rules instead of three hundred. Nothing about the delivery network itself is slower or smaller.

The one-line version: upgrade when you run out of rules, need image optimisation you cannot do in WordPress, or need an uptime SLA in a contract. Traffic volume alone is not a reason.

Cloudflare free plan limits compared with Pro, Business and Enterprise

Here is the master table, with every figure taken from Cloudflare’s own documentation rather than from a competitor’s summary. Where Cloudflare does not publish a per-plan number, the cell says so instead of guessing.

Limit or featureFreeProBusinessEnterprise
Price$0$20/mo billed annually, $25/mo monthly$200/mo billed annually, $250/mo monthlyCustom, billed annually
Custom WAF rules5201001,000
Custom rulesets (zone)12510
Cache Rules102550300
Page Rules (legacy, deprecated)32050125
Max cacheable object size512 MB512 MB512 MB5 GB by default
Max upload / request body size100 MB100 MB200 MB500 MB and above
HTML cached by defaultNoNoNoNo
DDoS protectionUnmeteredUnmeteredUnmeteredUnmetered
Uptime SLANoneNone100%, 1x service credits100%, 10x standard or 25x premium credits
SSLUniversal SSL onlyUniversal SSLUniversal SSL plus custom certificate optionsFull certificate control
Image optimisation (Polish, Images)Not includedPaid feature setPaid feature setPaid feature set
SupportCommunity and ticket, no published response timeTicketChat addedNamed account team, 24/7
Sources: cloudflare.com/plans, developers.cloudflare.com custom rules, Cache Rules, Page Rules and default cache behavior pages, August 2026. Support response times are not published as per-plan figures.

Page Rules are the old system, Rules are the new one

Most competing articles still describe the free plan as “three Page Rules and that is your lot”, which has been wrong for a while. Cloudflare has split Page Rules into separate Rules products, and Page Rules are now documented as deprecated.

The practical effect is that the free plan is far less cramped than its reputation. Caching behaviour now belongs to Cache Rules, where free gets ten, and redirects, header transforms and origin rules each have their own allowance. If you are still burning one of your three Page Rules on a cache setting, you are using a deprecated product to hit a limit you do not need to hit.

Is Cloudflare’s bandwidth really unlimited?

Yes for normal web traffic, and there is no published GB cap on the self-serve plans, but the terms restrict using the CDN predominantly for large non-HTML files. This is the single most misreported part of the free plan, in both directions: people either believe it is a trap, or they believe they can host a video library on it.

The relevant text lives in Cloudflare’s service specific terms for application services, in the section headed “Content Delivery Network (Free, Pro, or Business)”. It states that Cloudflare offers specific paid services, naming the Developer Platform, Images and Stream, that you must use in order to serve video and other large files via the CDN. It reserves the right to disable or limit CDN access where the service is used to serve video or a disproportionate percentage of pictures, audio files or other large files.

Read that carefully. It is not a bandwidth cap, and it is not aimed at a busy blog with a lot of images. It is aimed at using a free HTML-oriented CDN as an origin-free file host: video, disk images, game assets, software distribution.

An enforcement conversation, when it happens, is normally an email pointing at the clause and asking you to move the offending traffic to a product designed for it. The legitimate alternatives are R2 for object storage with no egress fees, Stream for video, or an Enterprise contract that prices the traffic properly. Nobody nukes a WordPress site over a 40 MB PDF.

Watch out

If your WordPress site self-hosts MP4 course videos or large ZIP downloads and those files are the bulk of your egress, you are the case the clause describes. Move them before someone tells you to, not after.

Workers on free versus paid

The Workers free tier gives you 100,000 requests per day, resetting at midnight UTC, with 10 ms of CPU time per invocation. Those quotas are independent of your CDN plan: a zone on the free plan and a zone on Business get the same Workers allowance, because Workers is billed as its own product.

Workers limitFreePaid
Requests100,000/day, reset at midnight UTCNo daily cap, billed per request
CPU time per invocation10 msUp to 5 minutes, 30 seconds by default
Script size after gzip3 MB10 MB
Subrequests per invocation50Substantially higher
Memory per isolate128 MB128 MB
Environment variables64 per Worker, 5 KB each128 per Worker, 5 KB each
Workers per account100500
Source: developers.cloudflare.com/workers/platform/limits, August 2026.

The limit that bites first is CPU time, not requests. Ten milliseconds is generous for a header rewrite, a redirect map or a bot check, and tight for anything that parses a large HTML body or does cryptography. The 50-subrequest ceiling matters if you are stitching together several origin calls per page. Full figures are on the Workers platform limits page, which is worth checking directly because these numbers move.

What the free plan genuinely does not give you

Five things are missing that WordPress owners routinely assume are included. None of them are bandwidth or speed.

  • Image optimisation. Cloudflare’s own image products are not part of the free plan. Free will cache and serve your images; it will not recompress them or convert them to modern formats for you.
  • WAF beyond the basics. You get the free managed ruleset and five custom rules. You do not get the full managed rulesets, and five rules disappears quickly once you are blocking specific bots, paths and countries by pattern.
  • Fast configuration and purge behaviour. Free plan setting changes and cache purges propagate, but higher tiers get quicker and more granular purge options. If you publish twenty times a day and need the change live everywhere immediately, that gap is real.
  • Prioritised support. There is no published response-time commitment on free. When something is broken at 2am, you have the community forum and a ticket queue.
  • Per-hostname certificate control. Universal SSL covers the apex and one wildcard level. Uploading your own certificate, or controlling certificates per hostname, is not a free-plan capability.

Why your WordPress site is not being cached on the free plan

Because Cloudflare does not cache HTML by default, and a WordPress page is HTML. The default cache behavior documentation says it plainly: the Cloudflare CDN does not cache HTML or JSON by default. It caches a long list of static extensions including CSS, JS, JPG, PNG, WEBP, SVG, WOFF2, PDF and MP4.

So the out-of-the-box result is that your theme files and images come from an edge close to the visitor, and every single page view still hits PHP on your origin. That is a useful offload. It is not page caching, and it will not move your TTFB much.

On the free plan Cloudflare is a security and delivery layer, not a page cache. It becomes a page cache only when you explicitly tell it to be one.

Turning on HTML caching without breaking logged-in users

You do this with a Cache Rule set to eligible for cache, and the entire difficulty is in the exclusions. Cache a logged-in page or a WooCommerce cart at the edge and you will serve one visitor’s session to everyone.

The bypass condition needs to cover, at minimum, the WordPress login cookie, the WooCommerce cart and session cookies, and the admin, cart, checkout and account paths. An expression along these lines, used as a bypass cache rule ordered above your 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 (starts_with(http.request.uri.path, "/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"))
or (starts_with(http.request.uri.path, "/wp-json"))

Adjust the paths for your permalink structure and language prefixes. Ten Cache Rules on free is plenty for this: one bypass rule, one cache-everything rule with an edge TTL, and you still have eight spare.

Reading cf-cache-status

The cf-cache-status response header tells you what the edge did with the request, and it is the only honest way to check whether any of the above is working. Fetch headers for a page you are not logged into:

curl -sI https://example.com/ | grep -i 'cf-cache-status\|cache-control\|age\|cf-ray'

# run it twice; the first request warms the edge, the second shows the real state
ValueWhat it meansWhat to do about it
HITServed from the Cloudflare edge without touching your originNothing. This is the goal.
MISSEligible for cache, but this edge did not have it and fetched from originNormal on first request. Persistent MISS means your origin is sending no-store or a short max-age.
DYNAMICNot eligible for cache at all, so Cloudflare passed it throughThis is what an untouched WordPress HTML page returns. You need a Cache Rule.
BYPASSEligible, but a rule, cookie or header told Cloudflare not to serve from cacheExpected on cart and admin. Unexpected elsewhere means your bypass expression is too broad.
EXPIREDThe cached copy was stale, so Cloudflare revalidated with your originFine occasionally. Constant EXPIRED means your TTL is shorter than your traffic pattern.
Interpretation of the cf-cache-status response header on a WordPress site.

If you are seeing BYPASS where you expect HIT, the cause is almost always a cookie your rules did not anticipate, and there is a full walkthrough of diagnosing Cloudflare cache bypass that goes through the usual suspects. If you would rather not read headers by hand, the free Cache Inspector in the WPColt toolbox checks page cache, server cache and CDN layers together and tells you which one is actually answering.

Pro tip

DYNAMIC is not an error and it is not a free-plan restriction. It means the request was never a candidate for caching. Ninety percent of “Cloudflare is not working” reports are a DYNAMIC header on an HTML page with no Cache Rule behind it.

Upgrade triggers: the symptom, and the plan that fixes it

Upgrade when a specific limit is blocking a specific task, not when your traffic grows. Here are the triggers that hold up.

Symptom you can namePlan that fixes it
You have written five custom WAF rules blocking scrapers and abusive paths by pattern, and you need a sixthPro (20 rules) or Business (100)
You need the full managed WAF rulesets, not just the free managed rulesetPro and above
Your users upload files between 100 MB and 200 MB through WordPress and requests fail at the edgeBusiness (200 MB request body)
A client contract or procurement form requires a written uptime SLABusiness (100% SLA with service credits)
You must upload and control your own TLS certificateBusiness or Enterprise
You need a support channel with a person on the other end during an incidentBusiness (chat) or Enterprise (account team)
You need to cache objects larger than 512 MBEnterprise
Your egress is mostly video or large binariesNot a plan change: move to Stream, R2 or Enterprise
Each row is a concrete blocker. “My traffic went up” is not on this list on purpose.

The most common bad reason to buy Pro is image optimisation. Paying $20 a month so a CDN can recompress images it did not create is backwards when the images are generated by your own CMS. Converting and sizing them properly at upload time with one of the WordPress WebP plugins gives you smaller files on every layer, including your origin and your backups. If you want a sense of the size reduction available before you spend anything, the ShortPixel write-up covers what a compression pass actually removes.

Misconceptions worth killing

Four beliefs about the free plan survive mainly because they are repeated, not because they are true.

“Free traffic gets slower routing”

Free zones use the same anycast network and the same edge locations. What paid tiers can add is Argo Smart Routing, a separately priced usage-based add-on that routes requests over less congested paths between Cloudflare data centres. That is an optimisation on top of the standard network, not the removal of a handicap. Free is the standard, not a degraded version of it.

“Free plans are dropped first during an attack”

DDoS protection is listed as unmetered on every plan including free, and Cloudflare’s public position has been consistent for years that it does not meter or bill attack traffic by plan. What paid tiers buy is more control during an attack: more custom rules, more managed rulesets, better analytics to see what is happening, and someone to talk to.

“Unmetered DDoS protection means nothing can take my site down”

It means volumetric attacks are absorbed at the edge without a bandwidth bill. It does not mean application-layer abuse stops reaching your origin. A slow, well-formed crawl of your WooCommerce filter URLs will happily exhaust PHP workers while every DDoS metric stays flat, because it does not look like an attack. That is what rules and caching are for.

“Cloudflare replaces my caching plugin”

It does not, and this is the one that costs people the most performance. Cloudflare caches at the edge for anonymous visitors. A page cache on the origin serves the request that reaches your server anyway, including every MISS, every BYPASS and every logged-in view. The two layers do different jobs, which is the same argument as the one about running Varnish alongside a WordPress page cache.

Verdict: which plan for which site

For the large majority of WordPress sites the free plan is the correct plan, not a trial you are supposed to grow out of. Here is where I would put specific profiles.

  • Blog, portfolio, brochure site, small publisher. Free, permanently. Add one bypass Cache Rule and one cache-everything rule and you have most of what Pro would give you. Spend the $20 on hosting or images instead.
  • Membership or community site. Free is fine, but the edge will bypass most of your traffic because those users are logged in. Your money belongs in origin caching and object caching, not in a CDN tier.
  • WooCommerce store, moderate catalogue. Free until you run out of custom WAF rules fighting scrapers and card testers, then Pro. Cache category and product pages, bypass cart, checkout and account.
  • Agency or SaaS marketing site with a procurement process. Business, for the SLA and certificate control, which you are buying as contract terms rather than as speed.
  • Course platform or download site with heavy media. No plan tier fixes this. Move the media to object storage or a video product and keep the site itself on free.

The one thing worth doing today, whichever plan you are on, is checking what cf-cache-status says on your own home page. If it says DYNAMIC, you do not have a plan problem. You have an unconfigured cache, and that is free to fix.

Frequently asked questions

How many Page Rules do you get on the Cloudflare free plan?

Three. Pro gets 20, Business 50 and Enterprise 125. Page Rules are now documented as deprecated, and the caching behaviour most people used them for has moved to Cache Rules, where the free plan gets 10 rules. If you are rationing three Page Rules for cache settings, you are hitting a limit you no longer need to hit.

Does the Cloudflare free plan have a bandwidth limit?

There is no published GB cap on the self-serve plans. What exists is a clause in Cloudflare’s service specific terms saying you must use paid products such as Stream or the Developer Platform to serve video and other large files through the CDN, and that access can be limited if the service is used for a disproportionate share of large non-HTML files.

Why is my WordPress site still slow after enabling Cloudflare?

Because Cloudflare does not cache HTML by default on any plan. Your CSS, JavaScript and images are served from the edge, while every page view still executes PHP on your origin. Time to First Byte barely moves until you add a Cache Rule that makes HTML eligible for cache and a bypass rule for logged-in and cart traffic.

What does cf-cache-status DYNAMIC mean?

It means the request was never eligible for caching, so Cloudflare passed it straight to your origin. On a WordPress site with no Cache Rule, that is the expected value for every HTML page. It is not an error and not a free-plan restriction. MISS would mean eligible but not present at that edge; DYNAMIC means not a candidate at all.

Do Cloudflare Workers free limits change if I upgrade to Pro?

No. Workers is billed as its own product, so the free Workers allowance of 100,000 requests per day and 10 ms of CPU time per invocation is the same whether your zone is on Free, Pro or Business. To raise those limits you move to the paid Workers plan, which is a separate subscription from the CDN plan tier.

Is Cloudflare Pro worth it just for image optimisation?

Usually not for a WordPress site. Compressing and converting images at upload time with a WordPress plugin produces smaller files everywhere, including your origin disk and your backups, and it keeps working if you ever leave Cloudflare. Buy Pro for the WAF rule allowance or managed rulesets, not to have a CDN recompress images your CMS generated.

What is the largest file Cloudflare will cache on the free plan?

512 MB, which is the same limit on Pro and Business. Enterprise defaults to 5 GB. The separate upload limit, meaning the maximum request body a visitor can send through Cloudflare to your origin, is 100 MB on Free and Pro, 200 MB on Business and 500 MB or more on Enterprise.

Should I keep my WordPress caching plugin if I use Cloudflare?

Yes. Cloudflare caches at the edge for anonymous visitors only, and it bypasses cache for logged-in users, carts and checkout. A page cache on your origin serves everything that still reaches your server, including every cache miss and every logged-in request. Removing the plugin sends all of that traffic straight into PHP.