GuideSynthetic examples included

How to verify a PDF bank statement conversion.

A converted statement can balance to the cent and still be wrong. This guide shows how to check extracted transactions against the statement’s own figures, which errors those checks catch, and which ones only reading the PDF will.

It works for a file from any converter, or typed by hand. The examples are invented, with downloads and formulas to try them yourself.

willow-2026-07-swapped-amounts.csvSample
The first six rows of an extraction whose rent and contractor amounts are swapped, with each row’s running balance difference.
DescriptionAmountBalanceDifference
Northstar Studio - Invoice 10452,750.0014,888.500.00
Workspace rent−1,900.00 (differs from the statement)13,688.50−700.00
Software subscription−85.0013,603.500.00
Hardware store - card purchase−240.0013,363.500.00
Hardware store - refund240.0013,603.500.00
Contractor payments−1,200.00 (differs from the statement)11,703.50700.00
  • Closing balance Passes
  • Total credits Passes
  • Total debits Passes
  • Running balances Fails
Balanced, and still wrong: two amounts swapped between rows leave every total intact.

The method

Six steps, from cheapest to most thorough.

The first and last are a person reading the PDF. The four between are spreadsheet checks that take seconds: three of arithmetic, then dates and the count. Each one catches something the others can miss, so a careful check uses all of them.

  1. Copy the printed figures first

    Before looking at the extraction, write down what the statement itself prints: the opening and closing balances, the totals of credits and debits, the number of items if it gives one, and the period. These are your independent evidence. Take them from the PDF, never from the converted file.

  2. Tie out the closing balance

    Opening balance plus every amount must equal the closing balance, to the cent. This catches most lost or doubled rows and most sign errors — unless two errors cancel.

  3. Tie out each side separately

    Add the credits and the debits on their own and compare each with its printed total. A pair of rows that cancel each other still changes both totals, and a credit read as a debit moves twice its amount.

  4. Walk the running balance

    When the statement prints a balance after each row, check every link: the balance above, plus this amount, gives this balance. It is the only arithmetic check that sees which row an amount sits on.

  5. Check the dates and the count

    Count the rows against the number of items the statement lists, if it prints one. Then look for a date outside the statement period, or earlier than the row above it. These flag errors that leave every amount right, but a flag is a reason to look at the PDF, not proof of an error: some statements print items dated outside the period, or list rows out of date order. A faithful extraction keeps the dates and order the statement prints, even where they break these checks.

  6. Read a sample against the PDF

    Arithmetic cannot read. Compare some rows in full — date, description, amount — with the page, starting where errors gather: page breaks, wrapped descriptions, and the rows around anything that failed above.

The worked example

One fictional statement, extracted five ways.

Willow Studio’s July statement lists ten transactions and prints the figures every check needs. Below it are four extractions with one realistic error each, and what each check makes of them.

Sample BankFictional statement
Account holder
Willow Studio LLC
Period
Jul 1, 2026 – Jul 31, 2026
Opening balance
12,138.50
Total credits
5,800.00
Total debits
4,113.90
Closing balance
13,824.60
Items listed
10
The statement's ten transactions, as printed.
DateDescriptionAmountBalance
2026-07-01Northstar Studio - Invoice 10452,750.0014,888.50
2026-07-02Workspace rent−1,200.0013,688.50
2026-07-06Software subscription−85.0013,603.50
2026-07-09Hardware store - card purchase−240.0013,363.50
2026-07-09Hardware store - refund240.0013,603.50
2026-07-14Contractor payments−1,900.0011,703.50
2026-07-17Fieldwork Co. - Invoice 10461,850.0013,553.50
2026-07-22Insurance premium−312.4013,241.10
2026-07-28Riverside Print - Invoice 1047960.0014,201.10
2026-07-30Utilities−376.5013,824.60

Every figure is invented. Amounts are signed the way the formulas below expect: a credit is positive, a debit negative. The download is the faithful extraction, columns date,description,amount,balance.

Download the faithful extractionwillow-2026-07-faithful.csv

Four errors, and which checks catch them

Two amounts swapped

The rent and the contractor payments trade amounts, as happens when rows are re-paired after a table is split across columns or pages.

Two amounts swapped: the extracted rows, with each row's running balance difference.
DateDescriptionAmountBalanceDifference
2026-07-01Northstar Studio - Invoice 10452,750.0014,888.500.00
2026-07-02Workspace rent−1,900.00 (differs from the statement)13,688.50−700.00
2026-07-06Software subscription−85.0013,603.500.00
2026-07-09Hardware store - card purchase−240.0013,363.500.00
2026-07-09Hardware store - refund240.0013,603.500.00
2026-07-14Contractor payments−1,200.00 (differs from the statement)11,703.50700.00
2026-07-17Fieldwork Co. - Invoice 10461,850.0013,553.500.00
2026-07-22Insurance premium−312.4013,241.100.00
2026-07-28Riverside Print - Invoice 1047960.0014,201.100.00
2026-07-30Utilities−376.5013,824.600.00
  • Closing balance Passes
  • Total credits Passes
  • Total debits Passes
  • Item count Passes
  • Running balances Fails
  • Dates in period Passes
  • Date order Passes

Both debits are still there, so the closing balance and both totals still agree. Only the running balance chain breaks, on exactly the two swapped rows, by equal and opposite amounts.

Download this extractionwillow-2026-07-swapped-amounts.csv

An offsetting pair dropped

A card purchase and its same-day refund are both missing, as when two rows at a page break are lost together.

An offsetting pair dropped: the extracted rows, with each row's running balance difference.
DateDescriptionAmountBalanceDifference
2026-07-01Northstar Studio - Invoice 10452,750.0014,888.500.00
2026-07-02Workspace rent−1,200.0013,688.500.00
2026-07-06Software subscription−85.0013,603.500.00
2026-07-09Hardware store - card purchaseNot extracted−240.0013,363.50—
2026-07-09Hardware store - refundNot extracted240.0013,603.50—
2026-07-14Contractor payments−1,900.0011,703.500.00
2026-07-17Fieldwork Co. - Invoice 10461,850.0013,553.500.00
2026-07-22Insurance premium−312.4013,241.100.00
2026-07-28Riverside Print - Invoice 1047960.0014,201.100.00
2026-07-30Utilities−376.5013,824.600.00
  • Closing balance Passes
  • Total credits Fails
  • Total debits Fails
  • Item count Fails
  • Running balances Passes
  • Dates in period Passes
  • Date order Passes

They cancel, so the closing balance agrees, and the next printed balance still follows. The totals and the item count do not.

Download this extractionwillow-2026-07-dropped-pair.csv

Descriptions on the wrong rows

The insurance premium and the Riverside Print invoice trade descriptions, as when a wrapped description line is attached to its neighbour.

Descriptions on the wrong rows: the extracted rows, with each row's running balance difference.
DateDescriptionAmountBalanceDifference
2026-07-01Northstar Studio - Invoice 10452,750.0014,888.500.00
2026-07-02Workspace rent−1,200.0013,688.500.00
2026-07-06Software subscription−85.0013,603.500.00
2026-07-09Hardware store - card purchase−240.0013,363.500.00
2026-07-09Hardware store - refund240.0013,603.500.00
2026-07-14Contractor payments−1,900.0011,703.500.00
2026-07-17Fieldwork Co. - Invoice 10461,850.0013,553.500.00
2026-07-22Riverside Print - Invoice 1047 (differs from the statement)−312.4013,241.100.00
2026-07-28Insurance premium (differs from the statement)960.0014,201.100.00
2026-07-30Utilities−376.5013,824.600.00
  • Closing balance Passes
  • Total credits Passes
  • Total debits Passes
  • Item count Passes
  • Running balances Passes
  • Dates in period Passes
  • Date order Passes

No arithmetic check can see it: every amount and balance is right. Only reading rows against the PDF does.

Download this extractionwillow-2026-07-shifted-descriptions.csv

A date read in the wrong order

07/06/2026 is read day-first, as 7 June instead of 6 July — the usual result of opening a US-format date in a day-first locale.

A date read in the wrong order: the extracted rows, with each row's running balance difference.
DateDescriptionAmountBalanceDifference
2026-07-01Northstar Studio - Invoice 10452,750.0014,888.500.00
2026-07-02Workspace rent−1,200.0013,688.500.00
2026-06-07 (differs from the statement)Software subscription−85.0013,603.500.00
2026-07-09Hardware store - card purchase−240.0013,363.500.00
2026-07-09Hardware store - refund240.0013,603.500.00
2026-07-14Contractor payments−1,900.0011,703.500.00
2026-07-17Fieldwork Co. - Invoice 10461,850.0013,553.500.00
2026-07-22Insurance premium−312.4013,241.100.00
2026-07-28Riverside Print - Invoice 1047960.0014,201.100.00
2026-07-30Utilities−376.5013,824.600.00
  • Closing balance Passes
  • Total credits Passes
  • Total debits Passes
  • Item count Passes
  • Running balances Passes
  • Dates in period Fails
  • Date order Fails

Every balance agrees. The date falls outside the statement period and before the row above it, so the two date checks flag it, and the PDF confirms it: the statement prints 6 July.

Download this extractionwillow-2026-07-date-order.csv

Which check catches what

All four errors pass the closing balance.

The closing balance is the check most people stop at. Here it passes every extraction, though only the first is right. Each further check closes a different gap, and one error passes all of them.

The seven checks on each extraction. Computed from the downloadable files, with the formulas in the next section.
ExtractionClosing balanceTotal creditsTotal debitsItem countRunning balancesDates in periodDate order
A faithful extractionPassesPassesPassesPassesPassesPassesPasses
Two amounts swappedPassesPassesPassesPassesFailsPassesPasses
An offsetting pair droppedPassesFailsFailsFailsPassesPassesPasses
Descriptions on the wrong rowsPassesPassesPassesPassesPassesPassesPasses
A date read in the wrong orderPassesPassesPassesPassesPassesFailsFails

Spreadsheet formulas

The same checks, in Excel or Google Sheets.

Open a downloaded CSV: the date is in column A, the description in B, the signed amount in C and the printed balance in D, with the ten rows in 2 to 11. Type the statement’s figures into column G, then paste each formula anywhere. TRUE is a pass.

For your own file, change 11 to your last row and 10 to the row above it — the dropped-pair sample has eight rows, so there it is 9 and 8. If dates stay left-aligned as text, convert them to dates first, or the date checks compare text. Some locales separate arguments with a semicolon instead of a comma.

Typed in by you, from the PDF
CellFigureSample value
G2Opening balance12138.50
G3Closing balance13824.60
G4Total credits5800.00
G5Total debits4113.90
G6Items listed10
G7Period start2026-07-01
G8Period end2026-07-31
Closing balance
=ROUND(G2+SUM(C2:C11),2)=G3

The opening balance plus every amount equals the printed closing balance.

Total credits
=ROUND(SUMIF(C2:C11,">0"),2)=G4

The positive amounts add up to the printed total of credits.

Total debits
=ROUND(-SUMIF(C2:C11,"<0"),2)=G5

The negative amounts, as a positive figure, add up to the printed total of debits.

Item count
=COUNT(C2:C11)=G6

There are as many amounts as the statement says it lists.

Running balances

Column E, then filled down:

E2  =ROUND(G2+C2-D2,2)
E3  =ROUND(D2+C3-D3,2)

In E2, the opening balance plus the first amount, less the first printed balance. In E3, filled down to E11, the row above's balance plus this amount, less this balance. Any row that is not zero is where the chain breaks.

Then the check:

=COUNTIF(E2:E11,"<>0")=0

Every row's link in column E is zero.

Dates in period
=COUNTIFS(A2:A11,"<"&G7)+COUNTIFS(A2:A11,">"&G8)=0

No date falls before the period's first day or after its last.

Date order
=SUMPRODUCT((A3:A11<A2:A10)*1)=0

No date is earlier than the one above it.

What arithmetic cannot see

Some errors leave every number right.

Reconciliation proves the amounts add up to the statement’s own figures. It cannot say whether each amount, date and description is on the right row. These are the cases to read for by eye.

  • Descriptions on the wrong rows

    A wrapped description attached to its neighbour changes no figure. Read the descriptions around wrapped lines and page breaks against the PDF.

  • Amounts swapped without a printed balance

    When the statement prints no balance per row, nothing ties an amount to its row. Two debits that trade places pass every total.

  • Errors that cancel inside one side

    One debit read 100.00 too high and another 100.00 too low leave the debit total, the closing balance and the count intact.

  • Legitimate duplicates, and real ones

    Two identical charges on one day can be genuine. A duplicate check only points at rows to read; it cannot decide which they are.

  • Several accounts in one PDF

    Each account has its own opening and closing balance. Check each account against its own printed figures, never one combined total.

  • A misread printed figure

    Every check compares against what you copied from the statement. Copy those figures from the PDF yourself; a converter that misreads a total and a row the same way can agree with itself.

Limits

What a passing check does not tell you.

Every check above compares the extraction with something independent. When that something is absent, or comes from the same reading, the check proves less. Say which checks you could run, not just that the file “checked out”.

A pass is evidence, not proof
Passing every check makes many errors impossible and the rest less likely. It never shows that every row is right.
A missing figure is a missing check
If the statement prints no totals, there is nothing to compare totals against. Record that check as not done, never as passed, and lean harder on the running balance and reading.
No running balance, no row-level arithmetic
Many statements print a balance only daily, or not at all. Then only totals and reading remain, and errors that move amounts between rows go unseen by arithmetic.
A failure says where to look, not what is wrong
A broken chain points at rows; a short total points at a side; a flagged date points at a row, which may be just what the statement prints. The cause still has to be read off the PDF.

Where DocShape fits

It runs the balance checks for you, and leaves the reading to you.

DocShape converts PDF bank statements to Excel and CSV, and checks each account’s extracted transactions against the opening balance, the closing balance, the totals and the running balances its statement prints — exactly, with no tolerance.

Its checks are arithmetic. It does not compare dates, counts or descriptions, so the reading steps above still apply to its files, as to any converter’s.

How DocShape’s checks work
  • VerifiedThe extracted amounts reconcile with balances or totals DocShape read from the statement. This does not confirm that every transaction, date or description was captured correctly.
  • Needs reviewOne or more verification checks did not reconcile. Review the extracted data before exporting.
  • Could not be verified automaticallyDocShape did not recognize enough independent financial figures in this statement to check the extracted amounts automatically. The statement may contain balances or totals in a format DocShape does not yet support. Review the result against your statement before relying on it.