Bank Reconciliation
Bank Reconciliation
The Bank Reconciliation module lets you import bank statement CSV files, automatically match transactions to outstanding demands, and maintain an audit-ready ledger for each block.
Navigate to Reconciliation in the sidebar (between Payments & Arrears and Client Money) to access the module.
Overview
The reconciliation workflow has three stages:
- Import — Upload a bank statement CSV for a block.
- Auto-match — A background job scores each transaction against outstanding demands and matches those above the confidence threshold.
- Review — Work through the remaining unmatched transactions in the Queue, manually matching or excluding each one.
Dashboard Tab
The Dashboard tab shows a high-level summary for the selected block (or all blocks):
- Match rate — Percentage of transactions matched, shown as a number and a progress bar.
- Cash flow summary — Total credits, total debits, and net for the imported transactions.
- Stats cards — Total transactions, matched percentage, unreconciled count, and date of the last import.
Importing a Bank Statement
Requirements
- File must be a
.csv. - A block must be selected before importing.
- The CSV must have at least one header row and one data row.
- Required columns: Date, Description, Amount.
- Optional column: Reference.
Steps
- Select a block from the block filter dropdown.
- Click Import CSV.
- Choose your CSV file. The importer reads the headers and auto-detects column mappings based on common names.
- In the column mapping step, confirm or adjust which CSV columns map to Date, Description, Amount, and Reference.
- Review the 3-row preview to verify the mapping looks correct.
- Click Import N Transactions to confirm.
After import, a background job starts auto-matching immediately. A success toast confirms the number of rows imported.
Supported formats
| Field | Supported formats |
|---|---|
| Date | DD/MM/YYYY, ISO 8601, natural dates |
| Amount | 1234.56, £1,234.56, (1234.56) for negatives |
Rows that cannot be parsed are skipped and reported as a warning toast after import.
Auto-detected column names
The importer recognises the following header patterns automatically:
| Field | Recognised headers (case-insensitive) |
|---|---|
| Date | date, posted |
| Description | description, narrative, details, memo |
| Amount | amount, credit, money in, value |
| Reference | reference, ref, payee |
Auto-Matching
After each import, the reconciliation-auto-match background job runs and scores each imported transaction against all outstanding demands for the block.
Scoring algorithm
| Signal | Points |
|---|---|
| Exact amount match | +40 |
| Amount within 10% | +20 |
| Reference contains unit number | +30 |
| Reference contains leaseholder surname | +20 |
| Description contains unit number | +10 |
Transactions with a total score of 60 or above are automatically matched. A payment record is created and the demand status is updated.
Transactions below the threshold remain Unmatched and appear in the Reconciliation Queue.
The job runs with a concurrency limit of 2 per organisation.
Reconciliation Queue Tab
The Queue tab lists all unmatched transactions for the selected block or across all blocks. An amber badge on the tab shows the current unmatched count.
Match status badges
| Badge | Meaning |
|---|---|
| 🟢 Auto | Matched automatically by the background job |
| 🔵 Manual | Matched manually by a user |
| ⚪ Excluded | Excluded from reconciliation (e.g. bank fees) |
| 🟡 Unmatched | Not yet matched or excluded |
Actions
Match (credit transactions only)
- Click Match on a transaction row.
- An inline panel opens showing all outstanding demands for the block.
- Select the correct demand and click Confirm Match.
- A payment record is created and the demand status is updated.
Exclude
- Click Exclude to mark a transaction as excluded. Use this for bank charges, interest credits, or any non-service-charge items.
- Excluded transactions are removed from the unmatched queue.
Ledger Tab
The Ledger tab shows a full transaction history for a selected block.
A block must be selected to view the ledger.
Columns: Date · Description · Reference · Credit · Debit · Status
Unmatch — For auto-matched or manually matched transactions, an Unmatch button appears in the row. Clicking it reverses the match and deletes the associated payment record, returning the transaction to the unmatched queue.
Exporting to Excel
When a block is selected and transactions exist, an Export Excel button appears in the toolbar. Clicking it downloads a .xlsx file named {block-name}-ledger-{date}.xlsx.
The export includes: Date, Description, Reference, Credit (£), Debit (£), Status, Notes.
Imports Tab
The Imports tab shows the history of all CSV import batches.
Columns: Date · File name · Block · Total rows · Matched · Unmatched · Status
Import statuses
| Status | Meaning |
|---|---|
| Complete | Import and auto-match finished successfully |
| Processing | Auto-match job is still running |
| Pending | Import queued, not yet started |
| Failed | Import encountered an error |
Data & Security
- All reconciliation data is stored in two tables —
bank_importsandbank_transactions— both protected by Row-Level Security (RLS) for full tenant isolation. - Excluding a transaction does not delete it; it is flagged and excluded from reporting.
- Unmatching a transaction deletes the associated payment record and returns the demand to outstanding.