Skip to content
PreviewThe Windows download and the public source are in preparation. Request early access.
9300Use it

Import bank data

Bring in CSV and OFX files, tune the rules, sync a SimpleFIN feed, and reconcile to the statement.

Shipped9 min readChecked October 26, 2026

Importing is a review step, not a data-entry step. The parser, the duplicate check and the rules do the volume. You approve the proposals, and only then do balanced entries post.

Import a file

Open Import. You will see a saved import source for each bank or card account you have set up, and your recent batches with their status.

  1. Pick or create an import source. A source is a saved profile for one account. It remembers which columns hold the date, description and amount, so you map a CSV once and reuse it. Each source belongs to one entity and to the matching cash or card account in the chart of accounts.
  2. Upload the file. Export a CSV or OFX file from your bank and drop it on the upload area. Dates are normalized and amounts are read as exact decimals, never floats.
  3. Let the duplicate check run. The file as a whole and each row are checked against what you have already imported. Rows you already have are flagged already imported and skipped, so re-importing a file, or a file that overlaps the last one, never double-counts.
  4. Review the batch. Each row shows its proposed account, amount and a status: posted, already imported or needs account. Assign an account to anything unresolved and correct what the rules got wrong.
  5. Post the selected rows. Each approved row becomes a balanced journal entry with its source marked import. A batch that would not balance cannot post.

Once an entry is posted it is immutable. If an import was wrong, you reverse the entry; you do not edit it. See How double-entry is enforced.

Every entity has its own import sources, and entries land in whichever entity you are viewing.

Rules and review

Categorization rules propose the account for each transaction. A rule maps a recognized description to an account, the same way every time. You review and accept; nothing posts on its own.

For rows no rule covers, optional AI categorization can propose an account. It needs your own Anthropic key (see Bring your own API keys) and a host setting that selects the provider. Its proposals are suggestions in the same review screen, not decisions.

The accounts a rule can choose come from your chart of accounts, so set that up first. First-run setup picks a template.

One file, many accounts

Some banks export one OFX or QFX file that holds several accounts. Use Bulk Import for that. One upload creates one import run and a separate review batch for each account you confirm. It never combines transactions from different accounts.

  1. On Imports, choose Bulk Import and upload the OFX or QFX file.
  2. Review the account list. Each account shows a masked account number, kind, institution, currency, transaction count, dates and ending balance.
  3. Confirm the import profile for each account you want. An exact match is preselected. An unmatched or ambiguous account needs your choice; the system never guesses from an account number alone.
  4. Skip only the accounts you deliberately do not want to stage, then choose Import confirmed accounts once.
  5. Open each resulting batch, confirm its categories and post it on its own.

A problem in one account does not roll back the others. Staged batches are ready to review. A duplicate means that account from that file is already present, so open its existing batch. A skipped account created nothing; re-upload and map it when you are ready. For an unmapped or failed account, fix the profile choice or the file, then re-upload: accounts already staged are recognized as duplicates.

If the preview says the statement response failed, download a complete file from your bank again. A response error is never partly imported.

SimpleFIN bank feed

SimpleFIN pulls transactions from your bank on a schedule into the same review queue. It needs your own SimpleFIN Bridge access.

One Bridge connection grants every bank account you linked at SimpleFIN, so Ledger keeps one simplefin import source per bank account.

  1. On Import → SimpleFIN bank feed, open Link bank accounts. It lists what SimpleFIN returns, with balances only.
  2. For each account, choose the cash account it feeds and select Link. An account links once, and only an active, postable asset account in the current view can be chosen.
  3. Select Sync all now, or an account's own Sync button. New transactions are staged for review.

Nothing posts until you approve the batch, exactly as with an uploaded file.

Start dates prevent double imports, because a bank file and SimpleFIN give the same transaction different ids. An account's first sync starts a day before the latest transaction already imported for that cash account from files. Inside that boundary a SimpleFIN transaction is skipped only when a bank-file transaction has the same amount within a day, one for one. Later syncs overlap their last ten days, where SimpleFIN ids dedupe exactly. A day with nothing new creates no batch.

Each request stays within SimpleFIN's recommended 45-day window. If an account's file history ends earlier than that, the sync result names the uncovered dates, and you import one bank file to cover them. That gap is reported, not treated as a failure.

If your bank needs you to sign in again, SimpleFIN reports it as a notice next to otherwise stale data, and the panel shows the notice after a sync.

Server deployments can also run the sync on a schedule. It stages transactions for review; it never posts them. The access URL (SIMPLEFIN_ACCESS_URL) lives in the server environment or, in Preview, encrypted in Settings. It is never in the browser. Preview

Reconcile to the statement

Importing gets the transactions in. Reconciling proves the ledger agrees with the bank to the cent.

  1. Open Reconcile and pick a cash or card account.
  2. Enter the statement's ending balance. This is the target.
  3. Clear each line that appears on the statement. Only posted lines can be cleared, so post any draft first.
  4. Watch the difference between the statement ending balance and the cleared balance. Keep clearing until it reads exactly zero.
  5. When it does, the reconciliation locks. It records that on this statement date the books and the bank agreed.

A leftover difference points at a cause: a statement line you have not recorded, a ledger line the bank has not cleared yet, or a duplicate. Fix the cause. Never add an adjusting entry only to make the number disappear, because then the lock means nothing.

A locked reconciliation cannot be edited or deleted, and lines cannot be cleared or un-cleared in it. It can be reopened, and the reopening is audited. The database enforces that with trg_recon_lock_guard and trg_recon_line_guard. The close checklist asks for locked reconciliations, so this is the step before your first month-end close.

Reconcile each statement as it arrives. A month is a short job; a year at once is a catch-up project.

Import bank data | Analytical Ledger