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 2026-01-27

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.default to 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 ListObjectsV2 every 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

  1. Billing page → review every line item; identify anything >$50/month beyond the plan
  2. Workers → check invocation counts and CPU-ms in the Workers dashboard; look for high-CPU scripts
  3. R2 buckets → review Class A operation counts; look for polling or high-write patterns
  4. Argo → check actual Argo-routed bandwidth vs total; weigh cost vs latency improvement
  5. Stream → check stored minutes and delivered minutes; compare against R2 self-managed option
  6. Rate limiting → confirm you're on the new model, not legacy per-evaluation billing
  7. 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.