FinBodhi Transaction CSV format
This specification defines a CSV format supported by the FinBodhi importer, alongside its built-in support for many statement formats. Use it when you control the conversion process, including when an AI assistant converts a statement for import. Each row represents one transaction line; rows with the same nonblank finbodhi_transaction_id on the same file and calendar date are candidates to become one split transaction when their posting shape is compatible.
Use a custom importer when importing a file created by someone else.
CSV requirements
- The file must be UTF-8 CSV with a header row.
- Header names are case-sensitive and use
snake_case. - Every required header must occur exactly once. Column order does not matter.
- Optional headers may occur at most once.
- Additional columns are removed during import.
- Rows must contain values for every required field.
- Values containing a comma, quote, or line break must use standard CSV quoting.
- Do not include blank rows, totals, opening or closing balances, or other non-transaction rows.
Required columns
| Header | Description |
|---|---|
finbodhi_date | Transaction date in ISO calendar-date form: yyyy-MM-dd. |
finbodhi_description | Transaction description or payee. |
finbodhi_from_account | Name of the account from which value moves. |
finbodhi_from_account_category | Category of the from account. See account categories. |
finbodhi_from_account_instrument_type | Instrument type of the from account. See instrument types. |
finbodhi_from_quantity | Positive decimal quantity leaving the from account. |
finbodhi_to_account | Name of the account to which value moves. |
finbodhi_to_account_category | Category of the to account. See account categories. |
finbodhi_to_account_instrument_type | Instrument type of the to account. See instrument types. |
finbodhi_to_quantity | Positive decimal quantity entering the to account. |
If you do not know an account name, use unknown. FinBodhi's account predictor will try to automatically predict the account during import.
Optional columns
| Header | Description |
|---|---|
finbodhi_from_price | Positive decimal unit price of the from quantity. Defaults to 1 when omitted or empty. |
finbodhi_to_price | Positive decimal unit price of the to quantity. Defaults to 1 when omitted or empty. |
finbodhi_tags | Comma-separated key:value tags. Quote the CSV field when it contains multiple tags. |
finbodhi_transaction_id | Optional transaction identity. Equal nonblank IDs on the same file and calendar date are candidates for one split transaction when the posting shape is compatible. |
finbodhi_tags uses the same key:value comma-separated representation as the FinBodhi transaction CSV export. For example: merchant:coffee,source:statement. Each key and value must be non-empty; invalid entries are ignored.
Balance rule
All quantities and supplied prices are unsigned, positive decimal numbers. Use . as the decimal separator; do not use currency symbols, thousands separators, parentheses, or negative signs.
When a price column is omitted or its value is empty, its effective price is 1.
Every row must balance:
finbodhi_from_quantity × effective finbodhi_from_price = finbodhi_to_quantity × effective finbodhi_to_price
For ordinary cash transactions, omit both price columns and use the transaction amount as both quantities.
Split transactions
Rows with the same nonblank finbodhi_transaction_id are grouped only within the same file and calendar date. In this format, a group can be merged when every row has one identical common-side account and price (1 × N or N × 1). Rows with incompatible posting shapes remain separate transactions; a group ID does not override the balance or posting rules.
For example, these two rows become one split transaction with a single bank posting and two expense postings:
finbodhi_date,finbodhi_description,finbodhi_from_account,finbodhi_from_account_category,finbodhi_from_account_instrument_type,finbodhi_from_quantity,finbodhi_to_account,finbodhi_to_account_category,finbodhi_to_account_instrument_type,finbodhi_to_quantity,finbodhi_transaction_id
2026-08-10,groceries,hdfc savings,assets,cash,100.00,groceries,expenses,cash,100.00,receipt-42
2026-08-10,transport,hdfc savings,assets,cash,40.00,transport,expenses,cash,40.00,receipt-42
A missing or blank finbodhi_transaction_id, a different calendar date, or a different file keeps a row standalone.
Account categories
finbodhi_from_account_category and finbodhi_to_account_category must be one of:
assetsequityexpensesincomeliabilities
Instrument types
finbodhi_from_account_instrument_type and finbodhi_to_account_instrument_type must be one of:
cashmetalmfsifnpsothersstock
Example: cash transactions
finbodhi_date,finbodhi_description,finbodhi_from_account,finbodhi_from_account_category,finbodhi_from_account_instrument_type,finbodhi_from_quantity,finbodhi_to_account,finbodhi_to_account_category,finbodhi_to_account_instrument_type,finbodhi_to_quantity
2026-08-01,salary,unknown,income,cash,85000.00,hdfc savings,assets,cash,85000.00
2026-08-02,"coffee shop, downtown",hdfc savings,assets,cash,245.50,unknown,expenses,cash,245.50
2026-08-03,electricity bill,hdfc savings,assets,cash,1820.00,unknown,expenses,cash,1820.00
Example: asset purchase
finbodhi_date,finbodhi_description,finbodhi_from_account,finbodhi_from_account_category,finbodhi_from_account_instrument_type,finbodhi_from_price,finbodhi_from_quantity,finbodhi_to_account,finbodhi_to_account_category,finbodhi_to_account_instrument_type,finbodhi_to_price,finbodhi_to_quantity
2026-08-10,buy acme shares,hdfc savings,assets,cash,1,1255.00,acme stock,assets,stock,125.50,10
Additional columns
Additional columns are allowed and are removed during import.
For example, an exporter may include account identifiers:
finbodhi_from_account_id,finbodhi_to_account_id
account-123,account-456
These fields are not required by this version of the format and must not be required for import. A blank or missing finbodhi_transaction_id also remains a standalone transaction.
Conversion prompt
Copy this prompt when using an assistant to convert a source statement:
Convert the attached statement into a FinBodhi Transaction CSV file.
Read and follow this specification before converting the file:
https://finbodhi.com/docs/misc/transaction-csv-format.md
Create and provide the result as a downloadable file with a `.csv` extension. The file must contain only valid UTF-8 CSV with a header row—no Markdown, explanation, totals, balances, blank rows, or transactions that are not present in the source statement. Ensure every row satisfies the required columns and balance rule.