Skip to content
WealthMgr Docs

CSV Import

WealthMgr can bulk-import transactions from a CSV file. Imports run entirely in your browser against your local database, using the same write path as manually adding a transaction — including duplicate detection and your active automation rules. Nothing leaves your device until sync stores it (paid plans only).

Open the Import Transactions page while signed in.

Supported file format

The importer accepts CSV files only. It does not support OFX, QFX, QIF, or other bank export formats, and WealthMgr does not connect to your bank or aggregate accounts. If your bank only exports OFX or QFX, convert it to CSV first with a tool like ofxstatement.

Your file needs a header row — the first row is read as column names. Completely empty rows are skipped during parsing.

Column mapping

Pick a CSV column for each transaction field WealthMgr understands:

FieldRequiredNotes
DateYesSee accepted date formats below.
AmountYesA plain number, e.g. 1234.56. See the warning below.
DescriptionYesFree text.
CategoryNoAdded as a tag on the transaction.
TagsNoComma-separated; merged with the category, duplicates removed.
CurrencyNoISO currency code (case-insensitive). Falls back to your primary currency when unmapped or blank.
From AccountNoAccount name; see Default accounts below. Silence here means a deposit — see “Deposits without a source” below.
To AccountNoAccount name; see Default accounts below.

When you select a file, WealthMgr auto-maps any column whose name matches a field after normalizing it — lowercased with non-letter characters stripped. So Date, date, and DATE all auto-map, and From Account maps to the From Account field. Anything not auto-mapped you can choose manually.

Warning

Amounts are read under the numeric convention the import page states in its banner: dot-as-decimal with comma thousands (e.g. `1,234.56`) by default, or comma-as-decimal with dot thousands (e.g. `1.234,56`) when your app language works that way (WEA-430). Cells that contradict both readings fail the row — nothing is silently truncated. Files exported by WealthMgr are always read dot-decimal. If your bank's CSV uses the opposite convention from your app language, switch the app language for the import or convert the amount column in your spreadsheet first.

Accepted date formats

  • YYYY-MM-DD (also 2026-1-5; output is always padded)
  • Slash dates MM/DD/YYYY or DD/MM/YYYY — when the first number is greater than 12 it is read as the day, otherwise the first number is taken as the month. If your bank uses a day-first file with ambiguous dates, export to YYYY-MM-DD instead.
  • Anything else (e.g. Jan 5, 2026) fails validation — the row is reported as an error with Invalid date format and nothing else changes.

Default accounts

Every transaction is recorded as a move of money from one account (From) to another (To). Select a default To account on the import page — it is required before the Import button enables. The default From account is optional: money coming in with no source is a deposit, and deposits never need one (see below). A default applies to every row whose own account column is not mapped.

When you do map a From or To Account column, per-row values take over:

  • A row with a blank cell in a mapped To column imports with that leg left empty — it shows up on the Review page as an incomplete transaction for you to finish, rather than silently going to the default. A blank From cell instead reads as a deposit (see below).
  • An account name is matched against your existing accounts by name (trimmed and case-insensitive). An unknown name is not guessed: the row still imports without that leg, and a notice such as Account "…" not found — imported without that account; complete it on the Review page appears in the Import Summary.

Deposits without a source

A row with a positive amount whose destination resolves but whose source is simply absent — no From column mapped and no default chosen, or a blank From cell — is money arriving without an issuer. WealthMgr books it from a default “Other income” account, created automatically the first time an import hits such a row. Each of these rows carries the notice No source account — booked from the default "Other income" source in the Import Summary so nothing is silently invented for you.

If you already have an income account — a source in Categories wording (see Categories and accounts) — you use for these deposits, rename the “Other income” account or pick it as the default From account instead — future imports follow your choice. Rows whose From leg you named but that didn’t match any account are never rerouted to “Other income”; they stay on the Review page for you to complete, and negative or zero amounts likewise stay incomplete.

Currency and cross-currency legs

The Amount is booked on the source (From) leg in the row’s currency. When a row’s destination account has a different currency, WealthMgr converts the destination amount at a live exchange rate — the same pricing path the manual add form uses — so the destination account is never credited at face value in the wrong currency.

Each currency pair is looked up at most once per import run. If a rate cannot be resolved, only that row fails, with an error naming the pair; the rest of the file continues.

Your automation (categorization) rules apply to imported transactions just as they do to manually added ones — a rule can complete the From or To leg based on the row’s description and accounts.

Duplicates

Before writing each row, the importer checks your existing transactions:

  • Exact duplicate — an existing transaction on the same date with the same amount and currency that shares an account leg is skipped and counted under “Skipped (duplicates)“. It is not written twice.
  • Possible duplicate — an existing transaction on the same date with the same amount, but otherwise different, is still imported, and is flagged in the summary and paired on the Review page so you can merge or dismiss it.

Running the import

  1. Select the CSV file.
  2. Confirm the column mapping — required fields must be mapped to continue.
  3. Choose the default To account — and optionally a default From account (deposit rows without a source don't need one).
  4. Check the preview table (first 10 rows).
  5. Click Import. A progress bar tracks rows as they are written.
  6. Review the Import Summary: imported count, skipped duplicates, notices, and per-row errors with their row numbers.

Rows that fail validation or the write path are listed as errors and are not imported; valid rows still go through, so you can fix a failed export and re-run only the bad rows — exact duplicates from the first pass will be skipped on the second.

Limits

  • Plan transaction limits apply: if you hit your plan’s cap mid-import, that row and the remaining rows are reported as errors and the run stops.
  • There is no fixed row-count or file-size cap in the importer itself — it processes the file row by row in your browser.

Exporting transactions to CSV

The Transactions page has an Export button next to Import. It downloads your transactions as a CSV file named transactions-YYYY-MM-DD.csv. The export is the symmetric counterpart of the importer: it is filter-aware, so the file contains exactly the rows matching your active filters — account, pocket, tags, search text, and date range — with account names instead of internal IDs, ready to open in a spreadsheet or re-import.

Info

For a full-database backup rather than transaction rows, use **Export database (.sql)** on the **Configuration** page. In that dump a liability's stored balance is the NEGATIVE amount owed (WEA-249 / D11: owing 500 is `-500.00`, so net worth is the plain sum of balances); every export carries the stamp `-- balance-convention: negative-owed-v1 (WEA-249)`, and the restore importer rejects dumps containing liabilities without it, so a pre-flip export can never silently flip your debt signs on re-import.