Tie-out is the process of reconciling GL control accounts to their corresponding subledger totals. It is the primary integrity check that ensures the general ledger accurately reflects the state of each subledger. CEF Core automates this daily and provides tools for investigating and resolving breaks.
The tie-out job compares the balance in each GL control account to the sum of all individual records in the corresponding subledger. If the two numbers do not match within the defined tolerance, a break is recorded for investigation.
1. Query GL account balance for control account (e.g., 1200)
2. Query SUM of all active subledger balances (e.g., loans.loan.current_balance)
3. Calculate difference = GL balance - subledger total
4. If ABS(difference) > $0.01 → record break in ops.break_report
5. If ABS(difference) ≤ $0.01 → record pass (no action needed)
This process repeats for each control account pair. The entire job typically completes in under 30 seconds.
The tie-out job reconciles the following GL control accounts against their subledger sources. Each reconciliation has a tolerance of +/- $0.01 to account for rounding.
GL balance should equal the sum of current_balance across all active loans in the loans.loan table.
GL balance should equal the sum of principal balances across all active investor notes in the investor_notes.note table.
GL balance should equal the cash subledger balance in the cash.cash_account table for the operating account.
Escrow GL accounts are reconciled against the sum of escrow balances in the escrow schema. This ensures funds held in escrow match the recorded liability.
The tie-out job runs automatically as a scheduled cron job managed by the node-cron scheduler in functions/src/scheduler.ts.
| Property | Value |
|---|---|
| Job Name | tieOut |
| Schedule | Daily at 2:10 AM UTC |
| Tolerance | +/- $0.01 |
| Results Stored | ops.break_report table |
| Alert Trigger | Any break exceeding tolerance generates an alert to ADMIN users |
Timing Note: The tie-out runs at 2:10 AM UTC, which is after the daily accrual processing and bank import jobs (2:05 AM). This sequence ensures accruals and bank data are current before reconciliation begins.
When the tie-out detects a discrepancy that exceeds the tolerance, it records a break in the ops.break_report table. Each break record includes:
| Field | Description |
|---|---|
id | UUID primary key |
gl_account | The GL control account code (e.g., 1200, 2000, 1010) |
gl_balance | The balance from the GL at the time of the tie-out |
subledger_total | The sum from the subledger at the time of the tie-out |
difference | GL balance minus subledger total |
status | OPEN, INVESTIGATING, or RESOLVED |
created_at | Timestamp when the break was detected |
View break reports in the admin dashboard under Admin → Monitoring → Tie-Out Results. Open breaks are highlighted and sorted to the top.
When a break is detected, follow this investigation procedure to identify and correct the root cause.
ops.journal_entry_outbox for any pending events that have not been processed. A stuck outbox entry could cause a subledger transaction to be recorded without its corresponding GL posting.Important: Never adjust the subledger balance directly to match the GL. The subledger is the source of truth for individual transactions. Always correct the GL to match the subledger, or identify and re-process the missing subledger transaction.
Symptom: One control account is over, another is under by the same amount. Fix: Post a reclassifying entry to move the amount to the correct account.
Symptom: Small break that resolves on the next tie-out run. Cause: A subledger transaction was recorded just before or after the tie-out snapshot. Fix: Usually self-resolving; monitor the next day.
Symptom: Subledger total increased but GL balance did not. Cause: A transaction was committed in the subledger but the GL journal entry insert failed. Fix: Check the outbox for stuck events, re-process, or post a correcting manual entry.
Symptom: Break of exactly $0.01 or $0.02 that persists across multiple days. Cause: Cumulative rounding differences from daily interest accruals on many accounts. Fix: Post a small rounding adjustment entry at month-end.
In addition to the daily automated run, you can trigger a tie-out manually from the admin dashboard. This is useful when you need to verify the GL immediately after posting correcting entries or before closing a period.
Pro Tip: Run a manual tie-out immediately after posting correcting entries for a break. This confirms the correction resolved the discrepancy before you mark the break report as RESOLVED. It also serves as documentation that the correcting entry had the intended effect.
Tie-out is one step in the month-end close process. Learn about cash management and bank reconciliation to complete the picture.
Cash Receipts Guide