Statement-Assisted Reconciliation to assist Janky Bank Feeds (Smart De-Dupe & Gap-Fill)
The Problem
- Yodlee/feeds sometimes duplicate lines (same day/amount/reference) or if the bank does something weird you now have 2 accounts for the same account in Yodlee with some transactions in one and others in the new one and there's no recompence or way to handle this smoothly without a support ticket and back and forth and manual intervention.
- Feeds also occasionally miss days (bank outages, MFA, consent expiries if user inactive or whatever the excuse here is).
- Current workaround requires manual exports and spreadsheet comparisons, which defeats the purpose of using Xero to reduce the administrative burden of accounting.
Proposed Solution
Introduce a guided, 3-step Statement-Assisted Reconciliation (SAR) wizard under the Bank Account → Reconcile/Import area (or something similar...)
Step 1 — Upload & Scope
* Upload formats: CSV, OFX/QFX, QIF, and PDF (with in-product OCR where possible).
* Choose bank account in Xero, statement date range, and timezone/currency (pre-filled from the account).
* Optional layout templates (e.g., FNB, ABSA, Capitec) and custom column mapping for CSV (Date, Amount, Debit/Credit, Description, Reference, Balance) and maybe make the OCR or whatever used smarter for PDFs so that it knows when looking at a credit card that transactions are split out per card and not necessarily 100% chronological in that case.
Step 2 — Smart Compare (De-Dupe & Gap-Fill)
Xero compares uploaded lines against the bank account’s statement lines ledger (feed + prior imports) using a deterministic + fuzzy match:
- Primary exact keys (same Account, Date, Amount, Reference/Description normalized).
- Fuzzy window: ±3 banking days for date; ±R0.01/US$0.01 for rounding; string similarity on description/reference (tokenized, trimmed).
- Heuristics:
- If exact match found → mark as existing.
- If exact match found twice → mark as potential duplicate (or do a process of elimination, all the transactions go into a list for the statement and for each transaction found in Xero already, remove it from the list, what's left over in Xero but not in the Statement could be potential duplicates (around the end of the month there may be transactions that are on the next statement but already in Xero for the range)
- If near match but not exact → mark as Potential Duplicate (user review).
- If no match → mark as Missing (and make the import simple).
- Range integrity: highlight gaps (e.g., “No lines exist for 2025-06-12 to 2025-06-14”).
- Balance sanity (optional): compute running balance from upload and flag discontinuities.
Step 3 — One-Click Actions
* Import Missing Only (default, safe).
* Enable bulk confirm of Potential Duplicates as “same/keep both/skip”.
* Auto-match missing lines to existing spend/receive money, bank rules, and Find & Match candidates.
* Present a Fast-Match tray (left: uploaded lines; right: suggested matches) with keyboard-first workflow. (or use the existing reconciliation window from here once missing ones are quick imported and duplicates are marked)
Some edge cases to consider is if the same amount was spent twice at the same place on the same day (very likely occurrence) and to have some process of eliminating false flags and wasting the end users' time figuring out what is a duplicate and what not. If a user went through the effort of getting and uploading the statements to Xero they're already doing a lot of manual intervention to determine why balances are not matching and this will make it easier to track and find balance mismatches over a 12-month period.
At that point, if the user is uploading statements we'll also have opening and closing balances and can highlight mismatches in Xero for opening and closing balances in a month to help track down why a balance does not align or match.

Hi 👋 your idea is being looked into by our Community team. We'll be in touch soon to update you once your idea has been reviewed.
Did you know you can join our Xero Research panel to be involved in early testing and research? Find out more and sign up through our website 🙂
-
Antonio De Almeida commented
Another comment maybe, as a dev using Xero for my consultancy, consider using a multiset, balance-aware process of elimination.
Bank ↔ Xero 1:1 inside each (date, amount, merchant) bucket; import only the difference when Bank > Xero; flag extras when Xero > Bank.Preserve real same-day duplicates (like filling up twice at a petrol station or if you pay for coffee twice at the same place throughout the day) and eliminate true feed dupes with full audit. Do this against the actual Statements and maybe put a mechanism in place to automatically unreconcile transactions already reconciled by accident if a true duplicate is found and both the original and duplicate have been reconciled against something by mistake.