Vercel round 2: the cuts that are left

Measured 2026-10-11, and re-measured 2026-10-14 against the real bill for the first two full days after all three fixes. Seven levers measured; five are worth exactly nothing.

Read-only. Every figure names the thing it was read from. Anything that could not be read is said to be unread rather than estimated.

The three fixes cut the bill by 76%, and the real figure is now in: $9.04 a day. That is read off Vercel's own bill for the first two full days after all three landed — not projected, not calibrated.

Before them, a working day cost $37.03. Now it is $9.04. The target is $6.67/day ($200 a cycle). So the bill went from nearly six times the target to about a third over it.

The gap left ($71 a cycle), and why every lever is now closed

The gap left is $71 a cycle, or $2.37 a day — and $166 to $292 a cycle if the 30-minute production-deploy window goes back to 5 minutes, which is an open question on somebody else's desk. Of the three fixes, one did almost all the work: it stopped a second copy of the site being built on every green main, and that line is now exactly zero — worth $15–22 a day. One saved nothing at all, as we already retracted: Vercel never charges for a build it cancels, and the post-fix bill confirms it. The third, deploying production in 30-minute batches, is worth $3.18–7.35 a day — but do not bank that one: it is the only saving here paid for in deploy latency, it exists as a live setting our own code contradicts, and whether it stays is somebody else's open question.

Of nine things checked, every single one is now closed — already done, impossible, never running, not actually billed, or not ours to change. In two cases changing it would have made things worse: one would have cost us more than it saves, and the other would have made every deploy slower.

The honest answer to "can we reach $200 a cycle" is the same as it was, and the measurement now confirms it rather than replacing it: no — not without slowing shipping down, which we were told not to do. Closing the last $71 means building production about 30% less often. After these fixes production deploys are 100% of what we pay to build — no preview building, no cancelled-build noise — so there is no fat left to take instead. The one thing on this page that was wrong is the claim that every avenue is measured: how often we build production is not, and it belongs to the build-volume work rather than to this page.

What changed about how we measure — two corrections to the method, and both make earlier numbers wrong

First: Vercel charges for how long the whole build machine is alive, rounded up to the next whole minute — not the time until the site is ready, which is what every earlier figure used. The consequence is not academic: a saving of less than a whole minute can buy nothing at all. Tested by removing a 21-second step from 35 real deploys — 13 saved a full minute, 22 saved zero.

Second, and it retracts a saving we announced: a cancelled build is never charged for. A project with no cancelled builds matches its invoice exactly on 7 days out of 7. On our own worst day, the non-cancelled builds alone match the invoice to the unit, while counting the cancelled ones overshoots it by 180–200%. It is not a "too short to bill" rule either — one of those cancelled builds ran 17 minutes.

So the fix that stopped thousands of start-then-kill builds saved roughly nothing, and "cancelled builds are 40% of our spend" was a calculation, never a bill.

It also changes what we are trying to cut: at the time, the real production deploy was about 41% of what we paid to build — twice the share we thought. After the three fixes it is 100%, because the other 59% was the preview copy that one of the fixes removed.

The target is therefore not a dollar figure. It is a threshold: get a build's machine time under 300 seconds, against 330 today. We need about 30 seconds of cuts, combined, and nothing smaller is worth shipping alone.

The seven levers, one line each
LeverWorthVerdict
Stop the deploy re-checking types that GitHub already blocks on$0.00Already done, 184 days ago. Shipping it would have been a change that looks like a saving and saves nothing.
Reuse the compiler's saved work instead of recompiling every time$0.00Impossible. The two halves together are 3.16 GB against a 1.5 GB limit — 211% of it. The compiler's share would have to be 77% smaller to fit. Attempting it would have thrown away the half that currently turns a 98-second package download into 3 seconds.
Shrink the 41 seconds spent saving and uploading the cacheworse than nothingIt already pays for itself. It costs 41 seconds and saves 95 seconds of downloading — a net gain of 54 seconds on every deploy. Shrinking it would cost us money. This was the last idea on the list.
Stop paying twice to ship the same change$0.00We never were. 109 deploys shipped 109 different changes. The real double-charge was already removed by the first fix.
Stop uploading debug files to the error tracker on every deploy$0.00It has never run. Which also means our crash reports are harder to read than anyone realised — see the open questions.
Use a smaller, cheaper build machine$0.00Every size costs the same per unit of work. A smaller one is purely slower.
Shrink what gets sent to Vercel's servers after the build (98 seconds)$2.91 in theoryBilled, but nothing safely removable found. Six different ways of asking what is in that upload all came back empty, and the file that controls it has previously wedged every deploy when it was wrong. Not changed.
Stop starting-and-killing builds nobody wanted$0.00Retracted, and the retraction is now confirmed by the bill. Shipped 2026-10-11 as a ~$11.73/day saving. Cancelled builds are not billed, so it removed work that was never charged for: the cancelled builds went from 1,000–1,508 a day to 1 and then 0, and the bill did not move for it.
Two unexplained silent gaps in every build (21s and 11s)21s closedThe 21-second one is Vercel's own code and cannot be changed — and it was 21 seconds, not the 27 we had been quoting. The 11-second one is still being named.
The gap, stated as a number
a daya cycle
a working day before the fixes (average of 5)$37.03—
Monday 2026-10-12, after all three$9.48—
Tuesday 2026-10-13, after all three$8.59—
after all three fixes$9.04$271
the budget$6.67$200
gap$2.37$71
gap if the 30-minute deploy window is reverted$5.55–9.72$166–292

Every number in that table is now read off Vercel's own bill, two ways that agree to the unit: the billed-CPU field summed per project, and Vercel's billing export for the whole account. Earlier versions of this table were priced from how long each deploy took and then calibrated against the bill, and those calibrations were absorbing the cancelled-build error. They are superseded. Four different daily figures had got into circulation — $26.29, $18.21, $14 and $19.67. The measured one is $9.04; the others should not be quoted again.

A cycle is a calendar month, billed on the 14th — read off ten real invoices. This one was 30 days, which makes the daily budget $6.67; the one now running is 31 days, which makes it $6.45 and the gap $80 instead of $71. The $271 is the measured daily figure carried across a cycle, not a cycle that has been billed yet.

One avenue is still open, and it is not on this page. Everything here is closed, but how often we build production is not — it belongs to the build-volume work, and it is the only thing left that can move the number. Closing the last $2.37 a day means production building about 30% less often: everything that is not building now costs $1.25 a day and nothing on the list touches it, so the build itself would have to come down from $7.79 a day to $5.42 — a cut worked out in dollars, because Vercel prices build minutes on a tier scale and the rate we are actually billed ($0.003307 a minute over these two days) is not the list $0.0035. Deploying less often is the thing we were told not to do, so this is a founder's trade, not an engineering one.

Full working, with the controls and the day-by-day numbers: the bill, re-derived.

Did anything we shipped slow production shipping down? No — and here is the honest form of that answer

When this was first written, six deploys since the fixes was not enough to tell a 1–2% change from noise, and we did not claim otherwise. The median deploy read 290 seconds after, against 276 and 287 on the two full days before. Two full days are now in, and the per-deploy cost has not moved: $0.183 a production deploy on the Monday and $0.196 on the Tuesday, against $0.172 on the Saturday before. Production still ships whenever a change is merged; what changed is that nothing else is being built alongside it.

So the claim rests on what was shipped rather than on those medians: nothing merged in this round touches the production build at all. Three levers shipped write-ups only; the other four shipped nothing. And both of the two changes that could have made a deploy slower — the smaller machine, and keeping the compiler cache — were measured and deliberately not made.

That day-to-day comparison has now been taken, on 2026-10-14, and it is the figure above.

The five levers that are worth nothing, and why not shipping them was right

The type check was already switched off on Vercel 184 days ago; a real build log says so in as many words. GitHub's check is still required, so nothing slipped through.

The compiler cache is the one that mattered. The hope was that there was room to keep it, since the saved files now measure 1.01 GB against a 1.5 GB limit. The compiler's share alone is 2.15 GB. It does not fit, and if the total ever goes over the limit Vercel throws away all of it — including the part that currently turns a 98-second package download into 3 seconds. This is the one change on the list that could have left us worse off than before we started.

Duplicate deploys do not exist: 109 production deploys shipped 109 different changes, never going backwards. One change had two attempts, but the first failed in three seconds before any building began.

The debug-file upload could never have worked: the credential it needs has never existed on the project, and the error tracker's own list of uploaded files is empty.

The build machine closes on one measured fact: the price per unit of work is identical on every size of machine, to six decimal places, on our own bill. So halving the cores only saves money if the build does not take twice as long — and it would have added up to 2.8 minutes to every deploy.

Two things that are not savings and need a decision

Our production crash reports are unreadable today. The debug-file upload has never run, so the ability to read a production error properly is something we assumed we had and do not. Switching it on would add 30–90 seconds to every production deploy — the one thing we were told not to do. That is a trade between debuggability and deploy speed, and it is a founder's call.

The deploy depends on one Vercel setting that is invisible from our code. If someone deletes it, the type check silently comes back, every deploy gets slower and dearer, and no change in our code would show why. Raised as a decision, with the ordering that matters: our code must set it first, and only then can the Vercel copy be removed. The reverse order causes exactly the problem.

Everything else on the account — about $1.25 a day, not worth touching

Everything on the account that is not building the main site now comes to $1.25 a day, read off the bill for both post-fix days ($1.2489 and $1.2430 — steady to half a cent). That covers every page a person loads, all 45 scheduled background jobs, and the other 19 projects, of which two built anything at all (52¢ and 66¢ a day between them). For the month just billed it was $51.09 against $579.64 of building.

It is half the remaining gap, and there is nothing in it to cut: deleting every scheduled job would recover about a sixth of the target and would risk missing real work.

That sweep was checked for blindness: it did find the one other project that builds, so the zero for the other 18 is a real zero rather than a broken search.

What we could not read, and did not guess
  • A full day of billing since the fixes. Now read — two of them, 2026-10-12 and 2026-10-13, off Vercel's own bill. That is where every figure on this page now comes from.
  • How many production deploys we really do a day. Now measured: 44 on the Monday and 37 on the Tuesday, against 63 on 2026-10-10 and 84 on 2026-10-09. The earlier "96 if scaled up" was an extrapolation and is superseded.
  • The spend limit itself. No Vercel interface we can reach reports the configured $200 — it is derived from Vercel's own email arithmetic (300% of $600.08) and is waiting on somebody to read it off the billing settings page. It does not change any figure above.
  • The cost of each individual scheduled job. Vercel's usage pages refused our access token on five different attempts. The whole-category ceiling above answers the question that was actually asked.
  • Peak memory during a build. Not published by Vercel, so the memory risk of a smaller machine is named rather than measured.
  • Whether the build genuinely goes faster with more cores. Settling it would mean running the same change on two machine sizes, which means changing the setting. Deliberately not done.
  • The contents of the second 11-second silent gap — being measured now.

Measured 2026-10-11 and re-measured 2026-10-14 from the Vercel deployments, projects, invoices and billing interfaces, and from the propflowai repo. Read-only throughout — nothing was changed. The re-measurement, with its controls: the bill, re-derived. Working board: vercel-more-cuts. Round 1: vercel-build-waste. The pre-fix projection this page replaces: what is left to save.

PropFlow Docs