Import from a file

If you have a transaction file that doesn't fit any of our presets, don't worry! Capitally allows you to create your own one right in the app.

This guide will walk you through the process.

Step 1: Open the File

Drop a CSV, XLS, XLSX, XML or JSON file on any page in your project, or open it from the import page. Capitally matches it to compatible templates before starting the import; when there is no unambiguous match, you choose among the matching templates or use Import any data.

How the template is chosen

  1. If you are viewing an account in Portfolio and a matching template has imported into it before, the last-used one opens and the import targets that account.
  2. Otherwise, if exactly one template recognizes every required section by its header, that template opens directly.
  3. Otherwise, Choose the import template lists the matching templates and offers Import any data as the fallback.

Opening or pasting data on the import page follows the same resolution. A supported file whose browser type is missing is identified from its extension.

Choose the import template dialog listing two matching broker templates and an Import any data buttonChoose the import template lists the matching templates, with Import any data as the fallback

Ensure it loaded correctly and pick data range if needed. By default all rows are included and first row is used as a header with column names, but you can easily change that by clicking on the From here, To here and Header buttons.

If your data file needs more preparation, click the cog icon in the lower-right corner to access additional options, such as choosing an Excel sheet, special character encoding, replacing header names, and more.

PDF statements

If your broker only issues PDFs โ€” Trade Republic and Swissquote are the usual cases โ€” pass the first few pages through an AI or OCR tool that reads tables, check the numbers it produced, then paste the resulting table into Capitally with Import any data. Save the preset on that first run and every later statement takes seconds. If the broker offers a CSV or Excel export anywhere in its interface, use that instead, and send us a sample so we can build a preset for it.

Date and number formats

Dates written as DD/MM/YYYY with slashes are read in the US order, MM/DD/YYYY: 06/09/2024 imports as 9 June, not 6 September. Nothing errors, so the mistake usually surfaces months later as wrong holding periods and wrong tax years. Every other common layout โ€” YYYY-MM-DD, DD-MM-YYYY, MM-DD-YYYY โ€” is detected automatically.

The date format you picked in your profile has no effect here: import reads dates from the file, so switching the display format will not make a slash-separated European file land correctly. See Settings and display preferences for what the formatting settings do and don't reach.

If your file uses slashes in the European order, convert the separator as it comes in:

  1. Turn on early access features in Settings.
  2. In the import template, enable a formula on the Date column.
  3. Use regexReplace(value, '/', '-'). With dashes, the date parses as DD-MM-YYYY.
  4. Save the template on that first import so you never repeat this.

Dates and numbers are parsed from the file, not from your profile settings. The parse step's How to read this data? panel holds Date Format โ€” set it to Day-Month-Year for a European file whose dates use slashes โ€” and Decimal Separator, for files that use a comma. Both are saved into the template on the first import, so you set them once per broker. Some broker presets also strip thousands separators themselves.

Whatever format your file uses, sort the rows by date in the review step and check that the earliest and latest dates look right before you confirm the import.

Step 2: Tell us what to do with it

On the next screen, let us know what this data is about.

Screenshot of a financial app interface showing options for transactions history, account balances, asset price history, and advanced import.

We'll then ask you to match the data columns to transaction properties. Depending on the data provided, we might be able to match most properties ourselves. Just verify the list, select a data column, or choose a single value for all rows. You can also delete properties you don't plan to import by clicking the trash can icon, but remember, that some are required.

Screenshot of a financial app interface showing how to assign properties to columns or set fixed values, with annotations explaining options.

See the Transaction Properties Reference for details about particular properties.

Tags are among those properties, for transactions and for the assets and accounts a file creates, so a column of your own labels comes in with the data โ€” no advanced mode needed. See Tags for how they then propagate.

Transactions History template

If you want to quickly import multiple transactions without matching the columns, just use the below spreadsheet template.

  • Clone the spreadsheet or create your own with similar column names,
  • Fill the spreadsheet with your data,
  • Copy or save to a CSV file,
  • Import to Capitally with Import any data,
  • Choose Transactions history from the list.

What the Transactions history preset supports

The preset reads one row per transaction and works the rest out from your columns. Buys and sells keep a positive quantity, with the type carrying the direction. Price is optional: leave it out and the market price for that date is used, or the price is derived from value รท quantity. The value's sign is always aligned to the quantity's, so a derived price is never negative, however your file signs outflows.

  • Transfers โ€” a Withdrawal-style label produces a negative quantity, while Transfer and Deposit keep whatever sign the file carries, so pre-signed columns work as they are.
  • Dividends, interest and rent โ€” the amount becomes the transaction value, the withholding-tax column becomes Tax Paid.
  • Fees and other cash movements โ€” the amount becomes the value, negative for an expense.
  • Options โ€” a row imports as an option when it carries both a strike price and an expiry date, even if its type column only says Buy or Sell, and also when the type itself says Option, Call, Put, Expiration or Exercise. Put versus Call is read from the option-type column (put/call/p/c, including a trailing letter on an option symbol). Sold, expired and exercised contracts get a negative quantity, exercised ones open a position in the underlying, and the contract multiplier defaults to 100. Options need the Stock Options plan feature.
  • Private equity โ€” Commitment becomes a capital commitment, Capital call or Drawdown an opening transaction, Distribution a dividend. A capital call carrying only an amount needs the fund's asset to be priceless; otherwise map the amount to Quantity as well.

Two labels worth knowing: Sell to open and Buy to close are read by their leading word, so they become a sale and a purchase. And "Capital call" is matched before options, so the word "call" in it doesn't turn the row into an option.

What the preset won't do

Multi-leg option strategies, assignment chains and the stock leg that follows an exercise aren't derived for you. Only one column can be mapped per field, so a file that splits buys and sells across two amount columns needs advanced mode. A type label the preset can't recognise fails that row with an error note: either set one fixed type for all rows, or switch to advanced mode.

Backtesting a strategy with regular purchases

Build one spreadsheet with a row per purchase โ€” date, asset, purchase value โ€” and import it in one go. Do not map Price or Quantity. Mapping Price and leaving it empty fails every row with price: Invalid input: expected number, received null; click the trash icon next to Price and Quantity to remove those fields entirely, and map the cash amount to Value instead. The market price for the date is then used automatically.

For ongoing month-by-month buying, an advanced-mode preset that generates the buys from a single pasted amount is the better fit.

Step 3: Review the items to be imported

On the next screen we'll show you the accounts, assets, currencies or markets that we found for your data. Review the list, correcting any wrong guesses and filling the blanks.

Assets are matched by whichever column you picked โ€” symbol, ISIN or name โ€” against the whole catalogue, so this is the step where a wrong match gets corrected. For an unmatched asset, the row's Create button opens the Add asset form with its name, symbol, ISIN and type pre-filled from the file; an unmatched account is pre-filled with its name.

When several assets or accounts are confirmed missing, Create N missing objects in the warning creates them as one batch. After a successful batch, the toast's Undo reverses it. A lookup error still offers the row's Create shortcut, but is excluded from bulk creation so you can review it before creating a possible duplicate.

Import review panel warning that two assets were not found, with a Create 2 missing objects button and an inline Create button on each unmatched asset rowTwo unmatched assets in review: Create 2 missing objects and the inline Create buttonsScreenshot of a financial app interface showing account and asset selection options with arrows and text guiding users to switch or add assets.

If you don't want to import a certain transaction - just change it's Status. Some of the transactions can be already ignored - either because they're not supported, or they're already imported - you can check the reason by hovering on the info icon next to status.

You can update the status of multiple rows at once by selecting them and changing the value on any of the rows.

Additionally, the rows can be sorted by clicking on the column headers for easier review.

Duplicates, updates and unsupported rows

Duplicate means the transaction is already in your project, which is what makes re-importing the same file โ€” or an overlapping date range โ€” safe. Switch a row to Update to overwrite the stored values instead, the way to pull in a fee or dividend tax your source restated later. Not supported means we haven't seen that transaction type in this format before: the row is skipped, everything else imports, and nothing is blacklisted โ€” skipped rows exist only inside that import session, so once the type is handled you re-import the same file and only the missing rows come in.

See Duplicates and re-importing for what gets compared and how to change many rows at once.

Step 4: Review the account balances

On the last screen you can verify if the account balances are what you expect. If no - just go back to the previous screen and make amendments. If yes - click Import to accept the changes.

We'll ask you to save the preset for later reuse and you're done. The next time you will be importing similar data, just reuse the preset and import it in seconds. ##