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)
| Service | Included | Overage Rate |
|---|---|---|
| Workers requests | 10 million/mo | $0.30 per additional million |
| Workers CPU time | 30 million ms/mo | $0.02 per additional million ms |
| Workers duration | 400,000 GB-s/mo | $12.50 per additional million GB-s |
| D1 rows read | 25 billion/mo | $0.001 per additional million |
| D1 rows written | 50 million/mo | $1.00 per additional million |
| D1 storage | 5 GB | $0.75 per additional GB/mo |
| R2 storage | 10 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 reads | 10 million/mo | $0.50 per additional million |
| KV writes | 1 million/mo | $5.00 per additional million |
| KV storage | 1 GB | $0.50 per additional GB/mo |
| DO requests | 1 million/mo | $0.15 per additional million |
| DO duration | 400,000 GB-s/mo | $12.50 per additional million GB-s |
| DO storage | 1 GB (transactional) | varies |
| Queues messages | 1 million/mo | $0.40 per additional million |
| Queues operations | 1 million/mo | $0.40 per additional million |
| Vectorize stored dimensions | 30 million/mo | $0.01 per additional million |
| Vectorize queried dimensions | 50 million/mo | $0.01 per additional million |
| Hyperdrive | Included (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
| Service | Free Allowance |
|---|---|
| Workers requests | 100,000/day (not per month) |
| Workers CPU time | 10 ms per invocation |
| D1 rows read | 5 million/day |
| D1 rows written | 100,000/day |
| D1 storage | 5 GB |
| R2 storage | 10 GB/mo |
| R2 Class A ops | 1 million/mo |
| R2 Class B ops | 10 million/mo |
| KV reads | 100,000/day |
| KV writes | 1,000/day |
| KV storage | 1 GB |
| Worker size | 3 MB compressed (vs 10 MB on paid) |
| Subrequests | 50 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:
- 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);
- Use
EXPLAIN QUERY PLANto check whether queries use indexes:
EXPLAIN QUERY PLAN SELECT * FROM webhooks WHERE user_id = 'abc123';
-- Look for "USING INDEX" in the output
- 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:
| Service | Pricing |
|---|---|
| Tunnels | Free (included with any plan) |
| Turnstile | Free (unlimited) |
| Workers AI | Pay-per-use ($0.011 per 1K neurons) |
| AI Gateway | Free for first 100K logs/day |
| Images | $5/mo per 100K images stored |
| Stream | $5/mo per 1K minutes stored, $1 per 1K minutes delivered |
| Containers | Pricing not yet finalized (currently in beta) |
Cost Optimization Tips
- Cache aggressively with KV to reduce Worker invocations and D1 reads.
- Batch queue messages - sending 10 items in one message costs less than 10 individual messages.
- Use R2 lifecycle rules to auto-delete temporary files (e.g., webhook payloads older than 30 days).
- Monitor D1 row reads in the Cloudflare dashboard. This is the metric most likely to surprise you.
- Set billing alerts in the Cloudflare dashboard to catch unexpected spikes early.