Cloudflare Workers development

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.

How we handle what you send is set out in our privacy notice.

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
Marginal storage price per gigabyte-month above each product's included allowance. These are rates, not a bill.
Item Marginal storage price, USD per gigabyte-month
R2 Standard 0.015
Durable Objects 0.2
Workers KV 0.5
D1 0.75
Figure Marginal storage price per gigabyte-month above each product's included allowance. These are rates, not a bill. Cloudflare's published pricing pages for R2, Durable Objects, Workers KV and D1, read 2026-08-30.

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.

$0Charge for R2 egress bandwidth

Cloudflare R2 pricing page, read 2026-08-30.

3Developer products with a service-specific SLA

Cloudflare Enterprise SLA section 12.1, read 2026-08-30.

99.99%Workers Monthly Uptime Percentage objective

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
Service credit as a share of what you paid Cloudflare for Workers that month.
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%
Figure Service credit as a share of what you paid Cloudflare for Workers that month. Cloudflare Workers Service Level Agreement, section 3.1, read 2026-08-30.

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.

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.

What each part of a Cloudflare build takes to move elsewhere, read 2026-08-30.
Part of the buildWhat the published route out isWhat it costs you to use it
Files in R2The S3 API, which R2 implementsCloudflare 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 D1wrangler d1 exportYou 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 KVTwo published API callsList 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 codeOrdinary JavaScript or TypeScriptPortable, 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 ObjectsNone publishedThere 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. 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 1

    Every product added brings its own failure mode and its own line on the invoice.

  2. 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 2

    A 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. 3

    Whether your Node dependencies survive

    Whether your existing Node dependencies survive the runtime, which Cloudflare publishes per module.

    Why 4 waits for 3

    It is answerable from a table rather than discovered during the build, before anyone signs.

  4. 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?
Not at a dollar figure.
  • 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?
Three design choices, in the order they usually show 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?
For anything that must query that database, there is little point: a request from Sydney still crosses the Pacific and back. The gain is in the reads you can move off it.
  • 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?
It depends on the Cloudflare account plan, and Cloudflare publishes the table. Read on 2026-08-30:
  • 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?
It is bounded rather than unknown, and it differs by component.
  • 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?
A JavaScript or TypeScript team maintains a Worker without retraining on the language, with one caveat worth planning for. The runtime is not Node. Cloudflare publishes each Node.js API as supported, partially supported or not supported. Some entries are shims that let the import succeed and then throw when a method is called. Cloudflare’s Node.js compatibility page was read on 2026-08-30. So the dependency list is where the learning sits. Atyantik hands over the Wrangler configuration, the bindings, the runbook and the deploy pipeline at the end of a build. We stay reachable afterwards if you want that.
Will we own the accounts and the code, or will they be in your name?
Yours, both of them.
  • 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.

Tirth Bodawala, Chief Technology Officer of Atyantik Technologies
Tirth BodawalaChief Technology Officer, Atyantik Technologies
  • No tech opinion required
  • A written scope you sign off on
  • That answer costs nothing

Get in touch

We usually reply within 24 hours.

How we handle what you send is set out in our privacy notice.