Clausius Sama
← Wiki
Control Systems

Money as a Control System

New to control systems, or need a refresher? Start with Control Systems: A Primer.

I'm a controls engineer, so when I sat down to decide how money should move between my paycheck, my savings and my businesses, I drew it as a plant and a controller. The model is small, but it settles questions that are hard to argue about in words: where a dollar does the most work, how big a cash buffer needs to be, and when it is safe to put more capital into a business.

The system has three stages:

Stage What it is Control behavior
Storage Long-term savings in a T-bill fund A slow integrator with a small positive pole
Buffer A checking account held at a fixed balance A setpoint regulator that absorbs spending disturbances
Business The holding company's ad-driven businesses A high-gain stage with positive feedback through advertising

Block diagram of the business and storage stages

Figure 1. The two stages as positive-feedback integrators, coupled by owner draws D. Feedback paths are in blue.

1. The storage stage: a slow, unstable pole you want

Let x(t)x(t) be the savings balance, rr the after-tax yield, and u(t)u(t) the net inflow (surplus from each paycheck, plus owner draws from the business, minus any capital I put back in):

dxdt=r x+u(t)\frac{dx}{dt} = r\,x + u(t)

Block diagram of the storage stage

Figure 2. Storage: an integrator with positive feedback r, which puts the pole at s = +r.

Taking the Laplace transform:

X(s)=x0s−r+U(s)s−r,G(s)=X(s)U(s)=1s−rX(s) = \frac{x_0}{s - r} + \frac{U(s)}{s - r}, \qquad G(s) = \frac{X(s)}{U(s)} = \frac{1}{s - r}

The pole sits at s=+rs = +r, in the right half-plane. In any other control problem that is the definition of unstable: the state grows without bound. For savings, that is exactly the behavior you want, and it is the cleanest way I know to state why compounding works.

For a constant net inflow SS, the solution is:

x(t)=(x0+Sr)ert−Srx(t) = \left(x_0 + \frac{S}{r}\right)e^{rt} - \frac{S}{r}

The useful thing is how slow this pole is. At about 3% after tax, the doubling time is ln⁡2/r≈23\ln 2 / r \approx 23 years. For the first decade the erte^{rt} term barely moves, and the balance is almost entirely the integral of uu. Early on, the lever is the input, not the yield. Chasing an extra quarter point of yield is noise next to raising SS.

2. The buffer stage: a regulator at a setpoint

The storage stage has dead time. Selling a fund and landing cash takes a few business days, which in the transfer function is a delay term e−sTe^{-sT}. Spending, on the other hand, happens instantly. Put a delayed source directly behind an instantaneous load and you get a supply gap every time spending spikes.

The fix is the same one you use on a production line: a buffer between the two. A checking account sits between spending and storage, held at a setpoint x∗x^*. At each paycheck kk, the controller tops it up by exactly what was used:

u[k]=x∗−x[k]u[k] = x^* - x[k]

With spending w[k]w[k] drawn down during the period, the buffer obeys:

x[k+1]=x[k]+u[k]−w[k]=x∗−w[k]x[k+1] = x[k] + u[k] - w[k] = x^* - w[k]

Block diagram of the buffer regulator

Figure 3. The buffer regulator. Spending enters as a disturbance, and the top-up controller returns the balance to x every paycheck.*

That is a deadbeat controller: any disturbance is fully corrected at the next sample, with no carried-over error and no oscillation. Sizing follows from the delay. The setpoint has to cover the largest spending surprise that can arrive before storage can respond:

x∗≥max⁡over Twx^* \geq \max_{\text{over } T} w

This is the same reasoning as buffer sizing in my manufacturing circuit model: a buffer exists to cover a rate mismatch for as long as the slower side takes to react.

Try the cash-buffer loop

The goal is to restore checking to its target on payday. Spending then lowers it again. Follow one period below; the chart keeps the history.

The lesson: refill what was spent, within what you can afford.

Start with a lesson

↩ Checking balance → target minus balance → top-up from paycheck

Settings apply to the next period. Results below describe the last completed period.

What happened this period · 0

Target before spending: $2,000
  1. 1. Starting balance
    $2,000
  2. 2. Payday top-up
    + $0
  3. 3. Spending
    − $0
  4. 4. Ending balance
    $2,000

Checking starts at the target. Advance one period to spend, then another to see the top-up replace what was spent.

Savings: $5,000

━━ Checking balance┄┄ Buffer target x*
02,0004,00006121824
Pay period · 0 / 24 · USD

Reading the chart: rises are payday top-ups; falls are spending. The blue line is the goal before spending, not a minimum balance.

Try a surprise expense with automatic top-ups, then with fixed transfers. Lower the paycheck below spending to see the controller hit its funding limit.

Each step: top up checking → send the unused paycheck to savings → subtract spending. The target is restored before spending, not after it. Transfers cannot exceed the paycheck; lowering the target does not withdraw excess cash.

Illustrative USD model · Starts with $2,000 in checking and $5,000 in savings · No interest, borrowing, or savings withdrawals · Unfunded spending is reported for that period, not carried as debt · Stops after 24 periods.

3. The business stage: positive feedback through ads

The holding company spends on advertising, and some of that spend comes back as revenue. That return path makes it a feedback loop. Per dollar of ad spend EE:

  • revenue is ROAS⋅E\text{ROAS} \cdot E
  • a fraction τ\tau of revenue is reserved for taxes
  • the spend itself costs (1−cb)E(1 - c_b)E, where cbc_b is the cashback the company's card returns

The net cash produced per ad dollar is the loop gain:

g=ROAS (1−τ)−(1−cb)g = \text{ROAS}\,(1 - \tau) - (1 - c_b)

The business stage grows when g>0g > 0 and drains when g<0g < 0. Setting g=0g = 0 gives the break-even:

ROAS∗=1−cb1−τ\text{ROAS}^* = \frac{1 - c_b}{1 - \tau}

With a 30% tax reserve and 2% cashback, ROAS∗=0.98/0.70=1.40\text{ROAS}^* = 0.98 / 0.70 = 1.40. That is the cash-flow break-even, because the reserve is taken on gross revenue. Taxes are really owed on profit, so the true-profit break-even is lower, at ROAS>0.98\text{ROAS} > 0.98. The reserve on gross acts as damping: it holds back cash the loop could otherwise reinvest. That's sensible while revenue is uncertain. Once there is steady revenue, reserving on profit instead speeds the loop up.

4. Stability: the delay is the dangerous part

The gain gg is not something you know. You measure it, and the measurement arrives late. Ad platforms attribute conversions days after the spend, and payouts land days after that. So the real control problem is the controller that adjusts spend based on measured returns.

Suppose spend is adjusted each period toward the level where returns stop paying. Near that operating point, returns fall as spend rises, roughly ROAS(E)≈ROAS0−a (E−E0)\text{ROAS}(E) \approx \text{ROAS}_0 - a\,(E - E_0). A controller that raises spend in proportion to how far measured ROAS sits above break-even, using a reading dd periods old, behaves like:

E[n+1]=E[n]−Ka (E[n−d]−Eeq)E[n+1] = E[n] - K a \,\big(E[n-d] - E_{\text{eq}}\big)

Block diagram of the ad spend control loop

Figure 4. The ad spend loop. The attribution delay z⁻ᵈ in the feedback path is what limits the gain.

With no delay (d=0d = 0), the characteristic root is z=1−Kaz = 1 - Ka, which is stable for 0<Ka<20 < Ka < 2. With one period of delay, the characteristic equation becomes z2−z+Ka=0z^2 - z + Ka = 0, and stability requires Ka<1Ka < 1. Every period of delay tightens the limit on how aggressively you can react. Push past it and spend overshoots: you scale up on last week's good numbers, the returns come in worse, you cut hard, and the cycle repeats. That is the money version of a loop ringing because the dead time was ignored.

That gives the operating rule I actually follow, which is ordinary commissioning practice:

  1. Identify the plant before closing the loop. Run ads at a fixed test budget, open loop, long enough to measure gg from real conversions.
  2. Close the loop with a low gain. Add capital only while measured g>0g > 0, in steps, waiting out the attribution delay between steps.
  3. Watch for saturation. When ROAS falls toward break-even as spend rises, the stage has saturated. More input stops producing more output.
  4. Rate-limit the actuator. Capital comes from paycheck surplus, never from debt or retirement money. That caps how fast the input can change and keeps a bad estimate from becoming a large loss.

5. Coupling the stages

The stages are in series. The business is the high-gain stage, and storage is the slow, durable one. Owner draws DD move money from the first to the second. The coupling rule follows from where each dollar does the most work:

  • While the business stage has g>0g > 0 and isn't saturated, keep DD low and let it reinvest. A dollar there earns gg per cycle, against rr per year in storage.
  • Once it saturates, raise DD. Extra money in a saturated stage earns nothing, and storage at least compounds.

It is the same logic as staging amplifiers: put the gain early, and don't feed a stage that has already clipped.

What the model leaves out

  • Variance. gg is an average. A loop with a positive mean gain and a wide spread can still drain a small balance before the average shows up.
  • Model error. The linearization around the operating point only holds nearby. That is one more reason to change spend in small steps.
  • Taxes. The flat reserve is a simplification. The real rules are piecewise.

Even so, the model has earned its place. It turns "should I put more money into the business?" into a measurement question: what is gg, how sure am I of it, and how long is the delay before I'll know if I'm wrong?

Related: Agent Autonomy as Loop Gain, which applies the same reasoning to how much an AI agent is allowed to do on its own.