1. The problem with stale scores
When a business applies for a corporate card or a working-capital line, most lenders ask for tax returns, audited statements, and a FICO or Dun & Bradstreet score. For a young company this data is useless. It describes who the company was, not who it is.
I saw this at Finally. A startup could hold $400,000 from a recent round, book $60,000 a month in recurring revenue, and still get denied because the corporate entity was 17 months old. Meanwhile a legacy business could show a profitable tax return from last year while burning down its cash this quarter.
So we ignored the bureau score. We underwrote on the ledger itself: bank accounts connected through Plaid and Teller, risk computed on raw cash movement. The number that mattered was the one that settled yesterday.
2. Reconstructing 90 days
Bank APIs do not hand you a clean history. Transactions post, pend, reverse, and adjust across time zones. End-of-day balances arrive with holes. Before any risk math, we had to rebuild the account’s true state, one day at a time.
We built an asynchronous reconstruction engine. It ingests every transaction, sorts out what actually cleared, and produces a daily balance series you can trust.

Transfers are not revenue
The first failure mode we caught was the round-trip. A business moves $50,000 from checking to a sweep account and back, four times in a month. Naive accounting calls that $200,000 in deposits. It is one pile of money that took four trips.
The pipeline matches paired transactions across linked accounts: same amount, mirrored direction, timestamps inside the 48-hour clearing window. Matched pairs get tagged as transfers and excluded from operating revenue. Getting this wrong corrupts everything downstream, so getting it right mattered more than any model tweak.
3. Volatility is the risk
An average daily balance of $100,000 can describe two very different companies. One sits between $90,000 and $110,000 all month. The other starts at $250,000 on the first, burns to $1,500 on day 28, and gets a capital injection on day 30. The average does not know the difference. The volatility does.
We measured it with standard deviation against a reserve floor:
Z_Burn = (Daily_Cash_Balance - Critical_Reserve_Floor) / Daily_Net_Burn_SigmaWhen volatility ran outside the confidence bounds, the sizing multiplier dropped from 30% of the average daily balance to 10%, or the account went to a human underwriter. The formula was allowed to say no. That was the point of it.
4. Lines that moved weekly
A credit line approved once and reviewed annually is a photograph. We wanted a video. Every Sunday night a Celery task re-synced every active borrower, rebuilt the trailing 90-day window, and recomputed the limit.
Revenue doubled? The limit grew with it. Burn accelerated and reserves fell more than 40% in two weeks? A circuit breaker fired: the customer got notified, automated increases paused, and the risk team got an alert. Nobody had to remember to check. The system checked.
5. What it came to
In roughly three months the engine underwrote over $3,000,000 in credit across more than 50 companies, with a 0% default rate through the initial rollout. Small sample, short window; I would not confuse it with proof that the model beats every bureau. But it showed that a company’s cash history, read carefully, says more about whether it will repay than its age or its paperwork. The data was there all along. Most of the work was refusing to look away from it.