Two debits have the same date, amount, description and reference. Follow an accountant
and an agent from the source rows to the careful answer: the bank shows two payments,
but the payroll register is still needed to decide whether the second was an error.
Company
Northwind Traders
Population
3 statements / 21 rows
Question
Potential duplicate payroll
Data
Synthetic throughout
Work alongside the ledger
Ask the question. Keep the evidence attached.
Scroll through the review. The banktrail viewer stays beside the conversation and moves to
the relevant evidence. You can still use its tabs, scroll the grid, and open any row.
banktrail / live example/Northwind Traders — synthetic statement population
✂ 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
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
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.
21 rowsFilter net -297,270.70⚠ 2 chain breaksall accountsclick a row for its record · arrows move · enter opens · esc closes
01 / population2 chain breaks and 1 unread row stay in scope.
02 / agent annotationRecurring rent and payroll rows tagged with provenance.
03 / review flagTwo matching payroll debits — possible duplicate.
04 / answerTwo bank payments confirmed. Duplicate intent not yet proven.
This is the interactive banktrail viewer using the same synthetic CSV statements as the
homepage demo. Agent messages below are an illustrative review of those exact rows.
01 / establish the population
Before answering, the agent checks what the ledger can prove.
Agent
I can review the January payroll rows. One February row is unread and the March
statement is missing, so I will not describe the full period as complete. Neither
issue affects the two January source rows we are comparing.
The qualification comes first. A fluent answer should not silently turn an incomplete
statement population into a complete one.
02 / annotate the ledger
Give the agent a review rule in ordinary language.
You
Tag recurring payroll and rent payments so I can review them as groups.
Agent
I tagged rows whose descriptions and references consistently identify payroll or
rent. The annotation records that it came from this agent rule; it does not alter the
imported transaction.
Tags remain on the rows and carry their source. Another reviewer can inspect the rule
instead of reverse-engineering a colour in a spreadsheet.
03 / ask a question
Now investigate the thing that looks wrong.
You
Did January payroll leave the bank twice?
Rows compared
CSV row 8−238,914.000df5…55d6
CSV row 9−238,914.00055f…6d78
Same date. Same reference. Different source positions, running balances and content
identities. banktrail preserves both rather than deduplicating one away.
04 / answer with a boundary
The result is useful because it stops at the evidence.
Agent
Yes, two payroll payments of PKR 238,914 left this account on 14 January.
They appear at separate positions in the January statement and reduce the running
balance twice. I marked the second for duplicate review. I cannot conclude it was an
erroneous duplicate until we compare both payments with the approved payroll register
or bank instruction.
Next evidence request
January payroll register and the bank upload approval covering reference PR-2025-01.
What the agent changed
Annotations, not transactions.
The imported date, description, reference, amount, balance, source locator and identity stay
untouched. The review adds attributed tags and a follow-up request alongside the evidence.