The chart of accounts is the foundation of the CEF Core general ledger. Every journal entry, subledger posting, and financial report maps back to accounts defined here.
CEF Core organizes the chart of accounts into five standard account types. Each type occupies a dedicated GL code range and carries a defined normal balance that determines how debits and credits affect the account.
| Account Type | GL Code Range | Normal Balance | Debit Effect |
|---|---|---|---|
| ASSET | 1000 - 1999 | DEBIT | Increases balance |
| LIABILITY | 2000 - 2999 | CREDIT | Decreases balance |
| EQUITY | 3000 - 3999 | CREDIT | Decreases balance |
| REVENUE | 4000 - 4999 | CREDIT | Decreases balance |
| EXPENSE | 6000 - 6999 | DEBIT | Increases balance |
Key Principle: Assets and expenses have debit normal balances. Liabilities, equity, and revenue have credit normal balances. A debit to an asset increases it; a debit to a liability decreases it. This follows standard double-entry bookkeeping rules enforced by the GL engine.
These are the primary accounts used across the CEF Core subledgers. Each subledger posts to specific GL codes automatically when transactions are recorded.
Primary operating bank account. Updated by the Cash subledger when receipts and disbursements are recorded. Reconciled daily via the tie-out job against the cash.cash_account table.
Total outstanding principal balance of all active loans. Debited when a loan is disbursed, credited when principal payments are received. Tied out daily against the sum of loans.loan balances.
Interest earned on loans but not yet received in cash. Debited when interest accrues, credited when the borrower pays. Accrual runs every 15 minutes via the tenantAccrualCheck scheduled job.
Contra-asset account representing estimated uncollectible loan balances. Credited to increase the reserve, debited when a loan is charged off. Reported as a negative on the balance sheet.
Total principal owed to investors who hold notes with the fund. Credited when a new note is issued, debited when a note is redeemed. Tied out daily against the sum of investor_notes.note balances.
Interest owed to investors on their notes but not yet paid out. Credited when interest accrues on notes, debited when interest payments are disbursed.
Accumulated net income from all prior periods. Updated during year-end close when revenue and expense accounts are zeroed out.
Revenue from interest charged on outstanding loans. Credited when loan interest accrues or when interest payments are received. This is the fund's primary revenue source.
Cost of interest paid or accrued to investors on their notes. Debited when note interest accrues. The spread between 4000 and 6000 is the fund's net interest margin.
Accounts can be organized into a parent-child hierarchy for reporting purposes. Parent accounts aggregate the balances of their children on financial statements.
Example Hierarchy:
1000 - Total Assets (parent)
1010 - Operating Checking
1020 - Money Market Account
1200 - Loans Receivable
1210 - Church Building Loans
1220 - Parsonage Loans
1230 - Construction Loans
1300 - Accrued Interest Receivable
1400 - Allowance for Loan Losses
Parent accounts cannot receive direct journal entry postings. Only leaf-level (child) accounts accept debits and credits. The parent account balance is always the sum of its children.
Important: Do not post journal entries to parent accounts. The system will reject the entry with a validation error. Always post to the most specific child account.
To manage the chart of accounts, navigate to Accounting → Chart of Accounts in the sidebar. You must have ADMIN or TREASURY role.
Accounts with a zero balance can be deactivated to hide them from daily use while preserving historical data. Deactivated accounts no longer appear in the GL code dropdown when creating journal entries but remain visible in historical reports.
Filter the chart of accounts view using the ?active=true or ?active=false query parameter to see only active or inactive accounts.
Important: You cannot deactivate an account that has a non-zero balance. Pay down or transfer the balance first, then deactivate. Accounts cannot be deleted -- only deactivated via soft delete.
Each subledger in CEF Core automatically generates journal entries when transactions are recorded. The following table shows which GL accounts are affected by common subledger operations.
| Subledger | Transaction | Debit | Credit |
|---|---|---|---|
| Loans | Loan disbursement | 1200 Loans Receivable | 1010 Operating Checking |
| Loans | Loan payment (principal) | 1010 Operating Checking | 1200 Loans Receivable |
| Loans | Interest accrual | 1300 Accrued Interest Recv. | 4000 Interest Income |
| Investor Notes | Note issued | 1010 Operating Checking | 2000 Notes Payable |
| Investor Notes | Note interest accrual | 6000 Interest Expense | 2100 Accrued Interest Pay. |
| Cash | Cash receipt | 1010 Operating Checking | Varies by source |
| Fees | Origination fee charged | 1300 or receivable | 4xxx Fee Income |
Pro Tip: You do not need to create manual journal entries for subledger transactions. The Loans, Investor Notes, Cash, and Fees subledgers automatically post balanced journal entries to the GL when you record transactions through their interfaces.
The chart of accounts is managed through the GL API. All requests require JWT authentication.
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v1/gl/chart-of-accounts | List all accounts (add ?active=true to filter) |
POST | /api/v1/gl/chart-of-accounts | Create a new GL account |
PATCH | /api/v1/gl/chart-of-accounts/:id | Update account name, parent, or active status |
With your chart of accounts configured, learn how to record journal entries that post debits and credits to these accounts.
Journal Entries Guide