Monitor real-time cash balances across all accounts, track available funds versus projected disbursements, and receive alerts when balances fall below configured thresholds.
The daily cash position dashboard provides a real-time snapshot of the fund's total liquidity. The position is calculated from the cash.account table, which maintains running balances updated with every posted transaction.
The dashboard displays four primary metrics:
Sum of current_balance across all cash accounts. Represents the total book cash position.
Sum of available_balance across all accounts. Excludes holds, pending transactions, and restricted reserves.
Count of all cash accounts in the system, including inactive accounts for historical reference.
Count of accounts with status = ACTIVE. Only active accounts are included in operational cash position calculations.
Retrieve the current cash position via the position endpoint:
GET /api/v1/cash/position
Response:
{
"totalBalance": 2705000.00,
"totalAvailable": 2580000.00,
"totalAccounts": 4,
"activeAccounts": 3
}This endpoint aggregates balances across all accounts in a single query. Access is logged to the immutable audit trail as a READ event on the CASH_POSITION entity, since this is sensitive financial data.
For a breakdown by individual account, use the accounts list endpoint:
GET /api/v1/cash/accounts
Response:
{
"accounts": [
{
"account_id": "uuid-1",
"account_number": "****4521",
"account_name": "Operating Checking",
"bank_name": "First National Bank",
"account_type": "CHECKING",
"status": "ACTIVE",
"current_balance": "1850000.00",
"available_balance": "1780000.00",
"created_at": "2025-01-15T00:00:00Z"
},
{
"account_id": "uuid-2",
"account_number": "****7890",
"account_name": "Money Market Reserve",
"bank_name": "First National Bank",
"account_type": "MONEY_MARKET",
"status": "ACTIVE",
"current_balance": "650000.00",
"available_balance": "650000.00",
"created_at": "2025-01-15T00:00:00Z"
},
{
"account_id": "uuid-3",
"account_number": "****3456",
"account_name": "Reserve Fund",
"bank_name": "Federal Home Loan Bank",
"account_type": "SAVINGS",
"status": "ACTIVE",
"current_balance": "205000.00",
"available_balance": "150000.00",
"created_at": "2025-03-01T00:00:00Z"
}
],
"count": 3
}Each cash account maps to a specific General Ledger account code. The account type determines the GL mapping and the operational role of the account:
| Account Name | Type | GL Code | Purpose |
|---|---|---|---|
| Operating Checking | CHECKING | 1010 | Primary operating account for loan payments received, disbursements issued, and daily operations |
| Money Market | MONEY_MARKET | 1020 | Higher-yield account for excess cash and short-term reserves. Earns interest income. |
| Reserve Fund | SAVINGS | 1030 | Restricted reserve for regulatory requirements and risk mitigation. Withdrawals require approval. |
Balance vs. Available: The current_balance reflects all posted transactions. The available_balance subtracts pending holds, uncleared deposits, and restricted amounts. Treasury decisions should be based on available balance, not current balance.
CEF Core's monitoring module (/api/v1/monitoring) can be configured to alert treasury staff when cash balances fall below defined thresholds:
| Alert Level | Condition | Action |
|---|---|---|
| WARNING | Available balance falls below the configured warning threshold | Email notification to treasury staff |
| CRITICAL | Available balance falls below the configured critical threshold | Immediate notification to treasury manager and fund administrator |
| EMERGENCY | Available balance insufficient to cover next 7 days of projected disbursements | Escalation to executive leadership with recommended actions |
The cash position dashboard factors in known upcoming obligations to help treasury staff plan ahead:
Treasury staff should perform a daily cash position review as part of the morning operational routine:
GET /api/v1/cash/position or the web dashboard at /cash/.importBankActivity job runs at 2:05 AM UTC. Check for any bank-initiated transactions (fees, returned items, interest credits) that need to be recorded.TRANSFER transaction type.The cash position is derived from several data sources that are updated throughout the day:
| Data Source | Update Frequency | Impact |
|---|---|---|
| Manual cash transactions | Real-time (on POST) | Immediate balance update in cash.account |
| Auto-created transactions (loan payments, notes) | Real-time (on source event) | Immediate balance update when parent transaction posts |
| Plaid bank feed sync | Hourly | New bank transactions imported for matching |
| Interest accrual | Every 15 minutes | Accrued interest entries created by scheduled job |
| Approved disbursement execution | Every 15 minutes | Maker-checker approved items are executed and balances updated |
Solution: Verify the cash.account table has active accounts with the correct tenant context. Check that the Plaid bank feed sync job is running (review the /api/v1/monitoring endpoint). If balances are not updating, confirm that new transactions are being posted with the correct account_id.
Solution: This indicates pending holds or uncleared items. Review recent deposits to check for holds placed by the bank. Also check if the Reserve Fund account has restricted amounts reducing available balance. This difference is expected and normal for accounts with recent large deposits.
Solution: Run a bank reconciliation for the affected account. The difference is typically caused by outstanding checks, deposits in transit, or bank fees not yet recorded. See the Bank Reconciliation guide for the full process.
The daily cash position is the starting point for treasury management. These related guides cover the supporting workflows.