Pricing

The Workers Paid plan costs $5/mo and bundles generous allowances for most services. The free tier is useful for experiments but hits limits fast in production. This page breaks down what you get, what costs extra, and where billing surprises hide.

Workers Paid Plan ($5/mo)

ServiceIncludedOverage Rate
Workers requests10 million/mo$0.30 per additional million
Workers CPU time30 million ms/mo$0.02 per additional million ms
Workers duration400,000 GB-s/mo$12.50 per additional million GB-s
D1 rows read25 billion/mo$0.001 per additional million
D1 rows written50 million/mo$1.00 per additional million
D1 storage5 GB$0.75 per additional GB/mo
R2 storage10 GB/mo$0.015 per additional GB/mo
R2 Class A ops (write)1 million/mo$4.50 per additional million
R2 Class B ops (read)10 million/mo$0.36 per additional million
KV reads10 million/mo$0.50 per additional million
KV writes1 million/mo$5.00 per additional million
KV storage1 GB$0.50 per additional GB/mo
DO requests1 million/mo$0.15 per additional million
DO duration400,000 GB-s/mo$12.50 per additional million GB-s
DO storage1 GB (transactional)varies
Queues messages1 million/mo$0.40 per additional million
Queues operations1 million/mo$0.40 per additional million
Vectorize stored dimensions30 million/mo$0.01 per additional million
Vectorize queried dimensions50 million/mo$0.01 per additional million
HyperdriveIncluded (no separate charge)n/a

Gotcha: R2 has zero egress fees. This is the primary reason to choose R2 over S3 for read-heavy workloads. You only pay for storage and operations.

Free Tier Limits

ServiceFree Allowance
Workers requests100,000/day (not per month)
Workers CPU time10 ms per invocation
D1 rows read5 million/day
D1 rows written100,000/day
D1 storage5 GB
R2 storage10 GB/mo
R2 Class A ops1 million/mo
R2 Class B ops10 million/mo
KV reads100,000/day
KV writes1,000/day
KV storage1 GB
Worker size3 MB compressed (vs 10 MB on paid)
Subrequests50 per invocation (vs 10,000 on paid)

The free tier measures some limits per day rather than per month. This catches people who expect monthly quotas.

D1 Billing: The Biggest Surprise

D1 charges per “rows read,” but this counts rows scanned, not rows returned. A query that scans 10,000 rows to return 5 results costs you 10,000 rows read.

-- This scans the ENTIRE table if there's no index on user_id
SELECT * FROM webhooks WHERE user_id = 'abc123';

Without an index, every query is a full table scan. At scale, this adds up fast.

Mitigations:

  1. Create indexes on every column you filter or join on:
CREATE INDEX idx_webhooks_user_id ON webhooks(user_id);
CREATE INDEX idx_webhooks_created ON webhooks(created_at);
  1. Use EXPLAIN QUERY PLAN to check whether queries use indexes:
EXPLAIN QUERY PLAN SELECT * FROM webhooks WHERE user_id = 'abc123';
-- Look for "USING INDEX" in the output
  1. Paginate with cursors instead of OFFSET (which re-scans skipped rows):
-- Cursor-based pagination (efficient)
SELECT * FROM webhooks
WHERE id > :last_seen_id
ORDER BY id
LIMIT 20;

Gotcha: D1’s 25 billion rows-read allowance sounds huge, but a single unindexed query on a 1M-row table burns through 1M rows per call. Index everything you query.

What $5/mo Realistically Covers

For a side project or small SaaS:

  • Compute: 10M requests handles ~4 requests/second sustained, 24/7. Enough for most side projects.
  • D1: 5 GB storage, 50M writes/mo. Sufficient for apps with moderate write volume.
  • R2: 10 GB object storage with unlimited egress. Covers image hosting, file uploads.
  • KV: 10M reads/mo. Good for caching, config, feature flags.
  • Queues: 1M messages. Adequate for async job processing.

A typical webhook processing app (like the Webhook Hub) would cost $5/mo flat until it processes several million webhooks per month.

Services Not in the $5 Plan

Some services have separate pricing:

ServicePricing
TunnelsFree (included with any plan)
TurnstileFree (unlimited)
Workers AIPay-per-use ($0.011 per 1K neurons)
AI GatewayFree for first 100K logs/day
Images$5/mo per 100K images stored
Stream$5/mo per 1K minutes stored, $1 per 1K minutes delivered
ContainersPricing not yet finalized (currently in beta)

Cost Optimization Tips

  1. Cache aggressively with KV to reduce Worker invocations and D1 reads.
  2. Batch queue messages - sending 10 items in one message costs less than 10 individual messages.
  3. Use R2 lifecycle rules to auto-delete temporary files (e.g., webhook payloads older than 30 days).
  4. Monitor D1 row reads in the Cloudflare dashboard. This is the metric most likely to surprise you.
  5. Set billing alerts in the Cloudflare dashboard to catch unexpected spikes early.

Further Reading