Bank Reconciliation Pro
A modern, scored bank reconciliation workspace for Odoo 19 Community, with an append-only audit trail.
Why this module
Bank Reconciliation Pro
Five signals, shown
Candidates are ranked by amount, date proximity, partner, reference token overlap, and 90-day history, with a per-signal confidence breakdown surfaced in the workspace. The operator sees why a match was suggested before confirming it.
An audit trail that cannot be rewritten
Every match records the user, time, confidence, rules fired, and whether it was an accepted suggestion or a manual override. The rows refuse write and unlink at the model level, so the decision trail stays intact.
Yours to keep
LGPL-3 source on disk. No activation key, no phone-home, no recurring licence. Read it, extend the engine through inheritance, override individual heuristics for your bank memo conventions.
Day in the life
A bookkeeper clears a month of bank lines.
A bank journal loads up to 200 unreconciled lines into the workspace. For each line the engine scores up to ten candidate journal items by amount, date, partner, reference overlap, and 90-day history, and shows the confidence breakdown. Most lines have a clear top candidate, the bookkeeper confirms with one click or drags the candidate onto the line. A few payments arrive as one deposit, so several candidates are ticked and matched to that single line in one action. A foreign-currency receipt lands a few cents short, the residual write-off routes to the exchange gain account by sign, under its small-variance cap, inside a savepoint. Every decision, accepted or manual, is written to an append-only audit row. At close, the exception PDF shows the reconciled percentage and oldest-unmatched age per journal.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
The engine refuses to re-match a statement line or candidate journal item that is already reconciled, so the audit log never claims a match that the database would silently no-op.
FX residual write-off auto-routes to gain or loss by residual sign and enforces an optional small-variance cap, so bank-charge variance never lands in a generic suspense account. If the exchange accounts are unconfigured, it refuses rather than guessing.
Writing off against a posted move is handled safely: set to draft, add the counter line, re-post, then re-reconcile, all inside a savepoint, with a hard fail if there is no reconcilable suspense line or the residual is already zero.
Session match, skip, and write-off counters increment with an atomic SQL UPDATE (col = col + 1) behind a field allowlist, so concurrent reconciliation cannot lose increments through a read-modify-write race.
The history signal respects record rules and is scoped to the active companies, so a multi-company user is never scored on reconciliation activity from a sibling company they only have read access on.
Statement-line date is a non-stored related field that cannot be used in SQL ORDER BY on Odoo 19, so the workspace orders by id descending with a fallback for older versions.
Rule definitions are checked at write time: an invalid Python regex or an amount_max below amount_min is rejected before the rule can ever fire.
What is inside
Built to do the job, end to end.
- Two-pane reconciliation workspace. An OWL workspace with unreconciled statement lines on the left and scored candidate journal items on the right. A separate kanban lists past reconciliation sessions. The fetch caps at 200 lines per journal, and the top 10 scored suggestions per line, to stay responsive on large statements.
- Five-signal suggestion engine. An inheritable AbstractModel scores candidates by amount match, date proximity, partner, reference token overlap, and 90-day history, then returns the ranked candidates with a per-signal breakdown. Weights and individual heuristics can be overridden through inheritance.
- User-defined reconciliation rules. Rules with payment-reference or narration regex, amount band, direction, and partner scope add a confidence boost so reliable patterns rank higher. Each definition is validated at write time and the firing rule code is stamped on the audit row.
- Append-only audit log. One row per match capturing confidence, rules fired, user, decision, and source (manual, suggestion, bulk, or drag and drop). Write and unlink are blocked at the model level unless an internal context flag is set.
- FX residual write-off. Routes the residual to the company exchange gain or loss account by sign, under an optional small-variance cap, and posts inside a database savepoint that rolls back cleanly on failure.
- Reconciliation exception PDF. Per journal over a date range: reconciled percentage, unmatched count and amount, oldest-unmatched age, and write-off and skip counts, with summed totals.
Honest about the edges
What this does not do, so nothing surprises you.
- Matches are not applied automatically. The engine ranks candidates and the operator confirms each match with a click or a drag, there is no confidence-threshold auto-apply.
- There is no statement line search box, no amount-range filter, and no saved-view persistence in the workspace. The view loads up to 200 unreconciled lines per journal at a fixed cap, with no pagination panel.
- Matching is 1-to-N (one statement line to several journal items). Matching several statement lines to a single journal item (N-to-1) is not supported.
- The savepoint protects write-offs, including FX residual write-offs. The plain accept-match path reconciles without a savepoint wrapper.
- Rules add a scoring boost and stamp the firing rule code on the audit row. There is no account.reconcile.model integration and no per-rule fired-on-which-lines tracking, the per-rule fire-count helper is present but not wired into the live firing flow.
- The audit row does not capture a free-text override reason. An override is recorded as a manual-source decision with user, time, and confidence.
Odoo 19 Community bank reconciliation, bank reconciliation widget Odoo Community, Odoo reconciliation suggestion engine, auto match bank statement lines Odoo, user-defined reconciliation rules Odoo, reconciliation audit log Odoo, bank statement reconciliation workspace, FX rounding write-off reconciliation, reconciliation exception report Odoo
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Please log in to comment on this module