The file
Format. A text file whose name ends in .csv or .txt, with one header line followed by one line per transaction. Anything else is refused with {name} is not a CSV file.
Size and length. Up to 10 MB and up to 3,000 rows per file. The size is checked before the file is even read. A file with a header and no rows is refused (The file has no transaction rows).
Encoding. UTF-8 (with or without a byte-order mark) and UTF-16 (with a byte-order mark) are read as they are. A file in a single-byte encoding is read as Windows-1252 (Western European) or Windows-1251 (Cyrillic), whichever fits the text better. If the First rows preview in step 1 shows garbled characters, change Encoding there. When no encoding produces readable text you see The file could not be read.
Delimiter. Comma, Semicolon, Tab or Vertical bar. The import picks the one that appears the same number of times on every line — so a German file with semicolons between fields and commas inside amounts is read correctly. When nothing settles it, comma is assumed; change Delimiter in step 1 if the preview shows one wide column.
Quoting. Fields may be wrapped in double quotes, which lets a field contain the delimiter, a line break, or a quote written twice. Windows and Unix line endings both work, and blank lines are ignored.
A quote that is never closed refuses the whole file. Everything after it would read as one value, so the import stops with The file is damaged: a quote opened on line N is never closed. The line number counts every line of the file, header and blank lines included.
Rows with the wrong number of fields are skipped, never repaired. A row with more or fewer fields than the header cannot be lined up with the columns, so it is not padded or cut. It goes to Invalid rows with the reason N fields, the header has N and its raw text, and the rest of the file imports normally.
Columns the import understands
Every column of the file is mapped in step 2. Headers are recognised automatically when they match one of these; anything else you map by hand from the + Select attribute picker.
Column | Recognised headers | Notes |
Date | Date (the export's column name, in any of the app's languages), plus the bank headers below | Required. A date may carry a time. |
Actual date | Actual Date | Optional. A single date or a period. |
Description | Description | Optional |
Amount, or Debit + Credit, or Amount + Direction | Amount, plus the bank headers below | One complete amount is required |
Category | Category | Optional |
Counterparty | Counterparty | Optional |
Currency | Currency | Checked against the account only — Checked against the account, not imported |
Type | Type | Skips transfers — Transfer rows will be skipped; can also serve as the direction |
Status | Status | Marks planned rows — Planned rows are imported as planned |
A custom attribute | The attribute's name in your workspace | Optional |
Account, Created by | The export's other columns | Set to Do not import automatically |
The app's own column names and your attribute names take precedence over bank headers. When two columns of a file suggest the same target — a statement with both a booking date and a value date — the more reliable one is mapped and the other is left unmapped for you to decide. A recognised header is only a suggestion: you can change every mapping.
Dates and times
Choose one format for the whole file in step 3 (Date format). The one marked Suggested is what the import detected.
Format | Example | Also accepted |
ISO | 2026-09-24 | 2026/09/24, 2026.09.24, a trailing time such as 2026-09-24T10:15 or 2026-09-24 10:15:00 |
European | 24.09.2026 | 24-09-2026, 24/09/2026, one-digit day or month, a two-digit year, a trailing time such as 24.09.2026 10:15:00 |
American | 09/24/2026 | The same variations, month first |
Times. After the day, a time may follow, separated by T or a space: hours and minutes, optional seconds, and an optional time zone — Z or an offset such as +02:00. Anything else after the day makes the value unreadable.
A date without a time is stored at noon in your workspace's time zone.
A time without a time zone is taken as wall-clock time in your workspace's time zone, exactly as written.
A time with a time zone is converted to your workspace's time zone, and the row belongs to the day it lands on there. 2026-09-24T23:30Z in a Europe/Vienna workspace is 2026-09-25 01:30: the row is dated 25 September. Step 3 shows such a row as 2026-09-25 01:30 with from 2026-09-24T23:30Z next to it, so a shifted day is visible before you import.
A two-digit year is read as 20xx. A two-digit year that lands more than one year ahead of today is refused as Two-digit year more than a year ahead — 15.03.98 is not a plan for 2098.
How the format is chosen. A four-digit first part means ISO; any first part above 12 settles day-first (European); any second part above 12 settles month-first (American). If every date in the column is 12 or below in both positions, the column reads both ways: nothing is preselected, European is suggested, and you must confirm before continuing (Every date in this column reads both ways. Confirm the format before continuing.).
Impossible days (31 February) and values no format can read show as Not a date in the preview and skip the row as Unreadable date.
A date after today, in the workspace's time zone, makes the row a planned transaction that does not change the balance.
Actual date
Map a column as Actual date to import the date or period that the Vault table shows next to the transaction 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 single date, with or without a time, read exactly like the Date column — same format, same time and time-zone rules.
A period: two dates separated by a hyphen with a space on both sides — 2026-03-01 - 2026-03-31, or with times, 2026-03-01 09:00 - 2026-03-01 17:00. The hyphens inside an ISO date and the minus of a time-zone offset do not split the value, because they have no space on one side. Two ends that are the same moment are a single date; more than two parts is unreadable.
A reversed period — the start after the end — is not skipped by itself. Step 3 lists these rows and asks for one choice for all of them: Swap the dates (the default), Import without the actual date, or Skip these rows (reason Reversed actual period).
An unreadable value does not cost the row: the transaction is imported with its actual date left empty, and step 3 counts it — N actual dates could not be read and will be left empty, with Examples.
Status
A column recognised as Status marks planned rows. A cell that says Planned, in any of the app's languages, makes that row a one-off planned transaction, whatever its date — a planned row from last month stays planned, dated last month. Any other value, such as Posted, leaves the row as an ordinary transaction, unless its date is in the future, which makes it planned anyway. The Status column can only add planned status, never remove it. Planned rows never change the balance.
Amounts
Three layouts
Pick the layout in step 2 under How is the amount written? The import suggests the one it detected.
Signed amount — one column. A minus means expense, anything else income.
In the file | Read as |
-1250.00 | Expense 1,250.00 |
1800.00 or +1800.00 | Income 1,800.00 |
120,50- (trailing minus) | Expense 120.50 |
(120,50) (parentheses) | Expense 120.50 |
−59,99 (typographic minus) | Expense 59.99 |
€ 12.50 or 12.50 EUR | Income 12.50 — a currency symbol or code at either end is ignored |
If no value in the column is negative, step 3 warns: No amount in this column is negative — all N rows would become income. Is the direction in another column?
Debit and credit — two columns, Debit (money out) and Credit (money in). Which column is filled decides the direction; the number itself is read as a magnitude.
Debit | Credit | Read as |
850,00 |
| Expense 850.00 |
-120,50 |
| Expense 120.50 — a minus on a debit is still money out |
| 3.250,00 | Income 3,250.00 |
12,34 | 12,34 | Skipped — Debit and credit both filled |
|
| Skipped — Debit and credit both empty |
| -10,00 | Skipped — Negative amount in the credit column |
Amount and direction — an unsigned amount plus a column that says which way the money went.
Amount | Direction | Read as |
42,37 | S | Expense 42.37 |
3250,00 | H | Income 3,250.00 |
15,00 | Debit | Expense 15.00 |
-30,00 | H | Income 30.00 — the direction column wins; step 3 lists the row under N rows have a sign that contradicts the direction |
These direction words are recognised without any setup, in either letter case: S / H, Soll / Haben, Debit / Credit, Dr / Cr, Expense / Income, Расход / Доход, Витрата / Дохід. Any other word appears in the Direction panel of step 3 for you to assign to Income or Expense; until you do, its rows are invalid (Not mapped — its rows are invalid).
The Type column as the direction
A Type column — the export's own, with the words Income, Expense and Transfer — always skips transfer rows. Beyond that it can play two roles:
With Amount and direction it can be the direction column: in step 2 its picker offers Direction or Type only: transfers are skipped. When a file has a Type column and not a single amount carries a minus, this is suggested for you.
With Signed amount the sign decides, and the Type word is checked against it. A row where they disagree — a minus beside Income, or no minus beside Expense — is a conflict. Step 3 lists them under N rows have a sign that contradicts their Type and asks Which is right?: Follow the sign or Follow the Type column. Import stays off until you pick one.
Decimal and thousands separators
Choose the Decimal separator in step 3: Dot (1,234.50) or Comma (1.234,50). The import suggests one from the values: a number with both separators, or a separator followed by one or two digits, settles it. A column where every separator is followed by exactly three digits (1,250) reads both ways — nothing is preselected and you must confirm (The amounts in this column read both ways. Confirm the decimal separator before continuing.).
The other separator, spaces, non-breaking spaces and apostrophes are treated as thousands separators and removed — 1 250,00, 1'250.00 and 1.250,00 all read as 1,250.00. Thousands groups must be groups of three: under a dot decimal, 84,37 is not a valid number and the row is skipped as Unreadable amount rather than read as 8,437.
A value with more decimals than the account's currency allows is skipped (More decimals than USD allows). A zero amount is skipped (Zero amount). An empty amount is skipped (No amount).
Currency
The amounts are imported in the currency of the account you chose. A Currency column in the file is only checked: a row whose code differs from the account's currency is skipped with the reason {currency} — account is in {account currency}.
If the account's currency differs from the workspace currency, an exchange rate must exist for each day in the file. A day without one skips its rows (No exchange rate for {currency} on {date}). If the rates cannot be loaded at all, step 3 shows Exchange rates could not be loaded with a Try again button, and Import stays off until they load.
Categories, counterparties and select attributes
Values in a Category, Counterparty or select-type attribute column are matched against the options already in your workspace, ignoring letter case and extra spaces. Matching is per side: an income category and an expense category with the same name are different options, and a select option enabled for expenses only is not a match for an income row.
In step 3 every distinct value shows what it is Imported as. The cell is a picker whose list holds the existing options for that side, then the actions that apply:
What you see | Meaning |
A coloured chip with an option name | The value matched an existing option, or you mapped it to one |
+ Create «{value}» | A new option will be created with that name |
Restore «{value}» with the Archived badge | The value matches an archived option — it is brought back instead of a duplicate being created |
Skip | The rows are imported without this value |
Choose an option | Nothing is decided yet; pick an option from the list, or an action |
Matches N options — choose one | The value matches more than one option; you pick which |
Parent / Child. A value written as Travel / Hotel is matched as the child option Hotel under the parent Travel. If it is created, it becomes a child of the existing parent of that name — and when no such parent exists, the parent is created too. If a value could mean two different options, it is ambiguous and you choose.
Create missing options at the top of the panel is on by default when you may create options; it sets every unmatched value to be created. Switch it off to decide value by value.
A value that matches an archived option is never created a second time. An archived child whose parent is archived too offers no Restore here — restore the parent first.
A label used on both income and expense rows becomes one option that applies to both.
Without the Data schema changes permission you cannot create or restore: the panel says Creating options needs the Data schema changes permission. Map or skip the value instead.
For a multi-select attribute, separate several values in one cell with a comma or a semicolon.
A leading apostrophe before =, +, - or @ — the guard a spreadsheet export adds — is removed from descriptions, labels and text attributes.
Split transactions
A file exported from Vault writes a split transaction's category, counterparty and attribute cells as the parts, in order: Food (400.00); Insurance (600.00). Each part is the value, a space, and the part's amount in brackets — without a sign, with the account currency's decimals (120.00 for USD, 120 for JPY) — and the parts are separated by a semicolon and a space. An empty part is written as Not selected in the file's language. A column the split does not carry keeps one ordinary value for the whole row.
To bring a split back on import, keep those cells exactly as exported: the same number of parts in every split column of the row, the same amounts in the same order, and the parts adding up to the row's amount. A value that merely contains brackets, such as Tax (2026), is an ordinary value, not a split. Each part's label is decided on its column's own page of step 3, exactly like any other value. The transaction itself carries no category or counterparty of its own — the parts do.
A split that cannot be restored is imported as one transaction without the split. The Split transactions page of step 3 says why:
Reason | Meaning |
The columns list different numbers of parts | One split column has two parts, another three |
The part amounts differ between the columns | The same position carries different amounts in two columns |
The parts do not sum to the amount | The parts add up to something other than the row's amount |
A part cannot be read as the column's value | A part of a number, checkbox or timestamp attribute is not a valid value |
An option name in this workspace contains the separator | One of your own option names in that column contains ; — or , for a multi-select attribute — so the cell cannot be split safely |
For such rows you choose, per split column and side, an existing value for all of them or Empty — the default. Nothing is created from the cell. A planned split row comes back as its own one-off planned split, not as part of a series. Undo removes the imported transactions together with their parts.
Number, checkbox and date attributes
Attribute type | What is read | Example |
Number | A number, using the decimal separator chosen in step 3 | 1.250,50 → 1250.50 |
Checkbox | true, yes, y, 1, да, так → checked; false, no, n, 0, нет, ні → unchecked | Yes |
Timestamp | YYYY-MM-DD HH:MM in the workspace's time zone, a full timestamp with its own time zone, or a date alone (read as noon) | 2026-09-24 10:15 |
Text | The text of the cell, with surrounding spaces removed |
|
A value that cannot be read as the attribute's type is left empty on that row; the row itself is still imported. Step 3 lists such columns — N values in {column} could not be read as {type} and will be left empty, with Examples. Values of an attribute that does not apply to the row's type — an expense-only attribute on an income row — are also left empty: N values in {column} will be left empty: {attribute} does not apply to income rows.
Transfers are not imported
A row whose Type column says Transfer, in any of the app's languages, is skipped. It appears under Invalid rows with the reason Transfer.
Bank exports
The headers below are recognised as they come out of the bank's CSV export. Letter case, spaces, umlaut spelling (Währung and Waehrung are the same) and a trailing currency such as (EUR) or in EUR do not matter. Only whole headers match — Betragsart is not Betrag.
Bank | Date | Amount | Description | Counterparty | Other |
Sparkasse (CSV-CAMT) | Buchungstag (Valutadatum only when there is no booking date) | Betrag; older exports Soll / Haben or an S/H column | Verwendungszweck (Buchungstext only when there is no Verwendungszweck) | Beguenstigter/Zahlungspflichtiger | Waehrung → Currency; Kategorie → Category |
Volksbank | Buchungstag (Valuta as the fallback) | Soll / Haben, or S/H / Soll/Haben as the direction | Verwendungszweck | Name Zahlungsbeteiligter | Waehrung → Currency |
DKB | Buchungstag | Betrag (EUR) | Verwendungszweck | Zahlungsempfaenger, Zahlungspflichtiger |
|
Commerzbank | Buchungsdatum |
|
| Auftraggeber, Beguenstigter |
|
ING | Buchung (Wertstellung as the fallback) | Betrag | Verwendungszweck | Auftraggeber/Empfaenger |
|
N26 | Buchungsdatum |
|
| Empfaenger | Kategorie → Category |
comdirect | Datum (Wertstellung as the fallback) | Umsatz in EUR |
|
| Waehrung → Currency |
PrivatBank | Дата операції | Сума в валюті картки | Опис операції / Описание операции |
| Валюта картки → Currency; Категорія → Category |
Monobank | Дата і час операції (with a Cyrillic or a Latin i) | Сума в валюті картки (UAH) | Деталі операції |
| Валюта картки → Currency |
Also recognised: Datum (Consorsbank, Revolut in German), Auftraggeber/Empfaenger and Auftraggeber (Postbank), Name Zahlungsbeteiligter (GLS), Дата операции, Сумма в валюте карты, Валюта карты, Призначення платежу / Назначение платежа (business statements), and the export's own words Сума / Сумма, Контрагент, Валюта, Категорія / Категория.
A file exported from the transactions table imports back with every column recognised.
Troubleshooting
Every message the import can show, in the order you meet it.
Step 1 — choosing the file
Message | Meaning | What to do |
The file is larger than 10 MB — Split the file and import it in parts. | More than 10 MB. | Split the file. |
{name} is not a CSV file — Export the statement from your bank as CSV and try again. | The name does not end in .csv or .txt. | Export as CSV, or rename a plain-text file to .csv. |
The file could not be read — Its text encoding was not recognised. Save the file as UTF-8 and try again. | No encoding produced readable text. | Save the file as UTF-8 in a spreadsheet or text editor. |
The file is damaged: a quote opened on line N is never closed. | A double quote on that line has no closing quote. | Close or remove the quote in a text editor. |
The file has no transaction rows — Export a statement that contains transactions and try again. | Only a header line, or nothing at all. | Export a statement that has rows. |
The file has N rows — One import takes up to 3,000 rows. Split the file and import it in parts. | More than 3,000 data rows. | Split the file into parts of 3,000 rows or fewer. |
Choose an account first (in the file box) | No account is selected yet. | Choose or create a manual account. |
Step 2 — mapping columns
Message | Meaning | What to do |
To continue, map a date column and a complete amount. / To continue, map a date column. / To continue, map a complete amount. | The required columns are not mapped yet. | Set Import as on the missing columns. |
Already used by {column} | Another column is already mapped to that target. | Change the other column first. |
Creating attributes needs the Data schema changes permission. | You cannot create attributes. | Map the column to an existing attribute, or ask an admin. |
No results | Nothing in the Import as list matches what you typed. | Clear the search. |
Step 3 — reviewing values
Message | What to do |
Every date in this column reads both ways. Confirm the format before continuing. | Pick European or American. |
A date shown with from {value} next to it | A time zone moved the row to another day in your workspace's time zone. Check it is what you expect. |
N actual dates could not be read and will be left empty | Fix them in the file, or accept empty actual dates. |
N rows have a reversed actual period: the start is after the end. | Choose Swap the dates, Import without the actual date or Skip these rows. |
The amounts in this column read both ways. Confirm the decimal separator before continuing. | Pick Dot or Comma. |
No amount in this column is negative — all N rows would become income. Is the direction in another column? | If the file has a direction column, go back and choose Amount and direction. |
N rows have a sign that contradicts their Type | Choose Follow the sign or Follow the Type column. |
Not mapped — its rows are invalid | Choose Income or Expense for that direction word. |
N rows have a sign that contradicts the direction | Check the listed rows; the direction column wins. |
Creating options needs the Data schema changes permission. Map or skip the value instead. | Choose an existing option or Skip. |
Archived badge on a value | Restore «…» it, choose another option, or Skip. |
Matches N options — choose one | Open the picker and pick the right option. |
N split transactions cannot be restored and will be imported without the split | Choose a value for those rows per column, or leave Empty. |
N values in {column} could not be read as {type} and will be left empty | Fix them in the file, or accept empty values. |
N values in {column} will be left empty: {attribute} does not apply to income rows | Enable the attribute for that type, or accept empty values. |
Exchange rates could not be loaded | Click Try again. |
Choose one to import | Choose Keep current balance or Add to current balance. |
Showing the first 200 of N rows | Nothing — the rest follow the same rules. |
Reasons under Invalid rows. The row is skipped; fix it in the file and import again.
Reason | Meaning |
N fields, the header has N | The row has more or fewer fields than the header; its raw text is shown. |
No date | The date cell is empty. |
Unreadable date | The value does not fit the chosen format, is not a real day, or has something after the day that is not a time. |
Reversed actual period | The actual period is reversed and you chose Skip these rows. |
Two-digit year more than a year ahead | A two-digit year would land more than a year in the future. |
No amount | The amount cell is empty. |
Unreadable amount | The value is not a number under the chosen decimal separator. |
Zero amount | The amount is 0. |
More decimals than {currency} allows | For example three decimals in a two-decimal currency. |
{currency} — account is in {account currency} | The row's currency differs from the account's. |
Transfer | The Type column says Transfer. |
Debit and credit both filled / both empty | Exactly one of the two amount columns must have a value. |
Negative amount in the credit column | A minus in Credit (money in). |
Direction not mapped | The row's direction word has no assignment. |
No exchange rate for {currency} on {date} | No rate exists for that day. |
When you click Import
Message | Meaning | What to do |
This file was already imported — It went into {account} on {date}. Import it again? | The same file went into this account before. | Cancel, or Import again if you mean to duplicate it. |
The database is busy right now — Nothing was written. Try again. | The import took too long and was rolled back. | Click Try again; if it keeps happening, import a smaller file. |
Row N could not be imported — Nothing was written. | One row was refused, so the whole import was rolled back. The line under the message names the reason. | Click Back to review, fix the value, import again. |
The import could not be completed — Nothing was written. | The import failed for another reason. | Click Try again — options already created are reused, not duplicated. |
Not allowed — Importing needs the Import and export permission. | Your role cannot import. | Ask a workspace admin. |
Payment required — Add or update a payment method to continue using the workspace. Your data is preserved. | The workspace is awaiting payment; imports are refused until it is settled. | Owners and admins: Manage billing. Undoing an earlier import still works. |
The import could not be undone | Undo failed; the message adds the reason. | Try again, or remove the rows by hand. |
