Available Balance Must Exclude Reservations

Available balance must exclude reservations

The balance a user owns and the balance they can spend right now are not always the same number.

Once the system supports reservations, "total balance" stops being the number that should drive gating, UI copy, or concurrency checks. The spendable number is available balance:

available = total - reserved

Sounds obvious. It often is not how products behave.

The rule

If reserved work exists, surface at least these three numbers somewhere in the system:

And when the system asks "can this user start another job?", use available, not total.

Anything else teaches the user a lie.

Why this matters

If the UI says "you have 20 credits" while another job has already locked 16 of them, the user does not really have 20 credits. They have 4 credits and a pending promise.

When products hide that distinction, users experience three bad surprises:

That is not a finance problem. It is a product-language problem.

The design consequence

Reservations are not just backend bookkeeping. They are a user-facing state.

That usually means:

The last part matters more than it sounds. If top-ups and subscription credits are mixed into one bucket, resets and refunds get weird fast.

Easydeck example

Easydeck now has the right shape:

That turns a fuzzy "why can't I generate another deck?" experience into a concrete one: the credits are already spoken for.

Where this generalizes

The principle is always the same: do not present committed capacity as free capacity.

See also