GuideSynthetic examples included

How to convert historical bank statements to CSV for catch-up bookkeeping.

Catching up starts with a folder of PDF statements. The risk is rarely one conversion: it is a month that is missing, a month that is in twice, or a file nobody checked. This is a procedure for turning that folder into one CSV you can stand behind.

It works with whatever produces your files — a converter, a bank export, hand entry. The examples are invented, with files to download and formulas to try.

alder-row-2026-q1-tracker.csvSample
Three monthly statements with their opening and closing balances, and the gap between each opening and the closing before it.
StatementOpeningClosingGap
January 20264,320.155,512.05—
February 20265,512.056,764.750.00
March 20266,764.756,887.900.00
  • Each statement alone Passes
  • Month to month Holds
Each month opens where the last one closed. In this example, gaps of zero are consistent with no missing statement; a nonzero gap is a flag to check against the PDFs.

Before converting

Start with a list, not a file.

Write down which statements the catch-up needs, and three figures from each: the period it covers, its opening balance and its closing balance. They come from the PDF, so no converter has shaped them, and they are all it takes to find a missing month later.

A statement’s period is not always a calendar month. Copy the dates it prints, and note any statement that arrives as two files or runs to a different day each month.

The tracker: typed from the PDFs (columns A to F), then the two checks (G and H).
StatementPeriodOpeningClosingItemsGapNext day
January 2026Jan 1 – Jan 314,320.155,512.058——
February 2026Feb 1 – Feb 285,512.056,764.7580.00Follows
March 2026Mar 1 – Mar 316,764.756,887.9070.00Follows

With real dates in B and C (convert them first if they sit left-aligned as text), the two checks are one formula each, from row 3 down. A gap of 0.00 means the statement opens where the last one closed; TRUE means its period starts the day after the last ended.

Gap
G3  =ROUND(D3-E2,2)

This statement’s opening balance less the closing balance above it, rounded to whole cents. It is not a tolerance: one cent still shows.

Next day
H3  =B3-C2=1

This statement’s first day, less the last day above it, is exactly one.

Download the filled-in trackeralder-row-2026-q1-tracker.csv

The procedure

Six steps, in an order that keeps errors small.

The order matters more than the tools. Checking a file before stacking it means a mistake costs one month’s review, not the whole sheet’s.

  1. Convert one statement at a time

    A problem in one month stays a problem in one month. Whatever makes the file, a conversion nobody has checked is a draft.

  2. Check each file against its own PDF

    The opening balance plus every amount is the closing balance, and credits and debits each match their printed totals. The verification guide has the full method and formulas. Record the result in the tracker either way.

  3. Put every file in the same shape

    The same columns in the same order, ISO dates such as 2026-03-18, and one signed amount column with credits positive and debits negative. Reshape the layout only; do not correct values yet.

  4. Stack them, and keep each row's source

    Add a statement column before stacking. It lets you filter one month, and it is how a row gets traced back to its PDF when someone asks.

  5. Join the months

    For consecutive statements of one account, each should open at the previous closing balance and start the day after the previous one ended. A gap or overlap is a flag to settle against the PDFs, not a verdict: a bank can change its period dates or post an adjustment between statements. This is the one check no single file can run.

  6. Log what you changed, then import

    Every correction to a value, with the statement, the row and how you settled it. Import only after the join holds and the log is complete.

Joining the months

Every file passes, and the folder is still wrong.

The same three statements, in three states a folder can really be in. In each, every file passes its own checks. Only the joins between them tell the folders apart.

All three months, once each

Every statement is there and each opens where the last one closed.

All three months, once each: each join between two statements.
JoinClosingOpeningGapResult
January to February5,512.055,512.050.00Holds
February to March6,764.756,764.750.00Holds
  • January alone Passes
  • February alone Passes
  • March alone Passes

Every link holds and every period follows the last: nothing is missing and nothing is doubled.

February is missing

Two files are converted and each passes its own checks. The gap only shows where one closes and the next opens.

February is missing: each join between two statements.
JoinClosingOpeningGapResult
January to March5,512.056,764.751,252.70Breaks
  • January alone Passes
  • March alone Passes

The gap, 1,252.70, is February's net movement, and the periods skip a month. It tells you what the missing statement must add up to, not what is in it.

February is in the folder twice

A re-download saved under a new name. Each copy passes its own checks, and the combined sheet would count February twice.

February is in the folder twice: each join between two statements.
JoinClosingOpeningGapResult
January to February5,512.055,512.050.00Holds
February to February6,764.755,512.05−1,252.70Breaks
February to March6,764.756,764.750.00Holds
  • January alone Passes
  • February alone Passes
  • March alone Passes

The second copy opens −1,252.70 from where the first closed, and its period overlaps the first. Only that join breaks: the months either side still join up, so checking each file alone cannot see it.

Stacking

Combine the months without losing the trail.

The statement column is the whole trick. It keeps January’s rows distinguishable from February’s, and it survives sorting.

Alike is not duplicate. Alder Row pays the same rent on the second of each month, and those rows are right. A real duplicate need not be a whole statement: one row can be repeated inside a single file. A statement counted twice breaks the join in the step above, but a repeated row does not, so two similar rows are a reason to read the PDF.

The combined file around the seam: the last two January rows, then the first two February rows. alder-row-2026-q1-combined.csv holds all of it.
StatementDateDescriptionAmountBalance
2026-012026-01-27Packaging supplies−97.255,576.05
2026-012026-01-30Insurance premium−64.005,512.05
2026-022026-02-02Studio rent−950.004,562.05
2026-022026-02-04Online shop payout655.105,217.15

One more check once everything is stacked. Put the first statement's opening balance (4,320.15) in H1 and the last statement's closing balance (6,887.90) in H2: the amounts in column D must account for the whole difference.

H3  =ROUND(SUM(D2:D24),2)=ROUND(H2-H1,2)

It reads rows 2 to 24, the 23 rows of alder-row-2026-q1-combined.csv; change the range to your own last row.

The exceptions log

Write down every value you changed.

A clean sheet with no history looks the same whether it was careful or lucky. Four columns are enough, and a month with nothing to record still gets a line.

A sample log. The entries are invented.
StatementRowWhat differedHow it was settled
2026-032026-03-25 · Shipping labelsDescription wrapped onto a second line in the PDF, and the file ran it into the next row.Read against the PDF; restored the description. No amount changed.
2026-022026-02-13 · Craft fair - stall feeDate read day-first by the spreadsheet on opening the file.Re-imported the column as text, then converted. The row was in order again.
2026-01—No change needed.Passed its own checks and joined to February. Logged so the next reader knows it was looked at.

Spreadsheet and converter

Which part of this the public beta covers.

The public beta runs for a limited time, on a best-effort basis, and the upload on the homepage says whether it is open right now. It takes a text-based PDF statement of up to 10 MB and 8 pages; scanned statements are refused. The full converter remains a private, invite-only beta. No separate DocShape account is required.

The steps above are spreadsheet work and apply to a CSV from any source. The beta covers the conversion of one statement, and nothing that spans statements.

Left to you, in a spreadsheet

  • The inventory and the tracker.
  • Joining one statement to the next, and noticing a missing or repeated month.
  • Stacking the files and adding the statement column.
  • The exceptions log, and the import.
  • Reading rows against the PDF.

What the public beta does today

  • Text-based PDF only.
  • One statement.
  • Up to 10 MB.
  • Up to 8 pages.
  • Checks that statement’s opening and closing balances, totals and running balances, exactly. How the checks work.
  • Returns an Excel workbook and a CSV with eleven fixed columns, one file per account. The CSV has no statement column; add your own when you stack.
  • Best effort, and scanned statements are refused.

A year of monthly statements is twelve conversions. Each one gets checked on its own, and the rest of the procedure is yours. If the folder holds scans, the beta will not take them, and the procedure applies unchanged to whatever produces the CSVs. Why a match is not the same as correct explains what the checks leave unsaid.