Skip to main content

Import transactions from a CSV file

Bring a bank statement or a spreadsheet into a manual account: pick the account and the file, map the columns, review the values, then import. Every import can be undone.

Before you start

  • You need the Import and export permission. Without it the Import transactions item is not shown, and an import attempt is refused with Not allowed — Importing needs the Import and export permission.

  • Only manual accounts can receive an import. As the account field says: Manual accounts only. Connected bank accounts get their transactions from the bank. If you have no manual account yet, you can create one from inside the import window — this needs the Account management permission with View and edit.

  • Limits: up to 3,000 rows and 10 MB per file. A larger file is refused before anything is imported; split it and import it in parts.

  • A read-only workspace cannot import. After a trial ends or the last payment attempt fails, Import transactions is shown disabled with Read-only until you subscribe or switch to Free. While a payment is still being retried, an import stops with Payment required.

  • To prepare the file itself — encodings, dates and times, amounts, split transactions, bank exports — see Prepare your CSV file. A file exported from the transactions table imports back with every column recognised, including its planned rows, actual dates and split transactions.

Step 1 — Account and file

  1. On the Dashboard, open the ⋮ menu above the transactions table and choose Import transactions. On an empty dashboard, before the first account exists, the same menu sits in the page header so you can create the account from inside the import.

  2. Under Import into, choose the manual account. It is already selected for you in two cases: when the dashboard is filtered to exactly one manual account — the Account · is filter, or a card picked in the accounts overview — that account is preselected; otherwise, when the workspace has exactly one manual account, that one is. With two or more manual accounts and no such filter, the field shows Choose an account. To add one, click Create new manual account: the Create manual account window opens, enter Account name and Initial balance, and click Add account — the new account is selected for you and the import window stays open.

  3. Drag the CSV file into the box (Drag a CSV file here, or choose one from your computer) or click Choose file. Until an account is chosen the box says Choose an account first. The note under it reminds you of the limits: Up to 3,000 rows and 10 MB per file.

  4. Check the file card: it shows the file name, its size, and how many columns and rows were found. Encoding and Delimiter are detected from the file; change them here if the First rows preview shows garbled text or everything in one column. Choose another file replaces the file.

  5. Click Continue.

A file that cannot be used is refused on this step with one of these messages: {name} is not a CSV file, The file is larger than 10 MB, The file could not be read, The file is damaged: a quote opened on line N is never closed., The file has no transaction rows, or The file has N rows (more than 3,000). Each is explained in Prepare your CSV file.

Download template gives you a CSV named import-template-<account>.csv with the export's main columns — Date, Description, Amount, Currency, Type, Category, Counterparty — followed by your workspace's attributes, and 14 example rows that already use your own categories, counterparties and options, dated backwards from today so none of them is planned. Next to it, How to prepare a file opens the formatting guide, and Need help opens the support chat.

Step 2 — Map columns

  1. Under How is the amount written?, pick how your file records money. The option marked Suggested from the file is the one detected in your data:

    • Signed amount — One column. A minus means expense, anything else income.

    • Debit and credit — Two columns: money out and money in.

    • Amount and direction — An unsigned amount and a column that says which way it went.

    Two columns recognised as debit and credit suggest Debit and credit; a recognised direction column suggests Amount and direction; everything else suggests Signed amount — unless the file has a Type column and not a single amount carries a minus. Then Amount and direction is suggested and the Type column is used as the Direction.

  2. In Columns in the file, each column of your file shows its header, an Example value and an Import as picker. Columns are recognised automatically when their header matches the export's column names in any of the app's languages, an attribute of your workspace, or a common bank header. A column nothing recognised shows + Select attribute: open the picker and choose a field — Date, Actual date, Description, Category, Counterparty and the amount fields of the chosen layout — one of your attributes, or Do not import. The list has a Search field; a target another column already holds is greyed out with Already used by {column}. In the Preview, a column that will not be imported has its header struck through. On a phone, Import as comes right after the header, before Example, so the picker is in view without scrolling sideways.

  3. Three columns are checked rather than imported, and are shown with a tag instead of a picker:

    • Currency — Checked against the account, not imported.

    • Type — Transfer rows will be skipped. With Amount and direction the Type column gets a picker instead: choose Direction to use its Income / Expense words as the direction, or Type only: transfers are skipped to keep it as a check only.

    • Status — Planned rows are imported as planned.

    The export's Account and Created by columns are set to Do not import automatically.

  4. The Preview shows the first 5 rows as they will be imported.

  5. Click Continue. The button is available once a date column and a complete amount are mapped; otherwise the message above the table says what is still missing: To continue, map a date column and a complete amount., To continue, map a date column. or To continue, map a complete amount.

To add an attribute that does not exist yet, choose Create new attribute at the bottom of the Import as list — this needs the Data schema changes permission; without it the row reads Creating attributes needs the Data schema changes permission. The attribute window opens with the file column's header already filled in as the name, and Income and Expense ticked — the import never creates transfers. When you save, the column is mapped to the new attribute, and the attribute is made visible in your transactions table.

Step 3 — Review

Check the values — the list on the left of the window, or a row of sections you scroll sideways on a phone — shows what needs a look: the date, actual date, amount and direction columns, each category, counterparty and select-attribute column, Split transactions when the file has any, attribute columns with values that cannot be read, Invalid rows and Summary. Each item names the Vault field and, when it differs, the file's own column header underneath. A number badge shows how many values or rows need attention.

Date

Choose the Date format read from your file: ISO (2026-09-24), European (24.09.2026) or American (09/24/2026). The one marked Suggested was detected. When every date in the column reads both ways, nothing is preselected and the panel says Every date in this column reads both ways. Confirm the format before continuing. The table shows each value In the file and how it is Read as; a value that cannot be read shows Not a date.

A date may carry a time. Read as then shows the day and the time, for example 2026-09-24 10:15. A time without a time zone is taken as wall-clock time in your workspace's time zone. A time with a time zone, such as Z or +02:00, is converted to your workspace's time zone, and the row takes the day it lands on there: 2026-09-24T23:30Z in a Europe/Vienna workspace becomes 2026-09-25 01:30. Such rows are marked from {value in the file} next to the result, so a shifted day is never applied silently. A date without a time is stored at noon in your workspace's time zone.

Actual date

Shown only when a column is mapped as Actual date: A single date or a period, «from - to», read with the date format chosen for the Date column. A date without a time is taken at noon. A period reads as start - end, each end with its time. A value that is neither a date nor a period shows Cannot be read as a date or a period; such rows are still imported with the actual date left empty, and the panel says so: N actual dates could not be read and will be left empty, with Examples.

A period written with its start after its end is listed under N rows have a reversed actual period: the start is after the end. One choice applies to all of them — under What to do with these rows pick:

  • Swap the dates (preselected) — The earlier one becomes the start. Almost always a typo.

  • Import without the actual date — The row is imported; the field stays empty.

  • Skip these rows — The rows are not imported. They move to Invalid rows with the reason Reversed actual period.

Amount

Choose the Decimal separator, Dot (1,234.50) or Comma (1.234,50), again with a Suggested choice and a table of how each amount is read. When the column reads both ways the panel says The amounts in this column read both ways. Confirm the decimal separator before continuing.

With Signed amount and no negative value anywhere, the panel warns: No amount in this column is negative — all N rows would become income. Is the direction in another column?

With Signed amount and a Type column in the file, a row whose sign disagrees with its Type word — a minus on a row that says Income, or no minus on a row that says Expense — is a conflict. The panel lists them under N rows have a sign that contradicts their Type, with the note Choose one rule for all of them. The import waits until you do. Under Which is right? pick one:

  • Follow the sign — A minus is an expense, no minus is income. The Type word is ignored for these rows.

  • Follow the Type column — The Type word decides. The sign of these rows is corrected to match it.

Until you choose, the panel says Pick a rule to continue. and Import stays off.

Direction

Shown only with Amount and direction. Direction values lists each distinct value of your direction column with its Rows and what it Means: Income or Expense. Common words are assigned for you; any other value shows Choose an option and Not mapped — its rows are invalid until you assign it. A signed amount that disagrees with the direction column is listed under N rows have a sign that contradicts the direction — They will be imported by the direction column. Review them before continuing.

Category, Counterparty and select attributes

Each distinct value in the file is a row of the table: Value in the file, how many Rows use it, its Type — Income or Expense, because the same name can exist as an income option and as an expense option — and what it is Imported as. On a phone, Imported as comes second, right after the value, so the picker is in view without scrolling sideways.

The Imported as cell is a picker. Its list holds the existing options valid for that side — each with its colour, a child option shown as Parent / Child — and then the actions: Create «{value}» for a value nothing matches, or Restore «{value}» for a value that matches an archived option, and Skip. The cell shows the current state:

  • a coloured chip with the option's name — the value matched an existing option, or you mapped it to one;

  • + Create «{value}» — a new option will be created;

  • Restore «{value}» with the Archived badge — the archived option is brought back and used;

  • Skip — the rows are imported without this value;

  • Choose an option — nothing is decided yet;

  • Matches N options — choose one — the value matches several options and you pick one.

A value written as Parent / Child is matched as the child option under that parent. If it has to be created, it is created as a child under the existing parent of that name; when no such parent exists, the parent is created too.

Create missing options at the top of the panel is on by default when you may create options; the note under it counts the values with no match. Switch it off to decide value by value. A value that matches an archived option is never created a second time. Without the Data schema changes permission the panel says Creating options needs the Data schema changes permission. Map or skip the value instead. When the list has nothing to offer, it says so — No income categories yet, No options yet and so on.

An attribute value on a row of a side the attribute does not apply to is left empty, and the panel says so: N values in {column} will be left empty: {attribute} does not apply to income rows (or expense rows).

Split transactions

Shown when the file carries split cells — the form a Vault export writes: Food (400.00); Insurance (600.00). The parts are restored with their categories, counterparties and attribute values, and each part's label is decided on its column's own page like any other value.

The panel lists the restored splits under Restored: N split transactions, N parts — one line per part with its Amount and Part values. Each value shows what the part becomes: the option it maps to (Fuel → Rent when it differs from the file's label), + Create «{value}», Restore «{value}», Empty, or Choose an option while undecided.

A split that cannot be restored is imported as one transaction without the split. The panel says N split transactions cannot be restored and will be imported without the split and lists each row with its Reason: The columns list different numbers of parts, The part amounts differ between the columns, The parts do not sum to the amount, A part cannot be read as the column's value, or An option name in this workspace contains the separator. Under Value for these rows there is one line per split column and side; its picker offers Empty (preselected) and the existing options valid for those rows. Nothing is created from the cell.

Attribute columns that cannot be read

A number, checkbox or timestamp attribute column with values its type cannot read gets its own item: N values in {column} could not be read as {type} and will be left empty, with Examples. The rows themselves are still imported.

Invalid rows

Rows that will be skipped, each with its Row number, its Reason and the row's own values: These rows are skipped. Fix them in the file and import it again to include them. A row with more or fewer fields than the header is listed with the reason N fields, the header has N and its raw text, because its cells cannot be lined up with the columns. The full list of reasons is in Prepare your CSV file.

Summary

N rows will be imported, then the skipped rows with each reason and its count, the Income and Expense totals with their row counts, and the notices that apply:

  • N rows are dated in the future — They become planned transactions and do not change the balance.

  • N planned rows will be created as one-off planned transactions, not as a repeating series. — The Status column says Planned. These rows do not change the balance, whatever their date.

  • N split transactions restored, N parts, and how many of them are planned.

  • N split transactions cannot be restored and will be imported without the split

  • N actual dates could not be read and will be left empty

  • The outcome of the reversed-period choice.

  • Attribute values that could not be read, or will be left empty.

  • The balance choice described below.

Rows dated in the future, and planned rows

Two things make an imported row a planned transaction:

  • Its date is after today in your workspace's time zone.

  • The file's Status column says Planned — the word the export writes, in any of the app's languages. Such a row is created as a planned transaction whatever its date, past dates included.

Every planned row is created as a one-off planned transaction, never as a repeating series — a recurring series you exported comes back as the individual occurrences that were in the file. Planned rows do not change the balance.

The account balance choice

When the account already has a balance other than zero, the summary shows Account balance with two options and the note Choose one to import. Import stays off until you choose.

  • Keep current balance — History is filled in; today's balance stays the same. Use this when the account balance is already right — for example, you entered it when you created the account — and the file is the history behind it.

  • Add to current balance — The imported total moves the balance. Use this when the balance does not yet include these transactions.

Each option shows the balance you will have after the import. Rows dated in the future and rows marked Planned do not move the balance in either case.

Worked example. The account has a balance of $1,000.00. The file has 6 rows to import: 2 income rows totalling +$6,000.00 and 4 expense rows totalling −$1,714.36, one of which (−$320.00) is dated in the future.

Choice

Balance after import

Why

Keep current balance

$1,000.00

The history is written; the balance is left where it is.

Add to current balance

$5,605.64

$1,000.00 + $6,000.00 − $1,714.36, plus $320.00 back because the future row does not count yet.

Import, and undo

  1. Click Import. The window shows Importing N rows… with the note Keep this window open. and cannot be closed while it runs. Nothing is written until the whole file has been checked; if any row is refused, nothing is written at all.

  2. When it finishes, the window closes and a message appears: Imported N transactions, with an Undo import button beside it.

Undo lives only on that message. It stays on screen until you use it or close it. Once the message is gone there is no other place to undo the import — you would remove the transactions by hand.

Undo import removes the transactions the import created, together with their split parts, and takes their effect out of the account balance, including the adjustment made by Keep current balance. Transactions you added after the import are not touched; imported rows you edited are still removed. Categories, counterparties or attribute options created or restored for the import stay in the workspace. When it is done you see Import undone.

If the import stops with an error, Try again repeats the same attempt — options already created by the first attempt are reused, not created again.

Importing the same file twice

If you import a file that was already imported into the same account, the import stops and asks: This file was already imported — It went into {account} on {date}. Import it again? Choose Cancel to stop, or Import again to import it once more. An import that was undone does not trigger this question.

Limits

Limit

Value

What happens above it

Rows per file

3,000

The file has N rows — One import takes up to 3,000 rows. Split the file and import it in parts.

File size

10 MB

The file is larger than 10 MB — Split the file and import it in parts.

Values or invalid rows in one review table

200

Showing the first 200 of N rows; the rest are still imported or skipped by the same rules.

Restored splits listed

50

Showing the first 50 of N; the rest are still restored.

Who can do what

Action

Needs

See Import transactions and run an import or an undo

The Import and export permission

Create new manual account from the import window

The Account management permission with View and edit

Create missing options, Create «…», Restore «…», Create new attribute

The Data schema changes permission; without it you can still map a value to an existing option or Skip it

Import in a read-only workspace

Not possible: the item is disabled until you subscribe or switch to Free. While a payment is still being retried, an import stops with Payment required, and owners and admins get a Manage billing button

Did this answer your question?