Liquidity laddering: matching duration to demand
Your user money isn't one bucket. It's a curve.
By Solomon Ajayi · Free to read, no signup
You hold ₦100M of user wallet liabilities. On any given day, you'd be surprised by maybe ₦5M of withdrawals, most users leave their money parked. Holding ALL ₦100M in a 0% checking account at your sponsor bank is leaving money on the table. Holding ALL ₦100M in 6-month treasury bills is reckless, first hint of a withdrawal storm and you can't liquidate fast enough. The treasury answer is LADDERING: a tiered structure of overnight, 30-day, and 90-day buckets where each bucket's size is calibrated to expected withdrawal demand at that horizon. This lesson posts the initial laddering of ₦100M and shows the YIELD that laddering captures.
The user balances you hold are not one homogeneous pile of cash, they are a demand curve. On any given day only a small fraction will be withdrawn, most users leave their money parked for weeks or months. Parking all of it in a zero-yield account is leaving real money on the table; locking all of it into long-dated instruments is reckless because the first withdrawal storm finds you unable to liquidate. The answer is to match the duration of your assets to the shape of expected demand.
Laddering does that by splitting the balance across maturity rungs: an overnight bucket for daily demand, a 30-day rung, a 90-day rung, each sized to the withdrawals you expect at that horizon. The longer rungs pay more yield, which is your compensation for giving up immediate liquidity. The user wallet liability never moves through any of this; the ladder lives entirely on the asset side of your balance sheet, and reshuffling between rungs is an internal reclassification, not new money in or out.
The bookkeeping here is genuinely the easy half. Each maturity bucket is its own asset account, interest income is recognized when a rung matures, and rolling a matured rung back into a fresh one of the same tenor nets to zero on that account. The hard half is the sizing, which needs real withdrawal-velocity history and stress scenarios like a simulated bank run, because a ladder that holds too little overnight turns a routine demand spike into a forced fire-sale of term assets.
Worked example, step by step
Ladder ₦100M: 20% overnight, 30% 30-day, 50% 90-day
Treasury decision. Daily-demand bucket sized at 20% of liability = ₦20M (covers 4 days of typical ₦5M-per-day withdrawals plus a buffer). 30% in 30-day T-bills = ₦30M (you can roll if needed). 50% in 90-day T-bills = ₦50M (the yield juice). User wallet liability stays at ₦100M throughout, the ladder is on YOUR side of the balance sheet.
| Account | Debit | Credit |
|---|---|---|
| T-Bills 30-Day (8% APR) (1620) | ₦30,000,000.00 | |
| T-Bills 90-Day (10% APR) (1630) | ₦50,000,000.00 | |
| Bank Account (Overnight, 0%) (1610) | ₦80,000,000.00 |
Bank Account (Overnight) UP ₦20M (debit). T-Bills 30-Day UP ₦30M (debit). T-Bills 90-Day UP ₦50M (debit). These reclassify from the overall sponsor-bank position, you're MOVING ₦80M from overnight to term assets, picking up yield in exchange for liquidity. Reframed with the overnight bucket as the source: Overnight DOWN ₦80M (credit), 30-day UP ₦30M (debit), 90-day UP ₦50M (debit). That's the entry to post.
30 days later: roll the 30-day rung, recognise interest
₦30M matures, earning ₦200,000 in interest (30/365 × 8% × ₦30M = ₦197,260, rounded to ₦200,000 for clean math). You roll the principal into a new 30-day rung; the interest flows to income.
| Account | Debit | Credit |
|---|---|---|
| Bank Account (Overnight, 0%) (1610) | ₦200,000.00 | |
| Treasury Interest Income (4600) | ₦200,000.00 |
Bank Account (Overnight) UP ₦200,000 (debit, interest cash in). Treasury Interest Income UP ₦200,000 (credit). The ₦30M principal stays in the 30-day bucket via the roll, no entry needed for the rebuy if same account. (In production you'd debit/credit the same T-Bills 30-Day account because the old bond matures and the new one is bought; net zero on that account.)
Takeaway
Liquidity laddering is the single biggest revenue lever for a fintech holding user balances at scale. A 50/30/20 ladder typically captures 80-90% of the max-yield case while keeping daily-demand safety. The hard part is the SIZING, you need historical withdrawal-velocity data and stress-test scenarios (bank-run simulation). The easy part is the bookkeeping: each maturity bucket is its own asset account, interest income flows on maturity, ladder rolls are net-zero internal moves. Without a ladder, you give up the spread that funds your operations.
Practice this on a real ledger
Reading is half of it. Open this lesson in the lab to post the entries yourself against a real Postgres-backed double-entry ledger, with the validation on. Free, your sandbox is yours.