Process outgoing payments for loan fundings, investor note redemptions, interest payments, escrow disbursements, and operating expenses with maker-checker controls and automatic GL posting.
CEF Core categorizes disbursements by purpose. Each type follows a specific GL posting pattern and may trigger approval workflows based on amount thresholds:
| Disbursement Type | transaction_type | GL Entry |
|---|---|---|
| Loan Disbursement | WITHDRAWAL | DR Loans Receivable / CR Cash (1010) |
| Note Redemption | WITHDRAWAL | DR Investor Notes Payable / CR Cash (1010) |
| Interest Payment | WITHDRAWAL | DR Interest Expense / CR Cash (1010) |
| Escrow Payment | WITHDRAWAL | DR Escrow Payable / CR Cash (1010) |
| Operating Expense | WITHDRAWAL | DR Operating Expense / CR Cash (1010) |
| Inter-Account Transfer | TRANSFER | DR Cash (target) / CR Cash (source) |
Post a disbursement via POST /api/v1/cash/transactions. The amount is always a positive number -- the system determines the direction from the transaction_type field. Requires the ADMIN, TREASURY, or SYSTEM_ADMIN role.
POST /api/v1/cash/transactions
Content-Type: application/json
x-idempotency-key: disb-loan-2026-03-15-001
{
"account_id": "uuid-of-operating-checking",
"transaction_date": "2026-03-15",
"transaction_type": "WITHDRAWAL",
"amount": 250000.00,
"description": "Loan funding - First Baptist Church building project",
"reference_number": "WIRE-8834"
}Idempotency Required: Every disbursement POST must include an x-idempotency-key header. This is enforced by the idempotency middleware to prevent duplicate payments. Resubmitting the same key returns the original response without processing a second disbursement.
Large disbursements are subject to the maker-checker approval workflow, which enforces the four-eyes principle for financial transactions:
| Role | Auto-Approved Limit | Requires Approval Above |
|---|---|---|
| STAFF | Role-based daily limit | All disbursements require approval |
| TREASURY | Per-transaction limit | Above configured threshold |
| ADMIN | Higher per-transaction limit | Above configured threshold |
| SYSTEM_ADMIN | Highest limit | Above configured threshold |
When a disbursement exceeds the auto-approval threshold, it enters the approval queue managed by the Approvals module (/api/v1/approvals). The scheduled executeApprovedRequests job processes approved disbursements every 15 minutes, and sendApprovalNotifications alerts approvers of pending items every 30 minutes.
Transaction limits are enforced by the Limits module (/api/v1/limits), which tracks per-user daily totals. The dailyLimitReset job resets counters at midnight UTC.
Disbursements can be issued via three payment methods, selected based on urgency, amount, and recipient preference:
reference_number field for reconciliation matching. Outstanding checks appear on the bank reconciliation until cleared.reference_number. Wire transfers typically require maker-checker approval regardless of amount.Escrow accounts are managed by a separate Escrow module at /api/v1/escrow. When an escrow payment is due (property taxes, insurance premiums, or maintenance reserves), the escrow service creates the disbursement in the cash module automatically:
Every disbursement generates a double-entry journal entry. The credit always goes to the source cash account:
| Cash Account | GL Code | Typical Disbursements |
|---|---|---|
| Operating Checking | 1010 | Loan fundings, operating expenses, escrow payments |
| Money Market | 1020 | Note redemptions, reserve transfers |
| Reserve Fund | 1030 | Restricted reserve withdrawals (rare, requires approval) |
The GL journal entry ID is linked to the cash transaction via the gl_je_id column, enabling full traceability from the disbursement back to the general ledger.
GET /api/v1/cash/position before processing large disbursements to ensure sufficient funds.Disbursements interact with approval workflows, transaction limits, and escrow management.