Import and export with CSV

What a row represents

The CSV is a double-entry posting log: one row per accounting posting, not per entry. Each row affects exactly one “account” (a financial account or a budget item) and carries a signed amount.

Postings that belong to the same register entry share an EntryId. The two postings of a simple deposit (bank +X, category -X) share an EntryId; a multicategory deposit gets one bank row and N category rows under the same EntryId.

Within a single EntryId:

  • All rows must share the same Date and Type.
  • The signed Amount values must sum to zero (debit-positive convention: positive on a bank row means money in; positive on a budget-item row means a category is being charged).

Columns

Column Required Description
EntryId Yes Groups postings into one entry. Use any value — Volo treats it as an opaque grouping key.
Date Yes The day the entry happened, in YYYY-MM-DD format.
Type Yes One of deposit, journal_entry, opening_balance. (expense_payment rows are accepted in exports for completeness but the importer will skip them — see below.)
Account Yes The exact name of the account being posted to.
Account Type Yes Either bank (for financial accounts) or budget_item (for income/expense categories).
Amount Yes Signed decimal. Positive = debit (asset increase, expense charge); negative = credit.
Memo No Free-text description. The importer uses the first non-blank Memo for the entry.
Reference No Check number, transaction id, or other identifier. Same first-non-blank rule.

Examples

A simple deposit (two postings — bank receives, category is credited):

EntryId,Date,Type,Account,Account Type,Amount,Memo,Reference
1,2026-03-10,deposit,Checking,bank,250.00,Membership drive,
1,2026-03-10,deposit,Memberships,budget_item,-250.00,Membership drive,

A bank-to-bank transfer (two bank-side postings, no category):

2,2026-03-15,journal_entry,Checking,bank,-1000.00,Sweep to savings,
2,2026-03-15,journal_entry,Savings,bank,1000.00,Sweep to savings,

A multi-category deposit (one bank row + multiple category rows):

3,2026-03-20,deposit,Checking,bank,180.00,Bake sale,
3,2026-03-20,deposit,Fundraising,budget_item,-120.00,Bake sale,
3,2026-03-20,deposit,Misc Income,budget_item,-60.00,Bake sale,

An opening balance (bank seed against the Opening Balance Equity bucket):

4,2026-04-01,opening_balance,Checking,bank,5000.00,Opening balance for Checking,
4,2026-04-01,opening_balance,Opening Balance Equity,budget_item,-5000.00,Opening balance for Checking,

expense_payment rows are export-only

Entries with Type=expense_payment come from marking an expense paid in the normal expense workflow — they’re tied to a specific Expense record. The CSV format includes them so register exports show your complete history, but the importer will not create new expense_payments from a CSV row. If you upload a CSV containing expense_payment rows, they’ll show up in the import’s skipped-rows list with the reason “Expense-payment entries are created by marking an expense paid, not by import.” Mark the underlying expense paid in the regular workflow instead.

Round-trip behavior

Re-importing a file you exported creates duplicate entries. The CSV’s EntryId is a grouping key only — Volo does not match it against existing register entries.

To avoid duplicating data:

  • If the entries you want to re-import came in via a previous import batch, roll that batch back first.
  • If they were entered by hand, edit them on the register page directly. The CSV importer is for bulk import of new data, not for in-place updates.

Common errors

“CSV is missing required columns.” The importer didn’t find one of the required headers. Make sure your header row uses the exact names from the table above (the spaced “Account Type” or the joined “AccountType” both work; everything else is case-sensitive).

“Bank account isn’t in your books.” The Account column referenced a financial account name that doesn’t exist in your org. The wizard’s Accounts step lets you merge it with an existing account or create it fresh.

“Postings didn’t balance.” Rows sharing an EntryId have signed amounts that don’t sum to zero. Fix the offending group and re-upload.

Can't find what you're looking for? Email us at contact@volocash.com and we'll be happy to help.