Cloudflare Billing Deep Dive: Workers, R2, Argo, Stream
Cloudflare bills beyond plan price through Workers, R2, Stream, Argo, and custom rate limiting. Here's what's actually billed and where teams over-buy.
By Andrii Votiakov on
Cloudflare markets itself as simple and transparent on pricing. The base plans are straightforward. But once you start enabling Workers, R2, Stream, Argo Smart Routing, and custom WAF rules, the bill compounds fast. I've reviewed Cloudflare accounts for teams paying $200/month and teams paying $12,000/month. The over-buying patterns are consistent enough to be worth writing down.
Quick answer
The largest Cloudflare cost overruns come from: Stream charged per minute of stored and delivered video, Argo Smart Routing at $0.10/GB on top of base plan, Workers usage beyond the included free tier at $0.50/million requests, and R2 Class A operations (writes and lists) at $4.50/million. The plan tier itself (Pro vs Business vs Enterprise) is usually fine — most teams over-buy add-on products, not plan upgrades.
What's actually billed beyond the plan price
Cloudflare's plan pricing is a floor, not a ceiling. Here's what layers on top:
| Product | Billing model | Where it surprises |
|---|---|---|
| Workers | $5/month + $0.50/M requests over 10M, $0.02/M CPU-ms over 30M | High-frequency or CPU-heavy scripts |
| R2 | $0.015/GB storage + Class A/B ops | Write-heavy workloads, frequent list operations |
| Stream | $5/1,000 min stored/month + $1/1,000 min delivered | Large video libraries or high-traffic video |
| Argo Smart Routing | $0.10/GB on top of plan | Enabled globally by default if you click once |
| Image Resizing | $0.90 per 1,000 unique transformations (Business+) | Used as a general image CDN without caching |
| Rate Limiting | $0.05/10,000 requests (legacy model) | High-traffic APIs with many rules |
| Access (Zero Trust) | Per-seat after free tier | Teams > 50 users |
None of these are hidden — they're in the pricing page. But teams activate them without understanding the volume implications.
Pro vs Business vs Enterprise: what you actually get
Cloudflare Pro ($20/month)
Includes: 3 page rules, Cloudflare WAF with managed rulesets, basic analytics, image optimisation (polish/mirage), Always Online.
Good for: personal projects, small marketing sites, simple APIs where you don't need custom WAF rules.
Not for: anything needing advanced rate limiting, custom firewall rules at scale, 24/7 support, or >50 concurrent Workers.
Cloudflare Business ($200/month)
Adds: 100% uptime SLA, custom SSL certificates, 50 page rules, PCI compliance, priority support, advanced certificate manager.
Good for: production e-commerce, SaaS applications where the uptime SLA matters, compliance requirements.
Not for: teams that only need the SLA but are light on all other Business features — you're paying $200/month for the SLA, so make sure you actually need it.
Cloudflare Enterprise
Custom pricing, typically $3,000-$10,000+/month depending on traffic volume and features negotiated. Includes dedicated support, custom DDoS protection, Cloudflare for Teams (Access), advanced analytics, and negotiated Workers/R2 pricing.
Over-buying pattern: teams getting pushed into Enterprise for features available on Business, or for support tiers they rarely use. Enterprise is the right tier for >50M requests/day, complex Zero Trust setups, or regulated industries — not for mid-size SaaS.
Workers: where the compute cost hides
Workers on the free tier includes 100,000 requests/day at zero cost. After that you pay $5/month for Workers Paid, which includes 10 million requests/month and 30 million CPU-milliseconds.
The CPU-milliseconds charge is the one teams miss. If your Worker does non-trivial computation — parsing, external fetching with fetch(), cryptographic operations — the CPU-ms can exceed the included 30M fast.
Real example: a team running a Worker that fetches from an origin, parses a JSON response, and applies business logic. Average 8ms CPU per request. At 10M requests/month that's 80M CPU-ms — 50M over the free allocation = $1.00/month. Fine. At 100M requests/month it's 800M CPU-ms = $770/month in CPU alone. That's where it stings.
Fixes:
- Cache aggressively in Workers KV or via
caches.defaultto reduce origin fetches - Move heavy computation to a backend service; keep Workers as a lightweight proxy
- Audit which routes are actually hitting Workers vs being handled by Cloudflare's cache layer
R2: watch Class A operations
R2 storage is cheap ($0.015/GB/month vs S3's $0.023/GB). For a full comparison of R2 vs S3 costs, including egress and request modelling, that post has the numbers. Reads (Class B) are $0.36/million — also cheap. The expensive one is Class A operations: $4.50/million. Class A covers PutObject, CopyObject, CompleteMultipartUpload, CreateMultipartUpload, and List operations.
Where teams get caught:
- Frequent list operations: an application polling
ListObjectsV2every 5 seconds on a bucket with many objects. At 12 calls/minute, that's ~500k operations/day = $2.25/day = ~$67/month just from listing. - Write-heavy pipelines: ingesting logs, events, or analytics data as individual small objects. Each write is a Class A operation. 1M writes/day = 30M operations/month = $135/month.
Fix: batch writes into larger objects where possible, cache list results in Workers KV, and avoid polling patterns — use event notifications instead.
Argo Smart Routing: often enabled, rarely audited
Argo Smart Routing intelligently routes traffic through Cloudflare's private backbone rather than the public internet, reducing latency by 30% on average for dynamic content. It's genuinely useful for latency-sensitive applications. It costs $0.10/GB of traffic routed.
The problem: it's easy to enable and hard to justify for static content or cached responses. If 90% of your traffic is served from Cloudflare's cache (as it should be for a well-configured CDN), Argo only applies to the cache misses hitting your origin. But if you serve dynamic, uncacheable content at high volume — API responses, authentication flows, personalised pages — Argo charges add up fast.
At 10 TB/month of origin-fetched traffic, Argo costs $1,000/month. For a typical static site, it's $5-20/month because cache hit rates are high and Argo rarely fires.
Check: go to the Argo page in your Cloudflare dashboard and look at how much traffic is actually being "smart routed" versus the total bandwidth. If the Argo-routed traffic is a small fraction and the latency improvement is minimal on your specific routes, disable it.
Stream: the subscription inside your subscription
Cloudflare Stream is a managed video hosting and delivery service. The pricing:
- Storage: $5 per 1,000 minutes stored per month
- Delivery: $1 per 1,000 minutes delivered
For 100 hours of video stored: 6,000 minutes × $5/1,000 = $30/month. Deliver those 100 hours to 10 users: 60,000 minutes × $1/1,000 = $60/month.
That scales steeply. A video-heavy product serving 5,000 users watching a combined 50,000 hours/month: 3M minutes × $1/1,000 = $3,000/month in delivery alone.
Compare this to R2 + a video player serving from R2: egress is free, storage is $0.015/GB. 50,000 hours at 720p (~1.5 GB/hour) = 75 TB stored = $1,125/month storage + $0 delivery. The delivery saving at scale is significant — though you lose Stream's built-in adaptive bitrate encoding, player, and analytics.
Teams that use Stream for a few internal videos are fine. Teams using it as a core product feature at scale should run the numbers against self-managed delivery.
WAF and custom rate limiting
The managed WAF ruleset is included in all paid plans. Custom WAF rules (OWASP, custom firewall rules) are included up to certain limits per plan:
- Pro: 5 custom rules
- Business: 20 custom rules
- Enterprise: unlimited
Legacy rate limiting (still on some accounts) charges $0.05 per 10,000 requests that are evaluated — not just blocked, evaluated. A high-traffic route running through 5 legacy rate limit rules at 50M requests/month = 5 × 50M evaluations = 250M evaluations = $1,250/month. Upgrade to the modern rate limiting (included in plan), which doesn't have per-evaluation charges.
If you're on the legacy rate limiting model, migrating to the new system is a priority. The rules syntax changed, but the migration is well-documented.
The audit checklist I run on Cloudflare accounts
- Billing page → review every line item; identify anything >$50/month beyond the plan
- Workers → check invocation counts and CPU-ms in the Workers dashboard; look for high-CPU scripts
- R2 buckets → review Class A operation counts; look for polling or high-write patterns
- Argo → check actual Argo-routed bandwidth vs total; weigh cost vs latency improvement
- Stream → check stored minutes and delivered minutes; compare against R2 self-managed option
- Rate limiting → confirm you're on the new model, not legacy per-evaluation billing
- Plan tier → confirm Business or Enterprise features are actually being used
Realistic numbers
A SaaS team on Cloudflare Business (~$1,800/month total bill):
| Line item | Before | After |
|---|---|---|
| Base plan (Business) | $200 | $200 |
| Workers (CPU-heavy scripts) | $420 | $85 (moved heavy logic to backend) |
| R2 Class A operations (polling) | $310 | $40 (replaced polling with events) |
| Argo (low-cache-hit API traffic) | $680 | $120 (disabled on cached routes) |
| Stream (moved to R2 self-serve) | $190 | $35 (kept only internal videos on Stream) |
Total: $1,800 → $480/month, ~73% reduction. Changes took 2 days.
The base plan was the right tier throughout. Every saving came from add-on products that had been enabled without understanding the volume implications.
If your Cloudflare bill has grown faster than your traffic, I can run a quick audit on a pay-for-savings basis. Book a call.