Skip to content

Upload a bank statement

Who does this: Bookkeeper · Senior Accountant · Platform Admin When: The client has sent you their monthly bank statement and you're starting a reconciliation cycle for that period Result: The statement is uploaded and parsed. Each transaction lands as a row in a new reconciliation run with status PENDING, ready for the matcher to run against journal entries in the same period.

A bank statement is the trigger for a reconciliation run. The platform parses the statement (PDF or CSV), extracts each transaction line, and creates a ReconciliationRun in PENDING. From there you run the matcher, confirm proposed matches, and dispatch any unreconciled items to the client for supporting documentation.

TIP

Name the file with the bank and period before you upload — "UOB Current 2026-04.pdf", "DBS SGD Savings 2026-04.csv". The platform extracts the bank reference and period from the file content, not the filename, but a clean filename makes the exception queue and the activity log readable later.

Before you start

  • [ ] You have the statement file. CSV parses most reliably — ask the client to download CSV from their internet banking before resorting to PDF if there's a choice.
  • [ ] The client has the BOOKKEEPING product enabled and a base currency set on the client record. (If not, see Onboard a bookkeeping client.)
  • [ ] You know the bank account reference the statement is for (e.g. "UOB Current", "DBS Multiplier") — this becomes the run's display label.
  • [ ] You have RECONCILE_BANK_TXN permission — Bookkeeper, Senior Accountant, or Platform Admin.

Steps

1. Open the client's bookkeeping page

  1. Open Clients in the staff dashboard sidebar.
  2. Find the client and click into the detail page.
  3. Open the Bookkeeping tab.

2. Start a new statement upload

  1. In the Bank reconciliations panel, click Upload bank statement.
  2. In the dialog, fill in:
    • Bank account reference — short label, e.g. "UOB Current".
    • Period start / Period end — the date range the statement covers, in YYYY-MM-DD.
    • File — drop the PDF or CSV in.
  3. Click Upload.

The file uploads to storage. The dialog closes with a confirmation toast and a new entry appears under Bank statements with status Pending parse.

3. Trigger the parser

  1. Open the new statement row.
  2. Click Parse.

Parsing runs in the background. For a CSV with a recognised header layout it usually completes in a few seconds; PDFs go through OCR first and can take 30–60 seconds per page.

While parsing, the row's status moves through Parsing to one of:

  • Parsed — the parser extracted transactions cleanly. You'll see a transaction count.
  • Failed — the parser couldn't read the file. See Bank statement won't parse for the usual causes.

4. Open the resulting reconciliation run

When parsing succeeds, the platform automatically creates a ReconciliationRun in PENDING, linked to this statement. You'll see the run appear under Bank reconciliations in the sidebar.

  1. Open Bank reconciliations in the sidebar.
  2. Find the new run for this client and period.
  3. Click View to open the run detail.

The run detail shows every transaction the parser extracted: date, description, debit / credit amount, currency. It will show 0 matched, 0 proposed, 0 unreconciled until you actually run the matcher — that's the next runbook.

How to know it worked

  • The statement row in the Bookkeeping tab reads Parsed with a transaction count.
  • A new reconciliation run with status PENDING appears under Bank reconciliations in the sidebar, linked to the statement and bearing the bank account reference and period you set.
  • The activity log shows bank_statement.uploaded and bank_statement.parsed, attributed to you.
  • If a transaction was in a currency other than the client's base currency, the parser flags those rows on the run detail — easy to spot before you run the matcher.

What the client sees

Nothing for this step. Uploading a statement is purely an internal action. The client only gets contacted later if, after the matcher runs, there are unreconciled transactions that need supporting documents — and that contact happens explicitly when you click Dispatch unreconciled on the run, not as a side effect of the upload.

Common situations

If you see…It means…What to do
Upload bank statement button is missingThe client doesn't have the BOOKKEEPING product enabledEnable it — see Onboard a bookkeeping client step 2
Parser status sticks at Parsing for more than 5 minutesThe OCR pipeline may be backed upSee OCR failing runbook
Parser fails on a PDFMost common: the PDF is a scanned image without a text layer, or has multi-column layout the parser can't disambiguateSee Bank statement won't parse — usually fixed by asking the client for the CSV instead
Parser succeeds but transaction count is much lower than expectedMulti-page statement with one page that didn't OCR cleanlyCheck page-by-page; if one page is bad, ask the client for that page in CSV form and stitch it manually
Currency on transactions is not the client's base currencyThe bank account is foreign-currency or multi-currencyThis is fine — the matcher handles non-base-currency reconciliations, but each transaction will carry the NON_BASE_CURRENCY flag for visibility
The wrong statement was uploaded for the wrong clientUpload landed under the wrong client recordOpen the run, click Cancel run (Senior Accountant only). The statement remains in the activity log for the audit trail. Re-upload under the correct client.

Internal use only — BreezyCorp