Answers · bookkeeping
What are the signs someone is hiding theft in my bank reconciliation, and how do I check?
Last updated
TL;DR: A bank reconciliation is only as honest as the bank statement it was matched to and the reconciled history behind it. Theft gets hidden by changing that history: editing, deleting or unreconciling transactions that were already reconciled, undoing a whole reconciliation, marking transactions reconciled by hand, deleting bank statement lines, or reconciling to a statement the bookkeeper supplied instead of the bank's own. The signs to look for are a beginning balance that no longer matches last month's ending balance, reconciliation reports that have disappeared, deposits in transit or outstanding checks that never clear, statement lines created by a user or deleted, and cleared checks to payees you don't recognize. Check from the outside in: get the statement straight from the bank, compare it to the reconciliation report, and read the software's own change history (QuickBooks Online's Reconcile Discrepancy Report and audit log, Xero's Statement Exceptions report). To make the past harder to rewrite quietly, seal each deposit and payment to a mirror ledger as it happens. The person keeping the books can then add entries but never edit or delete them. The ACFE's 2024 study puts check and payment tampering at 11% of asset misappropriation cases, with a median loss of $155,000.
What should I check, step by step?
1. Get the bank statement yourself, from the bank: online banking, a statement emailed to you, or one mailed to your own address. The AICPA's examples of small-business controls start here: the owner receives the statement directly, reviews it monthly and investigates anything odd.
- Compare the ending balance on the bank's statement with the statement ending balance on the reconciliation report. If they differ, the reconciliation was done against a different statement.
- Check the reconciliation history is complete: one report per account per month, with no gaps. In QuickBooks Online, undoing a reconciliation permanently deletes its report and attachments and undoes every later reconciliation too, so a missing month needs an explanation.
- Open Reconcile for each account. If QuickBooks Online says the beginning balance is off, open the Reconcile Discrepancy Report: it lists each reconciled transaction that was later changed, who changed it, what changed and when.
- Check what that report leaves out. QuickBooks says deleted and voided transactions won't appear on it, so filter the audit log for deletes and voids in the account since the last reconciliation, and filter the register for transactions marked R that are dated after the last completed reconciliation.
- In Xero, run the Bank Reconciliation report pack for the month. The Statement Exceptions report shows lines created by a user marking a transaction as reconciled, deleted statement lines and potential duplicates. The Bank Statement report shows each line's source: bank feed, manual import or user-created.
- Read the outstanding items. Deposits in transit should clear within days. Old deposits that never clear, or outstanding checks carried forward month after month, are worth tracing to the bank statement.
- Look at the cleared checks and payments on the bank's statement: payees on your approved vendor list, check numbers in sequence, signatures that follow your check-signing policy. Compare deposits with your own cash receipts log or point-of-sale totals.
- Lock it down after review: close the period in Xero (a closed period's transactions can't be deleted or unreconciled), and in QuickBooks Online keep the primary admin role and the closing-date password with the owner, not with whoever reconciles.
- Keep a record the bookkeeper can't rewrite: seal each deposit and payment to a Rightshold mirror ledger when it happens (the payment type with your own deposit or invoice reference and the amount in cents). At month end, compare the bank's statement with the mirror and with the books.
How does someone hide theft in a small business bank reconciliation?
Reconciling marks transactions as matched to the bank. Once that's done, the reconciled history is the evidence. QuickBooks Online lets a user unreconcile a single transaction by clicking its R status in the register, and lets the primary admin, an in-house accountant user or an accountant in QuickBooks Online Accountant undo a whole reconciliation. Xero lets the administrator role, or a standard user with bank account access, delete a whole bank statement, optionally along with the transactions reconciled to it. Xero says deleted statements can't be restored.
- Each of these has honest uses, such as fixing a duplicate or redoing a messy month. The same tools can remove a theft from view: edit a reconciled payment, delete a statement line, or reconcile to a statement with the problem lines missing.
- The ACFE's 2024 Report to the Nations found check and payment tampering in 11% of asset misappropriation cases, with a median loss of $155,000. Organizations with fewer than 100 employees had a median loss of $141,000 per case.
What do QuickBooks Online and Xero show when reconciled transactions or bank statement lines are changed?
QuickBooks Online's beginning balance should equal last reconciliation's ending balance. If a reconciled transaction is edited, deleted, voided, moved or unreconciled, the beginning balance goes off and QuickBooks won't let the next reconciliation continue until the difference is explained. The Reconcile Discrepancy Report shows who made each change and when.
- The QuickBooks Online audit log can't be turned off, records deleted transactions, and keeps events for two years.
- Xero's Bank Reconciliation report pack includes a Statement Exceptions report listing user-created, deleted and duplicate statement lines, and a Bank Statement report that shows each line's import date and source. Once a period is closed with Reconcile period, its transactions can't be deleted or unreconciled, although account codes can still be edited.
Why does a record kept outside the accounting software help catch reconciliation tampering?
Everything above lives inside an account that an admin controls, and admins can change roles, undo reconciliations and remove lock dates. The bank's own statement is outside that account, and so is a mirror ledger sealed as money moves.
- A Rightshold mirror entry records the amount, your reference, the date you give (occurred_at) and Rightshold's own seal time (sealed_at), and is hash-chained to the entries before it. There is no edit or delete route. A correction is a new adjustment entry. Anyone holding an entry id can check it free, without logging into your books.
- The mirror shows what was sealed and when. It doesn't read your bank, and it can't see a deposit nobody sealed. Its value is the three-way comparison: bank statement, mirror and books should agree, and where they don't is where to look.
How do I ask Rightshold about this (free, no key)?
Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “Verify the Rightshold ledger my mirror-ledger deposit and payment entries are written to, so I can trust them when I compare the bank statement with my books.”
{
"tool": "ledger_verify",
"arguments": {}
}- Free, no key (MCP toolset=ledger). It recomputes every payload, leaf and block hash, Merkle root, chain link and signature on Rightshold's ledger.
- The mirror ledger is a REST API with an API key: POST /v1/mirror-ledgers opens one under a neutral label, and POST /v1/mirror-ledgers/{id}/entries seals an entry. A payment entry needs invoice_ref (your own deposit or invoice reference) and amount_cents. occurred_at is the date you give; sealed_at is Rightshold's clock.
- GET /v1/mirror-ledgers/{id}/entries (owner key) lists entries with seq, occurred_at, sealed_at and entry_hash for the month-end comparison. GET /v1/mirror-entries/{id} is free and needs no account: the record as sealed, its chain check and its anchor status.
- Keep the API key with the owner, not the person who reconciles. A key holder can add entries but can't edit or delete them.
- Content with names, emails, phone numbers, addresses or tax ids is refused. Use your own references (customer_ref, worker_ref).
Rightshold doesn't connect to your bank, QuickBooks or Xero, and it doesn't reconcile accounts or detect fraud. The mirror proves what was sealed and when. It can't see transactions nobody sealed, and it can't show a sealed amount was right. If you suspect theft, talk to your accountant, a fraud examiner or a lawyer before confronting anyone, and keep the evidence as it is. Not legal, tax, audit or accounting advice.
What are the sources?
- ACFE: Occupational Fraud 2024: A Report to the Nations (asset misappropriation sub-schemes, median loss by organization size)
- AICPA: Examples of Controls in Small Entities (owner receives and reviews the bank statement, reviews reconciliations)
- QuickBooks Online: Fix beginning balance issues when reconciling (Reconcile Discrepancy Report)
- QuickBooks Online: Undo or remove transactions from reconciliations
- QuickBooks Online: Use the audit log (can't be turned off, events available for two years)
- Xero Central: Delete a bank statement (deleted statements can't be restored)
- Xero Central: Reconcile and close a period
- Insightful Accountant: The new Xero Bank Reconciliation Report (Bank Statement source, Statement Exceptions)
Related
- How to catch backdated entries posted into a closed month after month-end close
- How to prove small business books weren't edited after the fact
- How to keep a copy of your business books that your bookkeeper can't edit
- How to reconcile an AI agent's spend against the bank feed at month end
Not legal advice. JSON · Markdown · All answers
Get a free API key in one call
No card and no email needed. 100 free credits; the license and policy checks stay free without a key.
curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_... # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
-H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'
