Table of Contents
The short answer
Building an app with an AI app builder costs somewhere between nothing and a few dollars per generation, and the reason nobody gives you a straight number is that the cost is driven by how many tokens the model writes, not by how many times you press send.
On Fabricate specifically, the unit is a credit, and a credit is defined in code as 10,000 weighted tokens (`TOKENS_PER_CREDIT` in worker/config/billing.ts). Free gives you 60 credits per month at no cost, Pro gives 350 for $25 per month, Scale gives 700 for $50 per month. There is no per-seat charge and no usage bill on top; when the credits are gone, generation stops until the next monthly refresh or an upgrade.
The useful question is not "what does one app cost" but "how many credits does a turn burn, and what makes that number move". The rest of this post answers that with the actual weights, the actual arithmetic, and the parts of the model that work against you.
Note
Everything below is traceable to code in this repository: worker/config/billing.ts holds the constants, worker/database/services/UsageService.ts holds the weighting function, and worker/agents/inferutils/config.ts holds the model routing table that determines which multiplier applies.
What a credit actually is
A Fabricate credit is 10,000 weighted tokens. Weighted, not raw. Raw token counts are useless as a billing unit because a token the model reads and a token the model writes differ in cost by roughly a factor of five, and a token served from cache costs a fraction of either.
So every token is multiplied by a weight before it is counted. The weights, defined as `TOKEN_WEIGHTS` in worker/config/billing.ts, are:
Input: 1.0. Output: 5.0. Cache read: 0.1. Cache write with a 5-minute TTL: 1.25. Cache write with a 1-hour TTL: 2.0.
Those numbers are not arbitrary. They are price ratios against a fixed reference rate of $3 per million input tokens (`SONNET_INPUT_USD_PER_MILLION_TOKENS` in the same file), used purely as a normalization baseline so that usage from any provider can be expressed in one comparable unit. That reference rate is an accounting yardstick, not a model you are running: Fabricate routes to Gemini 3.6 Flash, Gemini 3.1 Pro Preview, Gemini 3.5 Flash Lite and Grok 4.3 depending on the step, per the routing table in worker/agents/inferutils/config.ts.
The conversion is one line of arithmetic: sum every token multiplied by its weight, divide by 10,000, and that is your credit charge. Internally the result is kept at six decimal places (`CREDIT_PRECISION_FACTOR = 1_000_000`) so that a long run charged in many small increments does not accumulate rounding error, and there is a small floor per charge (`MINIMUM_CREDIT_CHARGE`) so that trivial calls are not billed as zero.
Why output is weighted 5x and cache reads are nearly free
Output tokens carry a weight of 5.0 because the reference rate prices output at $15 per million against $3 per million for input. This is not a platform markup; it reflects how model providers price. Reading your prompt is a parallel operation across the whole sequence. Writing a response is sequential -- each token depends on the one before it, so the model runs a full forward pass per token generated. Every provider prices output above input, though the exact ratio varies by model: across the models Fabricate routes to, the output-to-input price ratio in `MODEL_COSTS` ranges from about 2x on Grok 4.3 to about 8x on Gemini 3.5 Flash Lite. Because the charged weight is derived per model rather than fixed, that variation is passed through rather than averaged away.
The practical consequence is that a request that reads a lot and writes a little is cheap, and a request that writes a lot is expensive regardless of how short your prompt was. "Rewrite this entire file" costs more than "read these twelve files and tell me which one has the bug", even though the second one sounds like more work.
Cache reads are weighted 0.1 -- one tenth of a fresh input token -- because a cached prefix has already been processed. The provider stores the computed state and replays it instead of recomputing it, and charges around a tenth of the input rate for the privilege. The cache-write weights (1.25 for a 5-minute TTL, 2.0 for an hour) exist for providers that bill cache creation separately; on the providers Fabricate currently routes to, no cache-write tokens are reported, so in practice that line does not appear on your bill.
One honest caveat about caching, because it changes how much you should count on it. Fabricate does not place explicit cache markers on the models it routes to -- caching there is automatic and provider-managed, so whether a given turn gets a cache hit is the provider's decision, not ours. When a hit does happen the provider reports the cached token count and the 0.1 weight applies. When it does not, those tokens bill as ordinary input at 1.0. So treat cheaper iteration as the strong tendency it is, not as a guarantee you can budget to the credit.
Tip
If you want to lower your credit burn, the highest-leverage change is not shorter prompts. It is asking for smaller diffs. Output volume dominates the bill; input volume barely moves it once caching is warm.
Ready to Build?
Start building your full-stack application with Fabricate. Free tier available — no credit card required.
Start Building FreeWorked arithmetic: turning a run into credits
Here is the conversion done explicitly, so you can run it on your own numbers. These figures are illustrative arithmetic chosen to show the mechanics -- they are not measured platform averages, and you should not read them as a typical build.
Take a hypothetical generation that consumes 40,000 input tokens, 12,000 output tokens, and 200,000 cache-read tokens. Apply the baseline weights:
Input: 40,000 x 1.0 = 40,000 weighted tokens. Output: 12,000 x 5.0 = 60,000 weighted tokens. Cache read: 200,000 x 0.1 = 20,000 weighted tokens. Total: 120,000 weighted tokens. Divide by 10,000 tokens per credit and you get 12.0 credits.
Now look at what that total is made of. Output was 12,000 of the 252,000 raw tokens the run touched -- under 5 percent by count -- and it accounted for 60,000 of the 120,000 weighted tokens, exactly half the bill. Cache reads were 200,000 raw tokens, nearly 80 percent of everything the run processed, and contributed 20,000 weighted tokens, about 17 percent of the bill.
That inversion is the whole model in one paragraph. What the run reads is almost free. What the run writes is what you pay for.
weightedTokens =
inputTokens x 1.00 // TOKEN_WEIGHTS.input
+ outputTokens x 5.00 // TOKEN_WEIGHTS.output
+ cacheReadTokens x 0.10 // TOKEN_WEIGHTS.cacheRead
+ cacheWrite5mTokens x 1.25 // TOKEN_WEIGHTS.cacheWrite5m
+ cacheWrite1hTokens x 2.00 // TOKEN_WEIGHTS.cacheWrite1h
credits = weightedTokens / 10000 // TOKENS_PER_CREDIT
// Illustrative: 40,000 in / 12,000 out / 200,000 cache read
// 40000 + 60000 + 20000 = 120,000 weighted -> 12.0 creditsThe part most pricing pages leave out: the model multiplier
The weights in the table are a baseline, not the final answer. The function that charges you, `calculateWeightedTokens` in worker/database/services/UsageService.ts, does not apply the published input and output weights directly at all. It recomputes them from the price of the model that actually ran the step, against the $3-per-million reference rate for input tokens.
The mechanics are worth stating precisely, because the two sides work differently. The input weight is the model's input price divided by $3.00. The output weight is the model's own output price divided by that same $3.00 input reference -- it is not the 5.0 baseline weight scaled down. The cache weights are the published 0.1, 1.25 and 2.0 multiplied by the input ratio, because caching is priced off the input side.
Work it through for Gemini 3.6 Flash, which the routing table in worker/agents/inferutils/config.ts assigns to code generation and to every phasic pipeline stage. Its cost entry in `MODEL_COSTS` is $1.50 per million input tokens and $7.50 per million output. Input weight: 1.50 / 3.00 = 0.5. Output weight: 7.50 / 3.00 = 2.5. Cache read: 0.1 x 0.5 = 0.05. For this model every weight happens to land at exactly half the baseline, because its output price is exactly five times its input price -- the same ratio the baseline encodes. On a model with a different internal ratio the two sides diverge: Grok 4.3 is $1.25 input and $2.50 output, giving an input weight of about 0.42 and an output weight of about 0.83, which is nowhere near a uniform halving.
Rerun the same hypothetical generation from the previous section on that multiplier. Input: 40,000 x 0.5 = 20,000. Output: 12,000 x 2.5 = 30,000. Cache read: 200,000 x 0.05 = 10,000. Total 60,000 weighted tokens, which is 6.0 credits -- exactly half the baseline figure.
This is a deliberately unglamorous design choice, and it cuts against us commercially. It would be simpler and more profitable to charge one flat weight regardless of which model ran, and pocket the difference whenever a cheap model handled the step. Charging the real ratio means routing a step to a cheaper model directly lowers what you are billed for it. It also means the credit cost of the same prompt can change when we change the routing table, in either direction.
| Weight | Baseline weight | As charged on Gemini 3.6 Flash |
|---|---|---|
| Input token | 1.0 | 0.5 |
| Output tokenOur Pick | 5.0 | 2.5 |
| Cache read | 0.1 | 0.05 |
| Cache write (5 min) | 1.25 | 0.625 |
| Cache write (1 hour) | 2.0 | 1.0 |
Derived from MODEL_COSTS in worker/config/billing.ts: gemini-3.6-flash is priced at $1.50 input / $7.50 output per million tokens against the $3.00 input reference rate. Input-side weights scale by 1.50/3.00 = 0.5; the output weight is computed separately as 7.50/3.00 = 2.5, which coincides with half the baseline only because this model prices output at exactly 5x its input. The cache-write rows show what the function would compute; no cache-write tokens are reported on this provider, so they do not currently arise in practice.
Why the first build costs more than every turn after it
The first generation of a project is the most expensive turn you will run on it, and the gap is structural rather than incidental. On turn one there is nothing to reuse: the model writes an entire application from a blueprint, and writing is the heavily weighted operation. On turn twelve the application already exists and the model writes a diff, with much of the context eligible to come back as a cache read at 0.1.
Fabricate builds in phases (worker/agents/execution/phasicStateMachine.ts): plan a deployable milestone, implement it, deploy it, validate it, repeat. Each phase pair is a planning call plus an implementation call, and the implementation call is where the output tokens are. The sizing comment on `ESTIMATED_PHASE_COST_CREDITS` in worker/config/billing.ts records what those phases were measured to cost against real end-to-end builds in the usage log: phase generation around 2.8 credits, phase implementation around 5.6, giving a phase pair of roughly 8.4 credits, rounded to 9 for budgeting purposes.
The comment on `MAX_CREDITS_PER_GENERATION` in the same file records the corresponding figure for a whole first build -- a measured full-stack build of blueprint plus project setup plus two phases, settling at about 16 credits. Those are measured figures from our own logs at the time the constants were tuned, not a guarantee, and your build will differ by however much code it needs to write.
A follow-up turn is a different shape entirely. It is usually one implementation pass over an existing codebase, with the project as cached context, producing a diff rather than a codebase. That is why the honest answer to "how many apps can I build on 350 credits" is a bad question and "how many turns of what size" is the good one.
Important
One consequence worth knowing before you hit it: a generation that consumes inference tokens but produces no file changes is still charged, because the tokens were genuinely spent. worker/agents/execution/billingManager.ts charges terminal credits on no-op runs deliberately. If a request is ambiguous enough that the model spends a full pass deciding it has nothing to do, that pass costs credits.
Ready to Build?
Start building your full-stack application with Fabricate. Free tier available — no credit card required.
Start Building FreeCaps, daily limits, and why credits do not roll over
Three separate limits govern spend, and they exist for three different failure modes.
The per-generation cap is the ceiling on what a single run can consume. It rises with the tier and is defined in one place, `MAX_CREDITS_PER_GENERATION` in `worker/config/billing.ts`; the current figures are published on the pricing page rather than restated here, because they get tuned. It exists so that one ambitious prompt cannot drain an entire month in a single run. When a run approaches its cap, the phase planner reconciles the remaining roadmap against the remaining budget and stops at a phase boundary rather than starting a phase it cannot finish, because a clean partial app you can continue from is worth more than a truncated file. The run tells you it has done this rather than stopping silently.
The free tier also carries a daily cap (`FREE_TIER_DAILY_CREDIT_CAP`), applied on top of the monthly allocation. Its job is to stop a single bad day from consuming the whole month before you have learned whether the tool suits you. The relationship between the two numbers matters more than either one: the daily cap is meant to sit above the per-generation cap. The code comment explains why, and it is worth quoting the reasoning because it came from getting it wrong -- when the daily cap and the per-generation cap were equal, one full-size build consumed the entire day, so a user whose first build failed was locked out until midnight UTC with nothing to show for it. At 45 against 25 you can run a full-cap build and still have credits left to fix what it got wrong.
Credits do not roll over. `maxRollover` is 0 on all three tiers, and the monthly refresh tops your balance up to the allocation rather than adding to it. This is the least popular design decision in the model and it deserves a straight justification rather than a shrug: capacity is provisioned monthly, and rollover converts a predictable monthly cost into an unbounded liability that can be redeemed all at once. Platforms that offer rollover generally price that risk into the base rate. We chose the lower rate. If you routinely finish a month with a large unused balance, the honest advice is to move down a tier rather than to bank the difference.
How the pricing models compare across the market
AI builders use five broadly different pricing shapes, and the shape tells you more about how your bill will behave than the headline number does. Rather than quote competitor prices that change monthly and go stale in a blog post, here is what each shape does to you as your project grows.
Flat subscription with soft limits gives you the most predictable bill and the least predictable service, because the provider has to protect its margin somewhere -- usually with throttling, queue priority, or a "fair use" clause that becomes real exactly when your project gets big enough to matter.
Per-message or per-request pricing is easy to understand and misaligned with reality, because a message that changes one line and a message that rewrites your app cost the provider wildly different amounts and cost you the same. Users learn to batch enormous requests into single messages, which is worse for output quality.
Raw token passthrough is the most honest and the least usable. You get a real cost signal, and you also get a bill you cannot forecast and a unit you cannot reason about without a calculator.
Weighted credits, the model described in this post, is an attempt at the middle: one unit you can count, weights that track real cost ratios, and a hard cap so the bill cannot surprise you. The cost is complexity. The fact that explaining it honestly takes an article this long is itself a real disadvantage compared to a flat fee.
| Pricing shape | What you are buying | What makes cost spike | Fails when |
|---|---|---|---|
| Flat subscription | Access, with soft usage limits | Nothing visible -- limits appear instead | You become a heavy user and hit undocumented throttling |
| Per message / per request | A fixed number of turns | Nothing -- a trivial fix costs the same as a rewrite | You batch huge requests to save messages and quality drops |
| Raw token passthrough | Model tokens at or near provider cost | Long context, long outputs, retries | You need to forecast a monthly budget in advance |
| Seat-based | Per-person access | Adding teammates, not adding usage | One person does all the building and the rest just review |
| Weighted credits (Fabricate)Our Pick | 10,000 weighted tokens per credit | Output volume -- large generated diffs | You want a bill you never have to think about |
Shapes, not prices. Competitor pricing changes frequently enough that any figure quoted here would be wrong within a quarter; check the vendor page for current numbers.
How to estimate your own monthly cost
Start from the per-credit rate, because it is the one number that makes tiers comparable. Pro is $25 for 350 credits, which is about $0.071 per credit. Scale is $50 for 700 credits, which is also about $0.071 per credit. They are the same rate. Scale is not a volume discount -- it is twice the monthly capacity and a higher per-generation ceiling (120 credits versus 60), which matters if your builds are large enough that a single run bumps the Pro cap.
Then estimate in turns rather than apps. Using the roughly 16-credit measured first build cited earlier as a rough anchor, 350 credits is on the order of twenty first builds if you spent every credit on first builds and never iterated -- which nobody does. A more realistic split is a handful of new projects plus a long tail of follow-up turns, and follow-up turns are much cheaper because most of their context is cache-read.
For the free tier, be clear-eyed: 60 credits per month against a roughly 16-credit measured first build is on the order of three or four full builds, or one build plus a real amount of iteration on it. The daily cap also means you cannot spend all of it in one sitting. That is enough to find out whether the output quality suits your project. It is not enough to run a business on, and we would rather say so here than have you discover it on day nine.
If you want a real number instead of an estimate, run one build on Free and read the credit charge on the completed generation. Charging is incremental during the run and settled at the end (worker/agents/execution/billingManager.ts), so the figure you see is what was actually consumed, not a projection. One measured build of your kind of app beats any average we could publish.
Tip
Three habits that lower burn: ask for one change at a time so the model writes a small diff instead of a large one; keep working in the same chat so the context stays stable enough for the provider to serve it from cache at the 0.1 weight; and describe the intended behaviour rather than pasting an entire file back for the model to reproduce.
Ready to Build?
Start building your full-stack application with Fabricate. Free tier available — no credit card required.
Start Building FreeWhere a credit model is worse than a flat fee
A credit model has genuine disadvantages, and pretending otherwise is how pricing pages lose trust.
It creates meter anxiety. Watching a balance tick down changes how people work, usually for the worse -- they batch requests, they hesitate to iterate, they accept a mediocre result rather than spend two more credits improving it. That is a real cost that does not appear on the invoice. A flat fee, whatever its other faults, does not do this.
It is harder to budget than a flat fee. We can tell you what a credit is with total precision and still not tell you what your app will cost, because that depends on how much code it needs. Anyone who gives you a confident per-app number is either averaging over projects unlike yours or guessing.
It shifts variance onto you. When a generation goes wrong and has to be retried, the tokens were genuinely spent and the credits are genuinely charged. We mitigate that where we can -- the pre-deploy safety gate in worker/agents/validators/preDeploySafetyGate.ts runs 28 static rules against generated code before deployment specifically to catch failures that would otherwise cost a wasted round trip -- but a gate is not a guarantee, and a bad run still costs you.
What a credit model does buy is proportionality. Small changes cost little, large generations cost more, and nobody subsidises anybody else. If your usage is light, you pay less than you would under a flat fee sized for heavy users. If your usage is heavy, you are not quietly throttled to protect someone else's margin. Whether that trade is worth the complexity depends on which kind of user you are, and that is a decision we would rather you make with the arithmetic in front of you.
Ready to Build?
Start building your full-stack application with Fabricate. Free tier available — no credit card required.
Start Building Free