The bill is yours, and this page is about which meters each capability turns.
Cloudflare’s own pricing pages are the authority. When this page and Cloudflare disagree, Cloudflare is right. What is here is how the kit’s shapes map onto their meters, and which numbers you can actually change.
The honest summary
What a waiting queue costs is the one line item worth modeling separately, Durable Objects is why, and is Pithy for you? is the decision this feeds.
For most apps, single-digit dollars a month. Workers, D1 and KV at ordinary application volumes are cheap, and several capabilities cost nothing at all until somebody uses them.
Two things scale in ways worth understanding before you ship: a waiting matchmaking queue, and AI inference. Both are covered below.
What costs nothing until it is used
auth · secrets · audit · turnstile · i18n · leaderboard · rating · ledger
All of them are rows in a database you already have, plus requests you were already serving. No standing charge, no idle cost.
i18n and turnstile have no durable storage at all.
What has a standing cost
A capability that owns Workflows ships a deployed host Worker. Email, media, storage’s sweep, payments’ reconciliation, the closed-test daily pass. Each is a Worker sitting there, and a scheduled one wakes on its cadence whether or not there is work.
A daily pass is a daily cost, and it is a small one. An every-minute scheduler is sixty times that and still small.
R2 storage bills for what is stored, which is the one meter that only goes up unless something removes things.
Two platform facts every Durable Object inherits
WebSocket messages bill at a 20-to-1 ratio — a message is a fifth of a request rather than a request.
Duration bills the full memory allocation, and only while an object is awake. That second clause is what the whole presence design rests on.
The presence socket is nearly free, and here is why
Presence holds every online player’s connection through the Hibernation API. A hibernating object bills no duration — so a thousand players sitting in a menu with the app open cost nothing to hold. You pay for the events that actually flow, discounted.
That is only true because of what the object refuses to do. It keeps no in-memory connection registry, stashes identity through the platform’s own attachment mechanism rather than in a field, and never sets a timer.
A single interval anywhere in it would pin it in memory and bill duration continuously — for every player online, forever.
Worth knowing if you write your own: hibernation is not a flag, it is a discipline.
The queue’s sweep is the dial
The open queue is one Durable Object per game, and it is the only thing here that wakes on its own.
While anybody is waiting, an alarm is armed. It wakes, re-attempts pairing, widens every waiting player’s skill band, and re-arms.
| Sweep interval | Wakes per waiting minute, per game | What it buys |
|---|---|---|
| 1s | 60 | Bands widen almost continuously |
| 5s (default) | 12 | A player waits at most five seconds past the moment their band grew wide enough |
| 15s | 4 | A fifth of the default’s wakes. Noticeable on a thin queue |
An empty queue clears its alarm. The last player to leave deletes it — so a game nobody is queueing for wakes zero times and bills nothing, whatever the interval says.
That is why it is a per-waiting-minute rate rather than a standing charge.
Two things do not change with it. A match forms the moment an opponent is already waiting, without waiting for a sweep — the sweep exists to widen bands rather than to pair. And storage is read fresh per handler by design: holding state in memory to avoid a read would cost the hibernation that makes the object cheap.
One object per game. Ten games are ten coordinators, each idle one billing nothing — and that is also the sharding: a game expecting more throughput than one object carries wants splitting into region- or bracket-keyed games rather than a longer sweep.
AI runs on your binding, on your bill
Media’s alt text, transcription and text extraction. Support’s classification.
That is the point — your users’ files and mail never leave your infrastructure to be processed — and it is also the meter most likely to surprise you, because inference is priced per unit of work rather than per request.
All of it is opt-in. Enrichment is off unless you ask for it, and nothing costs anything until a file of that type arrives.
Vectorize is the one with no free local path
Cloudflare ships no local emulation, so a dev search reaches a real remote index and costs a real query.
Embeddings are inference. Re-embedding a corpus after a model change is a bulk operation with a bulk cost, which is worth knowing before you change the model casually.
The meters, by capability
| Capability | Turns |
|---|---|
auth, audit, ledger, rating, leaderboard | D1 reads and writes |
secrets | D1, plus a manager Worker per environment |
email | D1, a host Worker, an every-minute scheduler, and outbound mail |
storage, media | R2 storage and operations, plus a host Worker; media adds AI when enabled |
vector | Vectorize, plus AI for embeddings. Remote even in dev |
multiplayer | Durable Object requests and duration |
matchmaking | Durable Objects — the sweep is the dial — plus KV for room codes |
payments | D1, plus a nightly reconciliation pass |
support | D1, R2 for attachments, and AI for classification |
testers | D1, plus a daily pass |
Keeping it down
Sample your logs under heavy traffic. The rate is a config key.
Set a storage quota before somebody discovers your upload endpoint. Without a considered value, the first person to find it decides how much R2 you buy.
Turn enrichment on per type, not wholesale.
Read the queue costs page before shipping a game with an open queue.
Let the sweeps do their job. Storage’s daily reconciliation and email’s suppression handling exist partly to stop orphans accumulating.