Skip to content
← All writing & deep dives
Fintech & Risk Modeling··9 min read

Cash-Based Underwriting: Reconstructing 90-Day Bank Data to Deploy $3M+ in Credit

Why traditional credit bureaus fail young companies, how we modeled daily cash volatility, and the engineering behind underwriting millions in corporate credit.

Ashwin RachhaAI Product Engineer / Tech Lead · Finally

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.

System ArchitectureCash-Based Algorithmic Underwriting & Credit Limit Pipeline
Cash-Based Algorithmic Underwriting & Credit Limit Pipeline
Click to expand & zoom
Diagram Details: End-to-end credit risk architecture: Card applicant submits via apply.finally.com (POST /calculate-credit-limit); Apply Backend enqueues calculation tasks via Redis and Celery. The Algorithmic Underwriting engine processes 90-day balances, computes standard deviation and 7-day Z-scores to assign credit lines (10% to 25% of balance), coordinates with Risk/Underwriting review, and syncs approved credit limits to Cards Backend, Marqeta, and Visa.

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_Sigma

When 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.