Did January payroll leave the bank twice?
Follow two identical debits from the statement, through agent-applied review tags, to an answer that keeps the evidence gap visible.
Open the examplebanktrail turns bank statement exports into a record you can check, with each bank transaction linked to its source. Keep named accounting ledgers alongside it, with searchable entries, notes and tags. Link accounting entries to bank transactions and follow each match in either direction. Missing statements and unread rows stay visible for review.
| Date | Description | Reference | Amount | Balance | Account | |
|---|---|---|---|---|---|---|
| 1 | 2025-01-03 | INVOICE SETTLEMENT ACME LOGISTICS | INV-2201 | 188,400.00 | 670,590.55 | 0132-4477810-03 |
| 2 | 2025-01-07 | RENT UNIT 4 HARBOUR ESTATE rent | SO-1180 | -96,250.00 | 574,340.55 | 0132-4477810-03 |
| 3 | 2025-01-09 | SUPPLIER PAYMENT KHALID BROS | CHQ 100442 | -41,875.20 | 532,465.35 | 0132-4477810-03 |
| 4 | 2025-01-14 | SALARY BATCH JANUARY payroll | PR-2025-01 | -238,914.00 | 293,551.35 | 0132-4477810-03 |
| 5 | 2025-01-14 | SALARY BATCH JANUARY payroll | PR-2025-01 | -238,914.00 | 54,637.35 | 0132-4477810-03 |
| 6 | 2025-01-21 | INVOICE SETTLEMENT ACME LOGISTICS | INV-2214 | 215,600.00 | 270,237.35 | 0132-4477810-03 |
| 7 | 2025-01-28 | UTILITIES K-ELECTRIC | DD-0093 | -18,442.10 | 251,795.25 | 0132-4477810-03 |
| 8 | 2025-01-31 | BANK CHARGES | -1,250.00 | 250,545.25 | 0132-4477810-03 | |
| 9 | 2025-02-03 | INVOICE SETTLEMENT NORTHWIND RETAIL | INV-2219 | 142,300.00 | 392,845.25 | 0132-4477810-03 |
| 10 | 2025-02-06 | RENT UNIT 4 HARBOUR ESTATE rent | SO-1180 | -96,250.00 | 296,595.25 | 0132-4477810-03 |
| Chain break · account 0132447781003 · 2025-02-06 → 2025-02-14 · expected 55,295.25, found 119,795.25 · 64,500.00 unaccounted for · 1 unread row(s) in northwind-2025-02.csv may hold this | ||||||
| 11 | 2025-02-14 | SALARY BATCH FEBRUARY payroll | PR-2025-02 | -241,300.00 | 119,795.25 | 0132-4477810-03 |
| 12 | 2025-02-19 | INVOICE SETTLEMENT ACME LOGISTICS | INV-2223 | 198,750.00 | 318,545.25 | 0132-4477810-03 |
| 13 | 2025-02-25 | SUPPLIER PAYMENT KHALID BROS | CHQ 100467 | -52,300.00 | 266,245.25 | 0132-4477810-03 |
| 14 | 2025-02-28 | BANK CHARGES | -1,250.00 | 264,995.25 | 0132-4477810-03 | |
| Chain break · account 0132447781003 · 2025-02-28 → 2025-04-04 · expected 441,895.25, found 554,675.75 · 112,780.50 unaccounted for · no statement covers this window | ||||||
| 15 | 2025-04-04 | INVOICE SETTLEMENT NORTHWIND RETAIL | INV-2241 | 176,900.00 | 554,675.75 | 0132-4477810-03 |
| 16 | 2025-04-08 | RENT UNIT 4 HARBOUR ESTATE rent | SO-1180 | -96,250.00 | 458,425.75 | 0132-4477810-03 |
| 17 | 2025-04-14 | SALARY BATCH APRIL payroll | PR-2025-04 | -243,050.00 | 215,375.75 | 0132-4477810-03 |
| 18 | 2025-04-17 | SUPPLIER PAYMENT KHALID BROS | CHQ 100501 | -38,120.00 | 177,255.75 | 0132-4477810-03 |
| 19 | 2025-04-22 | INVOICE SETTLEMENT ACME LOGISTICS | INV-2247 | 205,300.00 | 382,555.75 | 0132-4477810-03 |
| 20 | 2025-04-29 | UTILITIES K-ELECTRIC | DD-0101 | -19,105.40 | 363,450.35 | 0132-4477810-03 |
| 21 | 2025-04-30 | BANK CHARGES | -1,250.00 | 362,200.35 | 0132-4477810-03 | |
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
Not tagged and not cross-referenced.
Content-addressed: the same transaction read from another document resolves to this same id.
| Account | Currency | Txns | From | To | Money in | Money out | Balance chain |
|---|---|---|---|---|---|---|---|
| 0132-4477810-03 | — | 21 | 2025-01-03 | 2025-04-30 | 1,127,250.00 | 1,424,520.70 | 2 break(s) |
An account with statements that print no running balance is reported as unverifiable. It is never reported as intact, because no continuity check is possible.
| Document | Read as | Rows | Unread | Arithmetic | SHA-256 |
|---|---|---|---|---|---|
| northwind-2025-01.csv | csv / generic.table | 8 | 0 | foots | fafb74f84594a7a9… |
| northwind-2025-02.csv | csv / generic.table | 6 | 1 | does-not-foot: 1 unread row(s) recorded | df56c5a50302573e… |
| northwind-2025-04.csv | csv / generic.table | 7 | 0 | foots | a83c01c2eeb7d355… |
Each transaction records its source document and position in it. The hash comes from the uploaded file. The service uses that hash to recognise the same statement on a second import.
| Result | Check | Detail |
|---|---|---|
| [ ok ] | uid integrity | 0 row(s) whose content no longer matches their uid |
| [ ok ] | provenance present | 0 transaction(s) with no source file recorded |
| [ ok ] | amount mirror | 0 row(s) where amount_num has drifted from amount |
| [ ok ] | search index | index holds 21 rows for 21 transactions |
| [ ok ] | annotations indexed | all 7 sampled tags are searchable |
| [ ok ] | tag references | 0 orphaned tag row(s) |
| [ ok ] | link references | 0 orphaned link row(s) |
| [ ok ] | attachment_target references | 0 orphaned attachment_target row(s) |
| [ note ] | attached images | 0 image(s) present in … |
| [ ok ] | currency consistency | 0 account(s) holding more than one currency |
| [ note ] | duplicate review | 1 group(s) share account… — kept deliberately, review with `duplicate_report()` |
| [ FAIL ] | balance continuity | 2 break(s) in the running balance, 177,280.50 unaccounted for |
| [ note ] | sub-tolerance continuity | 0 additional break(s) below 0.10 (0.00 net) — listed separately, not silently ignored |
| [ note ] | unread rows | 1 row(s) across 1 document(s) were printed by a statement but never read — the population is knowingly short; see `unparsed()` for page and line |
| [ ok ] | ingest history | 3 recorded import(s) |
The continuity check verifies that the statements form a continuous chain. It fails here and reports 2 chain breaks across 1 unread row(s). This product does not report a pass while the statement set is incomplete.
Whether the population is complete is answered today in a workbook like this one: the same three statements typed into a single sheet, with manual per bank and diff columns bolted on the side.
Every figure in the workbook is defensible on its own. The person who maintains it is not careless. What the workbook cannot show is whether a statement is missing: the difference gets a note, a colour and a colleague’s name, where the viewer above gives the same 64,500 a date window and a cause.
Consecutive statements have to chain: each expected closing balance must appear among the balances the bank printed. Where they fail to join, banktrail reports the break rather than the total.
A matching balance is only one check. Read the guide to checking for missing bank statements for the full source inventory and coverage steps.
Select a tab in the viewer above to see the same three statements as transactions, accounts, documents, or the integrity report.
Tags, comments and supporting evidence stay with the records they explain. Corrections keep an attributed edit history. Evidence can attach to many rows at once, and a SQLite snapshot preserves accounting entries, bank matches and statement sources together.
Create named ledgers for purchases, sales or other accounting records. Add entries by hand or import CSV, then compare them with bank statement transactions.
Reimporting an identical accounting entry with the same external ID keeps the existing entry. A conflicting entry is flagged before the batch is imported.
Three guided reviews use synthetic company data. Each identifies its source files, shows the checks and exception, marks what the evidence can support, and names the next document or action. No client records are used.
1 of 3
Follow two identical debits from the statement, through agent-applied review tags, to an answer that keeps the evidence gap visible.
Open the exampleCompare statement rows with the supplied invoice register and record the remaining evidence request.
Open the exampleTurn a coverage gap into a specific statement request without guessing at the missing activity.
Open the exampleGetting rows out of statement files is the easy part. banktrail came out of a reconciliation across 284 bank statements from 6 banks. Asked how many transfers of one kind had been made, the first answer was eleven. Eleven was right — for one account, out of a population of three, over a date range everyone had assumed was continuous and was not. Every row that had been read had been read correctly, which is exactly what made the number so convincing. No statement parser we could find would have caught it. Accountants, auditors and controllers meet this constantly: every row parses, and the population is still short.
A ledger must foot to the minor unit. It cannot rest on a data type where 0.1 + 0.2 is not 0.3. Every amount is a Decimal from the reader to the ledger, and a string everywhere in between.
An adapter is the component that reads one bank's statement format, and it declares that bank's date order. 03/01/2023 is 3 January in Karachi and 1 March in Chicago. Where a date is ambiguous and no order is declared, banktrail warns rather than picks.
Banks send .xls files that are HTML documents and .xls files that are genuine BIFF. The extension does not tell them apart. banktrail reads the bytes and decides from those, which is the only safe way to identify a format.
The import is refused unless opening plus net movement equals closing. That one check catches a misread column and a defective adapter. Neither is imported.
banktrail refuses an image-only PDF rather than parsing it to nothing. Reading one is a separate, deliberate step: OCR turns the pages back into positioned words, and a capture report then accounts for every token on the page that looks like money before the import is allowed. A partial read shows up in the report instead of disappearing into the total.
Two payments with the same amount, payee and date are two transactions. banktrail identifies each by its position in the statement rather than by its contents, so both salary payments on the 14th survive an export that shuffles the rows.
Tags, comments and supporting images stay with bank transactions and accounting entries. Each match records who made it and how it was selected, with an optional confidence and note. Reviewers can follow the recorded relationship from either entry.
A SQLite snapshot preserves accounting entries, annotations and bank matches alongside the statement evidence. An auditor can inspect the file with tools they already use, without relying on banktrail being online.
Accounts whose statements carry no balance column are reported as unverifiable, never as passed. Reporting an unchecked account as intact would claim a proof that was never run.
Create a hosted workspace to review statements in your browser, with nothing to install. Or use the new desktop app to work with a ledger on your own computer, with the same statement checks, accounting ledgers and review tools. The desktop app targets Mac and Windows and is currently in preview; public installers are not available yet. Command-line and self-hosted tools remain available for custom workflows.
Desktop features and download status →