Cloudflare Workers development, with the bill and boundaries known
Cloudflare publishes every unit price and every hard limit. None of it tells you what your build will cost or who answers when it breaks, and that part is ours.
Tell us what you are running
You do not need to bring a tech opinion to the first call. Tell us the shape of it.
The page you are reading runs on this wiring
Feeds in
D1, for rows
The things you would put in a table: accounts, orders, sessions, anything needing exact answers.
Feeds in
KV, for hot lookups
Small values read constantly and written rarely: a feature flag, a routing rule, a published price.
The centre
This site's Worker
The page you are reading is served by a Cloudflare Worker. That Worker binds D1, R2 and KV, so we are a customer of what we sell.
Serves
R2, for files
Anything a person uploads or downloads: images, video, PDFs, exports and backups.
Cloudflare documents a KV change as taking up to 60 seconds or more to show everywhere.
Open the network tab on this page and read the response headers.
That split is most of the architecture, and getting it wrong causes most of the trouble later. We have written up which parts of an application belong at the edge and which do not.
What actually goes wrong on this platform
D1 queries that stall without appearing in tracing.
One team reported queries hanging for seconds, with many of the stalls missing from the platform’s own dashboard.
A query with no index is billed for every row it reads.
A query that returns five rows can bill you for five million rows read.
Open WebSockets that never hibernate are billed by the clock.
Durable Objects bill for wall-clock duration while they run or sit in memory unable to hibernate.
Cloudflare does publish one control here: a maximum CPU time per invocation, set in the Wrangler file or the dashboard.
Three failures come up again and again, and each is easier to follow once you know what actually happens between someone opening your site and seeing it.
Where the data lives decides the bill
The per-request prices are the cheap part.
Above each product's included allowance, R2 Standard storage is 0.015 USD per gigabyte-month. Durable Objects stored data is 0.20 USD. Workers KV storage is 0.50 USD. D1 storage is 0.75 USD. All four rates were read on 2026-08-30.
Show data table
| Item | Marginal storage price, USD per gigabyte-month |
|---|---|
| R2 Standard | 0.015 |
| Durable Objects | 0.2 |
| Workers KV | 0.5 |
| D1 | 0.75 |
A file parked in a database row is a monthly cost rather than a style preference. Put the bytes in R2 and keep the row that points at them in D1.
Three things you can check about this platform before you commit to it
Everything this page says about Cloudflare's service level agreements is a reading of the published documents as they stood on 2026-08-30. It is reporting rather than legal advice. Before you sign anything, open the current version yourself.
Two of the three facts below are absences, and those decide the architecture.
Cloudflare R2 pricing page, read 2026-08-30.
Cloudflare Enterprise SLA section 12.1, read 2026-08-30.
Cloudflare Workers SLA section 2.1, read 2026-08-30.
The three products named in that section 12.1 enumeration are R2, Queues and Workers. D1, Workers KV and Durable Objects are not on that list. Read the uptime figure the way the document writes it. Cloudflare will use commercially reasonable efforts to provide a Monthly Uptime Percentage of 99.99% for Workers, and the agreement designates that a Service Level Objective.
What a missed Workers commitment actually pays back
An SLA is not insurance against your losses. It returns a share of what you paid for that one product, and only if you ask for it.
Show data table
| Item | Share of that month's Workers fees credited back |
|---|---|
| Below 99.99%, at or above 99.9% | 10% |
| Below 99.9%, at or above 95% | 25% |
| Below 95% | 50% |
Check whose remedy that is before you count on it. The Workers SLA is an Enterprise instrument and sits under the Enterprise agreement. An account paying the Workers Paid minimum does not hold this credit ladder.
R2 and Queues publish the same three percentages against different bands. In the R2 Service Level Agreement, read 2026-08-30, the credit is 10 percent below 99.9%, 25 percent below 99.0% and 50 percent below 95.0%. The two ladders are separate documents.
The Business SLA carries the process. You claim within five business days, submit by the end of the following billing month, and bring your own evidence. Section 5.3 caps total credits in any twelve-month period at one month of fees. That is why independent monitoring is a line in the build rather than an extra.
The responsibility split
Cloudflare has written down which failures are ours
Your script
Your script’s own errors.
The Workers SLA, section 3.2, excludes a custom 500 or 503 returned by your own script. Specimen: the error handler in your Worker.
Your configuration
Your bindings and your routes.
The same clause names misconfigured route triggers, incorrect configuration of bindings for KV, Durable Objects, D1 or R2, and mismanaged secrets. Specimen: the bindings block in your wrangler file.
Your monitoring
Watching your own service.
The Business SLA, section 7.1, reads: Company is not responsible for comprehensive monitoring of Customer Content; this responsibility lies with Customer. Specimen: your alerting, and who it wakes.
Your vendors
Anyone you hire, which includes us.
Business SLA 4.1(f) and Enterprise SLA 8.1(a)(iii) both exclude acts or omissions of your contractors or vendors. The Workers SLA does not carry that exclusion. Specimen: this contract.
Your runtime
The runtime moving under you.
A compatibility date pins your Worker to one day’s runtime semantics, and Cloudflare says it will support old dates indefinitely. Specimen: the compatibility_date line, and who owns moving it.
All five readings are as of 2026-08-30.
Here is our side of it. We strengthen infrastructure, refactor unstable backends and build pipelines that target 98 to 99 percent uptime under normal operating conditions. Cloud-provider outages sit outside our scope. Everything within it is our responsibility.
If you already have something running, paste your bindings block into the form on this page. We will come back with which side of that line each piece sits on. For build work, we have written up rendering a React application on Cloudflare Workers.
What moves if you ever leave, and what does not
Four of these five parts have a published route out. The one that does not is live state held in Durable Objects. Knowing which is which before you build is the whole of the lock-in question.
| Part of the build | What the published route out is | What it costs you to use it |
|---|---|---|
| Files in R2 | What the published route out isThe S3 API, which R2 implements | What it costs you to use itCloudflare publishes the compatibility as partial and in progress. Bucket policy, ACLs and versioning are listed as not implemented, so those have to be rebuilt wherever you land. |
| Rows in D1 | What the published route out iswrangler d1 export | What it costs you to use itYou get full schema and data as portable SQL that standard sqlite3 reads. Import back in is wrangler d1 execute --file, capped at 5 GiB per file. |
| Values in Workers KV | What the published route out isTwo published API calls | What it costs you to use itList a Namespace’s Keys returns up to 1000 keys per request with a cursor. Get multiple key-value pairs returns up to 100 values per POST. A million keys is roughly a thousand list calls and ten thousand read calls, so it is a loop rather than a single dump. |
| Your Worker code | What the published route out isOrdinary JavaScript or TypeScript | What it costs you to use itPortable, bounded by the runtime. Cloudflare marks each Node API supported, partially supported or not, and some entries import cleanly and then throw when called. |
| Live state in Durable Objects | What the published route out isNone published | What it costs you to use itThere is no bulk export, and the Enterprise SLA section 12.1 enumeration does not list Durable Objects. |
When Cloudflare Workers is the wrong place for this
Does the work need parallel CPU cores, a real filesystem, more than 128 MB of memory in one request, or a single run longer than fifteen minutes?
Workers
Choose this when
Right when requests are short, state fits the published limits, and you want the code and the four services around it close to the person making the request.
It costs you
D1 tops out at 10 GB per database and 100 columns per table on Workers Paid.
Containers, or a server
Choose this when
Right when Cloudflare’s own guidance points there: parallel CPU cores, large memory or disk, a full filesystem or Linux-like environment, or software already shipped as a container image.
It costs you
Cron Triggers, Queue consumers and Durable Object alarms all stop at fifteen minutes of wall time.
Every limit above comes from Cloudflare's own documentation, so you can apply the test tonight.
If your workload lands on the right-hand side, we will say so on the first call rather than after you have paid us. Often the honest answer is to build it as a conventional server application instead, and we do that work too.
What Cloudflare will invoice you for
Two bills come out of this and they go to two different places. Cloudflare's is published to the cent.
| Item | Details |
|---|---|
| Account minimum | 5 USD per month, consumed by usage across Workers, Pages Functions, Workers KV, Hyperdrive and Durable Objects. |
| Included in it | 10 million requests and 30 million CPU-milliseconds per month. |
| Above that | 0.30 USD per additional million requests, and 0.02 USD per additional million CPU-milliseconds. |
| R2 egress bandwidth | No charge, on any storage class. |
Those first three rows are on Cloudflare's Workers pricing page, read 2026-08-30. The egress row is on the R2 pricing page, and it carries a bound. Egress is free reading directly from R2 through the Workers API, the S3 API and r2.dev domains. If you connect other metered services to the bucket, those services can still charge you.
None of that is our fee.
What moves our half of the number
We work in two shapes. A scoped project means full scoping first, with execution starting only after you have signed off on it. A dedicated team means a cross-functional group in your sprints, starting on the milestones that are ready while the later ones are refined alongside.
There is no price printed here because there is no honest one before scoping.
This is what decides it, heaviest first
1
How many services are wired together
How many of the four services have to be wired together, each with its own binding.
Why 2 waits for 1Every product added brings its own failure mode and its own line on the invoice.
2
Moving live state off your database
Whether live state moves off a database you already run, or stays where it is.
Why 3 waits for 2A migration carries a cutover, that is the moment live traffic moves to the new system, and a rollback if it has to move back. A new store carries neither.
3
Whether your Node dependencies survive
Whether your existing Node dependencies survive the runtime, which Cloudflare publishes per module.
Why 4 waits for 3It is answerable from a table rather than discovered during the build, before anyone signs.
4
Whether you want us reachable after launch
Last because it is a standing commitment rather than a build cost.
The questions people actually ask us about this
Can we cap what Cloudflare can bill us in a month?
- As of 2026-08-30, Cloudflare’s published Workers pricing page carries no per-account spend ceiling, no budget limit and no billing alert.
- It does publish a maximum CPU time per invocation, set in the Wrangler configuration file or in the dashboard under CPU Limits. Cloudflare describes that control as protection against accidental runaway bills and denial-of-wallet attacks.
- The Free plan also stops hard at 100,000 requests per day.
- Atyantik sets that CPU ceiling per Worker during the build and puts a spend alarm in your own monitoring.
What actually makes the bill go up?
- A D1 query with no index is billed for every row it reads. A query returning five rows can bill five million rows read.
- A Durable Object holding open WebSockets without the Hibernation API is billed for wall-clock duration the whole time those connections stay open.
- Storage lands in the wrong product. Cloudflare’s published rates above each included allowance, read on 2026-08-30, are 0.015 USD per gigabyte-month for R2 Standard and 0.20 for Durable Objects stored data. Workers KV is 0.50 and D1 is 0.75.
If our Postgres is in us-east-1, what is the point of running the code at the edge?
- Cloudflare’s D1 keeps data readable near the user.
- Workers KV serves values that tolerate being stale, and Cloudflare documents a change as taking up to 60 seconds or more to become visible in other locations. Cloudflare’s KV documentation was read on 2026-08-30.
- Sessions, feature flags, routing rules, catalogue reads and rendered fragments move well.
- Anything needing an exact current answer from your own Postgres stays where it is.
Who do we call when it breaks, and what does the support tier we are on actually get us?
- Free gets the community forum, with support cases only for billing, account and registrar issues.
- Pro gets support cases.
- Business adds chat.
- Enterprise adds emergency phone. It is the only tier with published response times, at 2 hours for P1, 4 for P2 and 48 for P3 and P4.
- Enterprise Premium is 1, 2, 24 and 24.
- Cloudflare states that Pay-as-you-go and Free customers are offered no SLA. It also states its support will not make configuration changes on your behalf and will not debug your code.
- One practitioner reported in July 2020 that a paid ticket came back with a bot reply. That is one account from one person rather than a pattern.
- Atyantik does not resell Cloudflare support and promises no response time on Cloudflare’s behalf.
How locked in are we? Can we run this anywhere else?
- R2 implements the S3 API, though Cloudflare publishes that compatibility as partial and in progress, with bucket policy, ACLs and versioning listed as not implemented.
- D1 exports full schema and data to portable SQL through wrangler d1 export, readable by standard sqlite3.
- Workers KV comes out through two published API calls. List up to 1000 keys per request with a cursor, then read up to 100 values per request.
- The hard one is live state in Durable Objects. It has no published bulk export, and the Enterprise SLA section 12.1 enumeration does not list it, read on 2026-08-30.
- Atyantik decides with you up front how much of the system is allowed to hold state there.
Can our team maintain this after you leave, or does it need people who know Workers?
Will we own the accounts and the code, or will they be in your name?
- Atyantik opens the Cloudflare account in your company’s name with your billing details.
- We work inside it under access you grant and can revoke at any time.
- The repository is yours from the first commit.
- If Atyantik walked away tomorrow you would keep the account, the code, the data and the deploy pipeline, with nothing to transfer back.
- That is what we commit to for this engagement, and your IP is yours from Day 1.
Tell us what you are running, or want built
Two good things can come out of a first call. One is a written scope you have signed off on. The other is us telling you that this platform is wrong for what you are doing. That answer costs nothing and comes before any money changes hands.
Send what you have. A repository link, your bindings block, a rough traffic number, or three lines about the thing you want built. You do not need to bring a tech opinion to the first call.

- No tech opinion required
- A written scope you sign off on
- That answer costs nothing
