Tie-Out Procedures

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.

What the Tie-Out Job Does

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.

Conceptual Flow

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.

Accounts Reconciled

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.

1200 - Loans Receivable

ASSET

GL balance should equal the sum of current_balance across all active loans in the loans.loan table.

GL 1200 balance = SUM(loans.loan.current_balance WHERE status IN ('ACTIVE', 'DELINQUENT'))

2000 - Investor Notes Payable

LIABILITY

GL balance should equal the sum of principal balances across all active investor notes in the investor_notes.note table.

GL 2000 balance = SUM(investor_notes.note.principal WHERE status = 'ACTIVE')

1010 - Operating Checking

ASSET

GL balance should equal the cash subledger balance in the cash.cash_account table for the operating account.

GL 1010 balance = cash.cash_account.balance WHERE account_type = 'OPERATING'

Escrow Accounts

LIABILITY

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.

GL escrow balance = SUM(escrow.escrow_account.balance)

Automated Schedule

The tie-out job runs automatically as a scheduled cron job managed by the node-cron scheduler in functions/src/scheduler.ts.

PropertyValue
Job NametieOut
ScheduleDaily at 2:10 AM UTC
Tolerance+/- $0.01
Results Storedops.break_report table
Alert TriggerAny 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.

Break Reports

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:

FieldDescription
idUUID primary key
gl_accountThe GL control account code (e.g., 1200, 2000, 1010)
gl_balanceThe balance from the GL at the time of the tie-out
subledger_totalThe sum from the subledger at the time of the tie-out
differenceGL balance minus subledger total
statusOPEN, INVESTIGATING, or RESOLVED
created_atTimestamp 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.

Investigating and Resolving Breaks

When a break is detected, follow this investigation procedure to identify and correct the root cause.

  1. Identify the direction: Is the GL balance higher or lower than the subledger total? A positive difference (GL > subledger) means the GL has extra debits or missing credits. A negative difference means the opposite.
  2. Review recent journal entries: Filter the journal entries list for the affected GL account over the past 24-48 hours. Look for:
    • Manual entries that may have been posted to the wrong GL code
    • Duplicate automatic entries from a subledger
    • Missing automatic entries (a subledger transaction that did not generate a GL posting)
  3. Review subledger transactions: Check the subledger for recent transactions that should have generated GL entries. Compare transaction counts and amounts between the subledger and the GL.
  4. Check the event outbox: Look in 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.
  5. Post a correcting entry: Once the root cause is identified, create a manual journal entry to correct the difference. Use a clear description like "Correcting entry: tie-out break on 1200, missing disbursement GL posting for loan LN-2026-0087".
  6. Mark the break as resolved: Update the break report status to RESOLVED with a note explaining the root cause and the correcting entry ID.

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.

Common Causes of Breaks

Manual Entry to Wrong GL Code

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.

Timing Difference

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.

Failed GL Posting

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.

Rounding Accumulation

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.

Running a Manual Tie-Out

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.

  1. Navigate to Admin → Monitoring
  2. Click Run Tie-Out Now
  3. The job executes immediately and results appear within 30 seconds
  4. Review the results -- any new breaks are recorded; existing resolved breaks are not reopened

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.

Best Practices

  • Review Daily: Check the tie-out results dashboard each morning. Catching breaks early makes them easier to investigate while the transactions are fresh.
  • Zero-Break Policy Before Close: Never close an accounting period with open breaks. All discrepancies must be resolved or explained before the period is closed.
  • Document Root Causes: When resolving a break, always record the root cause in the break report notes. This builds an institutional knowledge base for faster resolution of future breaks.
  • Minimize Manual Entries to Control Accounts: The more manual entries posted directly to control accounts (1200, 2000, 1010), the higher the risk of breaks. Let subledger automation handle the standard postings.
  • Monitor Patterns: If the same control account breaks repeatedly, investigate the subledger posting logic for a systemic issue. Recurring breaks indicate a code-level problem, not a data entry error.

Related Guides

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