TotalApp Docs

Bank Reconciliation

Corporate-grade bank statement matching — side-by-side reconciliation with immutability guarantees and write-off support.

Overview

Bank Reconciliation is a corporate-grade, Odoo-inspired workstation that ingests bank statements and walks the accountant through the side-by-side matching of every statement line against the company's open invoices and ledger postings. It is the third link in the Finance chain — quotation → invoice → reconciled cash — and the only screen in TotalApp where the system locks bank lines with an audit-grade immutability barrier after they have been matched.

Bank Feed Column

The left side of the workbench shows every unreconciled statement line. Click any row to activate the matching panel on the right. Reconciled rows are tinted emerald and display a rollback button.

Smart Suggestions

When you focus a bank line, the system instantly surfaces matching open invoices ranked by match quality: Strong, Likely, or Partial. One click selects the suggestion and pre-fills the reconciliation footer.

Immutability Guarantee

Once a line is validated, isReconciled is set to true and the line becomes permanently frozen. The ledger entry, matched invoice, and reconciliation timestamp are all stored as an audit record.

Write-Off Support

For discrepancies caused by bank fees or FX differences, a write-off panel appears automatically. Select the account (Bank Fee Expense, FX Loss, FX Gain, Sales Discount) and use Auto-fill to populate the delta amount instantly.

Quotation Invoice Payment Posted Bank Statement Imported Reconciled & Locked

Quick Start

Follow these steps to reconcile your first bank statement line in under two minutes.

  1. Switch to Finance mode using the mode switcher in the header.
  2. Click Bank Reconciliation in the left sidebar.
  3. On first load the screen auto-seeds a demo statement. The banner shows Reconciled: 0 / 5.
  4. In the left Bank Feed column, click the row labelled ACH CREDIT JOEL WILLIS for +1.32.
  5. The right column (System Counterparts) activates. Smart Suggestions lists the matching open invoice — INV/2026/0001 — Joel Willis @ 1.32.
  6. Click the suggestion row. The footer shows Bank line amount 1.32 = Selected entries 1.32 and the Validate & Reconcile button turns emerald.
  7. Click Validate & Reconcile. A green confirmation banner appears, the bank line moves to the reconciled section, and the invoice flips from posted to paid.
  8. The reconciled counter advances from 0/5 to 1/5. Repeat for the remaining lines.

Demo Statement

The auto-seeded demo statement contains five lines covering the most common scenarios: a clean match, a partial payment with write-off, a lump-sum covering multiple invoices, and a payment-direction (outgoing) line. Work through all five to see every workflow path before importing real data.

Core Concepts

Bank Line States

Every bank statement line exists in exactly one of two states. The transition from unreconciled to reconciled is one-way — rollback is the only route back.

StateEditable?Affects GL Balance?Notes
unreconciledYes — selectable, matchableNoDefault state for all imported lines
reconciledNo — frozen, immutableYes — included in Computed BalanceStores the reconciliation date and the matched accounting entries

The Reconciliation Math Handshake

When you press Validate & Reconcile, the system executes a multi-step validation before any data is written. All checks must pass or the operation is rejected with an error toast.

  1. Checks the line is not already reconciled.
  2. Verifies every selected entry resolves to a posted invoice.
  3. Validates the math: the bank line amount must equal the sum of the selected entry residuals plus the write-off amount (0.01 tolerance).
  4. If a write-off amount was entered, confirms a write-off account has been specified.
  5. Registers payment against each matched invoice — updates invoice to paid, increments bank balance.
  6. Marks the line as reconciled and stores the reconciliation date and the matched accounting entries.

All-or-Nothing Atomicity

The validation handshake is atomic. If any step fails — for example the write-off amount is non-zero but no account is selected — the entire operation is aborted. No invoices are marked paid, no bank line is frozen, and no balance is updated. The screen returns to exactly the state before you clicked Validate.

Write-Off Escape Valve

When the bank line amount does not match the sum of selected invoice residuals exactly, a Write-Off panel appears beneath the footer totals. This handles common real-world situations such as bank wire fees deducted at source, foreign exchange rounding differences, or small settlement discounts.

Write-Off AccountUse Case
Bank Fee ExpenseWire transfer fee, SWIFT charge, or ACH processing fee deducted by the bank
FX LossExchange rate moved against you between invoice date and payment receipt
FX GainExchange rate moved in your favour between invoice date and payment receipt
Sales DiscountEarly-payment discount granted to the customer

The Auto-fill button in the write-off panel copies the exact discrepancy amount into the write-off amount field. In most cases you only need to pick the account and click Auto-fill, then Validate.

UI Walkthrough

Top Metric Banner

The four metric tiles across the top of the screen give an at-a-glance summary of the current statement's reconciliation health.

MetricWhat It ShowsVisual Cue
Starting BalanceOpening balance of the most recent imported statementStatic — no color change
Ending Balance (Statement)The closing balance as reported by the bankStatic — source of truth
Computed Balance (GL)Starting Balance + sum of every reconciled line amountEmerald when it matches Ending Balance; amber when discrepancy exists
ReconciledX / Y lines progress countFraction advances as you validate lines

Split Reconciliation Workbench

The main working area is a two-column grid with a 45% / 55% split.

Left — Bank Feed: Displays every statement line with Date, Label, and Amount columns. Click any row to focus it. Reconciled rows appear tinted emerald at the bottom of the list, each with a rollback (↶) button. Unreconciled rows remain at the top in chronological order.

Right — System Counterparts: Three panels stack vertically inside this column:

  • Smart Suggestions — auto-populated the moment you click a bank line. Match quality is indicated as Strong (exact amount + partner match), Likely (amount match, different date), or Partial (approximate amount).
  • Manual Search — a search input that queries all open invoices by invoice number or customer name. Use this when the smart suggestion misses the correct match.
  • Reconciliation Footer — running totals showing Bank line amount, Selected entries total, and Discrepancy. The Validate & Reconcile button activates when the discrepancy is within the 0.01 tolerance (or a valid write-off covers the gap).

Import Statement Dialog

Access via Import Statement in the toolbar. The dark glassmorphism modal accepts statement metadata and line items directly:

  • Statement date, reference code, starting balance, ending balance.
  • A dynamic line drafts grid — add as many rows as needed with date, label, partner name, and amount fields.
  • Each draft row has a × button to remove it before import.
  • Clicking Import persists the statement to bank-statements.json and reloads the workbench.

Worked Examples

Example 1 — Partial Wire with Bank Fee

A customer owed 1,950 EUR on INV/2026/0002 but their bank deducted a 2 EUR SWIFT fee, so only 1,948 EUR arrived.

  1. Click the INTL WIRE line for +1948.00 in the Bank Feed.
  2. Smart Suggestions surfaces INV/2026/0002 @ 1,950 EUR with a Likely match badge.
  3. Click the suggestion. The footer shows Bank 1948.00 | Selected 1950.00 | Discrepancy: −2.00.
  4. The Write-Off panel appears automatically. Select Bank Fee Expense from the account dropdown, then click Auto-fill.
  5. Footer now reads Discrepancy: 0.00. Click Validate & Reconcile.
  6. Invoice flips to paid. Bank line is locked. A 2.00 EUR debit to Bank Fee Expense is posted.

Example 2 — One Lump Sum for Three Invoices

A customer wired 4,500 TRY as a single payment covering three separate invoices of 1,500 TRY each.

  1. Click the +4500.00 bank line.
  2. Smart Suggestions surfaces all three invoices. Click each one to add it to the selection (all three show green check marks).
  3. Footer shows Bank 4500.00 | Selected 4500.00 | Discrepancy: 0.00.
  4. Click Validate & Reconcile. All three invoices flip to paid in a single atomic operation.

Multiple Selections

You can select as many suggestion or search rows as needed. The footer running total updates in real time as you add or remove entries. There is no upper limit on the number of invoices you can match to a single bank line.

Rollback

Every reconciled bank line in the Bank Feed displays a rollback button (↶) in its row. Clicking it removes the isReconciled flag and returns the line to unreconciled status, making it available for re-matching.

Rollback Does Not Reverse Invoice Payments

Un-reconciling a bank line clears the lock on the statement side, but it does not automatically reverse the payment registered against the matched invoice. The invoice remains in paid status. To fully undo the transaction, you must issue a credit note in the Invoicing / Accounts Receivable module separately, then re-reconcile. This separation is intentional — it preserves the audit trail for the original payment while allowing the bank statement to be corrected.

Data Persistence

All bank statement data — imported statements, reconciliation state, and suggested matches — is stored server-side. No data is held in browser local storage. Reconciling or un-reconciling a line, importing a statement, and recomputing the GL balance all happen immediately and persist across page refreshes. Registering payment against a matched invoice on reconciliation is shared with the Accounts Receivable module, so invoice status stays consistent everywhere it's shown.

AI Assistant

Bank Reconciliation includes an embedded AI Assistant panel that reads the currently loaded bank statement lines — date, label, counterparty, amount, and reconciliation status — and answers questions about matching progress, discrepancies, and write-off guidance directly on the screen.

Reconciliation Progress

Ask for a summary of how many lines remain open, which counterparties recur across unreconciled lines, and where to focus next.

Discrepancy Explanation

The assistant interprets the gap between the GL Computed Balance and the statement Ending Balance and points to the lines most likely responsible.

Write-Off Guidance

Ask which small residual amounts look like bank fees, FX gains/losses, or discounts worth writing off versus amounts that need manual investigation.

Save as Report

Any AI response can be saved as a named report to My Reports with one click — the title is generated automatically from your prompt and the current month.

Open the panel from the vertical AI Assistant tab on the right edge of the screen, or the Sparkles button in the panel header once open. It uses the Writer Engine configured in Settings → General → Writer Engine (API, Local CLI, or in-browser engines) — no per-screen configuration is required.

Known Limitations

Current Limitations

  • Outgoing payments: Lines with amount < 0 (payments you made) route to write-off only — vendor bill matching is not yet supported. Use manual journal entries in Financial Accounts to record these.
  • CSV import: The Import Statement dialog accepts hand-entered lines only. Automated CSV file upload is planned for a future release.
  • Rollback scope: Rollback does not auto-reverse the matched invoice payment. You must issue a credit note separately.
  • Single write-off per line: Each statement line supports only one write-off account. For lines with multiple fee types, post the secondary entry as a manual journal and then reconcile.

Frequently Asked Questions

Why does the Validate button remain greyed out even though I selected a suggestion?
The button enables only when the discrepancy is within 0.01. If you selected a suggestion but the amounts don't align exactly, the footer will show a non-zero discrepancy. You must either add additional invoice entries to cover the difference, or open the Write-Off panel and enter the delta amount with a valid write-off account. Once the discrepancy reaches 0.00 (±0.01), the button becomes active.
The Smart Suggestion shows "Partial" — is it safe to use?
A Partial badge means the amounts don't match exactly. The suggestion still helps you find the right invoice quickly, but you will need to resolve the difference via write-off before validation will proceed. Partial matches most commonly arise from bank fees, FX rounding, or a customer paying a round number instead of the exact invoice total.
How do I handle an incoming wire that doesn't match any open invoice?
If the bank line has no matching invoice — for example, an advance payment or a deposit — you cannot reconcile it against an invoice that doesn't exist yet. First create the invoice (or a journal entry for the advance) in Financial Accounts, then return to Bank Reconciliation. The new entry will appear in Manual Search and can be matched. The bank line remains unreconciled and editable until you complete this step.
Can I import multiple statements for the same period?
Yes. Each Import creates a new statement record with its own reference. Statement lines from different imports are all shown in the Bank Feed column. There is no duplicate-detection on import — if you import the same CSV twice you will see duplicate lines. Always check the bank feed for existing lines before importing.