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.
Quick Start
Follow these steps to reconcile your first bank statement line in under two minutes.
- Switch to Finance mode using the mode switcher in the header.
- Click Bank Reconciliation in the left sidebar.
- On first load the screen auto-seeds a demo statement. The banner shows Reconciled: 0 / 5.
- In the left Bank Feed column, click the row labelled ACH CREDIT JOEL WILLIS for +1.32.
- The right column (System Counterparts) activates. Smart Suggestions lists the matching open invoice — INV/2026/0001 — Joel Willis @ 1.32.
- Click the suggestion row. The footer shows Bank line amount 1.32 = Selected entries 1.32 and the Validate & Reconcile button turns emerald.
- Click Validate & Reconcile. A green confirmation banner appears, the bank line moves to the reconciled section, and the invoice flips from posted to paid.
- 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.
| State | Editable? | Affects GL Balance? | Notes |
|---|---|---|---|
| unreconciled | Yes — selectable, matchable | No | Default state for all imported lines |
| reconciled | No — frozen, immutable | Yes — included in Computed Balance | Stores 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.
- Checks the line is not already reconciled.
- Verifies every selected entry resolves to a posted invoice.
- Validates the math: the bank line amount must equal the sum of the selected entry residuals plus the write-off amount (0.01 tolerance).
- If a write-off amount was entered, confirms a write-off account has been specified.
- Registers payment against each matched invoice — updates invoice to paid, increments bank balance.
- 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 Account | Use Case |
|---|---|
| Bank Fee Expense | Wire transfer fee, SWIFT charge, or ACH processing fee deducted by the bank |
| FX Loss | Exchange rate moved against you between invoice date and payment receipt |
| FX Gain | Exchange rate moved in your favour between invoice date and payment receipt |
| Sales Discount | Early-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.
| Metric | What It Shows | Visual Cue |
|---|---|---|
| Starting Balance | Opening balance of the most recent imported statement | Static — no color change |
| Ending Balance (Statement) | The closing balance as reported by the bank | Static — source of truth |
| Computed Balance (GL) | Starting Balance + sum of every reconciled line amount | Emerald when it matches Ending Balance; amber when discrepancy exists |
| Reconciled | X / Y lines progress count | Fraction 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.jsonand 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.
- Click the INTL WIRE line for +1948.00 in the Bank Feed.
- Smart Suggestions surfaces INV/2026/0002 @ 1,950 EUR with a Likely match badge.
- Click the suggestion. The footer shows Bank 1948.00 | Selected 1950.00 | Discrepancy: −2.00.
- The Write-Off panel appears automatically. Select Bank Fee Expense from the account dropdown, then click Auto-fill.
- Footer now reads Discrepancy: 0.00. Click Validate & Reconcile.
- 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.
- Click the +4500.00 bank line.
- Smart Suggestions surfaces all three invoices. Click each one to add it to the selection (all three show green check marks).
- Footer shows Bank 4500.00 | Selected 4500.00 | Discrepancy: 0.00.
- 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.