Skip to content

Importing Portfolio Data ​

Rover Portfolio can create a portfolio from starting positions or build one from transaction history. Choose the file, review its interpretation, and then apply the import. You can map unfamiliar columns in the dialog without setting up a saved format first.

Quick checklist

  • Use a supported file type.
  • For tabular transactions, identify the ticker, quantity, and price or cash amount in the mapping review.
  • Check how the file distinguishes buys and sells; choose the interpretation that matches its values.
  • Check the sign of every amount: cash received is positive; cash spent is negative.
  • Include a date when the activity should not be posted on the import date.
  • Know whether the brokerage values are original or already adjusted for stock splits.

Choose the right import ​

Transaction history ​

Use a transaction import when you have buys, sells, and cash activity. Rover Portfolio uses the actual buys and sells to establish the cost basis of each position.

The transaction workflow accepts .csv, .tsv, .txt, .xlsx, .qif, .ofx, and .qfx files. The column rules on this page apply to tabular .csv, .tsv, .txt, and .xlsx files; QIF and OFX files use their own standard structures.

Starting positions ​

Use a position import when you have a snapshot of holdings instead of complete transaction history. It establishes holdings and cash at the end of the snapshot date. Supply historical cost basis for actual holdings. If basis is missing, the import uses quantity times the snapshot-date closing price as a convenient starting basis for test or virtual portfolios. The server uses completed as-of pricing for the performance baseline. Returns need at least two valuation dates.

The position workflow accepts .csv, .tsv, .txt, and .xlsx files.

Review the file format ​

Both Transactions and Positions prepare the file before applying it. The dialog shows the format in use and a review of the interpreted data. If columns cannot be identified confidently, map them using the source headings and sample values. Required fields appear first; expand optional fields when you need them. For XLSX, the first worksheet supplies the import data.

For transactions, check the buy/sell interpretation as well as the column selections. A brokerage may use positive quantities plus an action column, signed quantities, or signed amounts. Price or Proceeds lets you use whichever the export supplies. The canonical signs in the examples below describe the interpreted data; you do not have to rename brokerage headings or edit source signs to match them.

Positions has its own mapping for holdings, cash, dates, cost basis, and lot information. Its preview also checks the proposed opening or reconciliation changes before saving. Editing the file or mapping requires a new review.

Remember a format ​

After a successful review, expand the remembering controls to save a personal format. Choose a new format or explicitly update an existing one. You can independently select:

  • This portfolio: reuse it for this portfolio's future imports of the same type.
  • All my portfolios: use it as your default for that import type, wherever a portfolio has no override.

Transactions and Positions have separate formats and defaults. Remembering one does not change the other. For a new portfolio, its assignment is saved after portfolio creation succeeds. Applying a format to the current import alone does not make it a default.

An automatic choice bypasses saved defaults for the current import. Saved formats match headings by name, so reordered columns are safe; missing or duplicate headings require review. Deleting a format used by a portfolio or your defaults is blocked until those assignments are cleared or changed.

Find a brokerage format ​

For positions, open Positions format to search your saved formats, or choose Browse system library… at the bottom of the picker. Search appears when there are more than eight saved formats in the current list; search by brokerage, format name, or description. The list shows format names, with a checkmark on the current selection. Selecting a result applies it immediately. Its brokerage appears beneath the field when available; generic values such as “Any” are omitted. The description remains available to screen readers. Back to my formats returns to your personal choices. Admins can open Manage library from this panel.

For transaction imports, use Find a brokerage format to browse the shared library. Select a format whose name and description match your file, then review the result. Library selections affect the current import. Remembering one creates your own independent copy; later library edits do not change your saved format.

Admins also see Manage System Library, which opens a separate dialog. They can add the current import's mapping, edit a saved format's details and columns, replace its mapping with the current import's mapping, or confirm its deletion. The dialog has a green Save Format or Save Changes button and a Done button that returns to the import without losing its file or settings. Adding a format asks for a brokerage name, description, and format name. Unsaved edits are protected when closing or selecting another format. Ordinary users can browse and copy the library.

QIF, OFX, and QFX transactions ​

These files use a structured transaction parser and skip column mapping and saved column defaults. QIF may ask for month/day or day/month date order and ticker symbols for security names it cannot resolve. OFX/QFX uses its security list. Review the decoded transactions before importing.

Supported activity includes stock and mutual-fund buys/sells, cash activity, income, expenses, and reinvestments. Unsupported activity blocks the file with an explanation rather than silently omitting records. Current limits include options and debt trades, share transfers, splits, return of capital, journaling, OFX corrections and per-transaction foreign currency, and QIF cross-account trade/income variants. Export those activities in an appropriate tabular form or handle them separately before retrying.

QIF/OFX/QFX does not import position holdings. Use a tabular holdings export for Positions, including when an OFX statement contains balances or holdings alongside its transactions. A holdings-only OFX file contains no importable transactions.

Try the examples ​

These small files are for test portfolios:

  • Broker transaction columns: map Booked to Date, Ticker to Symbol, Units to Quantity, Unit cost to Price, and Event to Action; use the action-column interpretation with Sell as the sell keyword.
  • Broker position columns: map Ticker to Symbol, Units to Quantity, As of to Position Date, and Basis to Cost Basis.
  • QIF cash deposit: choose month/day/year when asked, then review the deposit.

Confirm whether older trades were restated ​

Brokerage imports default to the usual transaction-export format: quantities and prices are kept as they appeared on each trade date. You can import with this default without making a stock-split decision.

  • Choose No — use the values shown on each trade date when each row shows the quantity and price originally recorded for that trade. This is the correct choice for most brokerage transaction exports.
  • Choose Yes — older trades have been restated for later splits only when the brokerage has changed historical quantities or prices to reflect stock splits that occurred after those trades. Enter the last date used for those changes.

For already adjusted values, the adjusted-through date must be today or earlier and must be on or after every transaction date in the file. Files containing future-dated transactions cannot be imported.

Manual transactions entered directly in Rover Portfolio do not ask this question. Their values are treated as current, and the server records the import date as their split baseline.

Bulk import ​

Use Bulk Import when you need to create or update several portfolios in one reviewed batch. It is designed for onboarding accounts, moving data from another system, or loading a set of household or client portfolios without opening each portfolio one at a time.

Bulk Import uses two parts: a manifest file that tells Rover Portfolio what to do, and the data files that contain the positions or transactions to import. The dialog reads the manifest, matches each row to files you select, shows a preview, and waits for confirmation before changing any portfolio data.

Dialog workflow guide

Download PDF

Use this printable guide when you want a first-time user checklist for preparing files and running the dialog.

Before you open Bulk Import ​

Prepare these items on your computer:

  1. A manifest.csv file.
  2. The transaction or position files referenced by the manifest.
  3. Clear file names, and folders on your computer if they help you organize the batch before selection.

The manifest is the instruction sheet. It tells Bulk Import which portfolio each file belongs to, whether the file is transaction history or starting positions, and whether the file should create or update a portfolio.

The data files are still required even when the manifest lists every path correctly. Because the app runs in a browser, it cannot read files from your computer just because their names appear in the manifest. In the dialog, use Choose Files to select the actual data files referenced by the manifest. You can select more than one file at the same time.

Manifest file ​

The manifest uses one row per import file.

ColumnRequiredDescription
portfolio_nameYesThe portfolio to create or update. Existing portfolios are matched by this name.
file_pathYesThe selected file name, such as transactions.csv. Relative paths are accepted when the browser provides them.
file_typeYesUse transactions for activity history or positions for starting holdings.
actionNoUse create, update, or update_or_create. When omitted, Bulk Import uses update_or_create.
conversion_profileNoA personal format name or numeric ID for this file, matching its import type. Overrides defaults for creates or updates; does not assign a future default. May be omitted.
split_adjustment_modeYesUse as_traded for original values or adjusted_through for values already restated for splits.
split_adjusted_throughYesLeave blank for as_traded. For adjusted_through, enter the last included split-adjustment date as YYYY-MM-DD.

create_or_update and upsert are accepted as older names for update_or_create.

An empty, omitted, or zero conversion_profile uses the default for that file's import type: the portfolio override, then your default, then automatic matching. An explicit personal format applies to that file for both creation and update. A missing, ambiguous, or wrong-type reference blocks review. QIF/OFX/QFX bypass column defaults and cannot use a column profile.

You can review or edit an individual file's mapping in the batch. Choosing a format for a row does not change portfolio or user defaults; use the remembering controls when you want that behavior.

file_path may be a relative path when the selected file exposes one, but the most predictable workflow is to use unique file names in the manifest and select those files directly. Backslashes are normalized, so Smith Family Trust\transactions.csv is treated the same as Smith Family Trust/transactions.csv. The path must match exactly one selected file.

Manifest example

Download
csv
portfolio_name,file_path,file_type,action,conversion_profile,split_adjustment_mode,split_adjusted_through
Smith Family Trust,Smith Family Trust/transactions.csv,transactions,update,,as_traded,
Smith Family Trust,Smith Family Trust/q2-transactions.csv,transactions,update,,adjusted_through,2026-07-29
Johnson Retirement,Johnson Retirement/starting-positions.csv,positions,create,Fidelity Export,adjusted_through,2026-07-29
Taylor Household,Taylor Household/transactions.csv,transactions,update_or_create,Schwab Export,as_traded,

In this example, Smith Family Trust uses its transaction default. Johnson Retirement uses the personal Positions format Fidelity Export, and Taylor Household uses the personal Transactions format Schwab Export, whether created or updated. These explicit selections do not assign future defaults.

If a batch uses existing defaults or automatic matching, omit the column completely:

csv
portfolio_name,file_path,file_type,action,split_adjustment_mode,split_adjusted_through
Smith Family Trust,transactions.csv,transactions,update,as_traded,

Data files ​

Transaction files are detailed activity history: buys, sells, dividends, deposits, withdrawals, and other account activity. Bulk Import accepts .csv, .tsv, .txt, .xlsx, .qif, .ofx, and .qfx transaction files.

Position files are current holdings snapshots. Use them when you are creating a new portfolio from starting positions instead of importing complete transaction history. Bulk Import accepts .csv, .tsv, .txt, and .xlsx position files.

You can keep source files organized by portfolio on your computer, but the dialog asks you to select the files themselves:

text
Import Files/
|-- Smith Family Trust/
|   |-- transactions.csv
|   `-- q2-transactions.csv
`-- Johnson Retirement/
    `-- starting-positions.xlsx

After you select files, Bulk Import matches them to the manifest and reports how many manifest files are matched.

Run the dialog ​

  1. Open Bulk Import from the sidebar.
  2. Under Manifest, click Choose Manifest, then select your manifest.csv.
  3. Under Data Files, click Choose Files.
  4. Select the referenced data files. You can select multiple files in one picker session, and you can use Add Files if you need to add more.
  5. Review the summary counters and each file's preparation. Open the per-file editor to resolve unfamiliar columns or choose a different format. Rows marked Awaiting need a matching file; Needs Review rows must be fixed.
  6. Click Import Batch to prepare the batch's transaction and opening-position reviews.
  7. Inspect the proposed changes, then click Apply Previewed Batch to write them.

The manifest and files can be selected in either order. Every batch pauses for review before writes. A changed file, mapping, or target requires a fresh review.

Action options ​

ActionResult
createCreates a new portfolio. If a portfolio with the same name already exists, the row needs review.
updateUpdates an existing portfolio. If no matching portfolio exists, the row needs review.
update_or_createUpdates an existing portfolio when the name matches exactly; otherwise creates a new portfolio.

File type options ​

File typeSupported filesUse it for
transactions.csv, .tsv, .txt, .xlsx, .qif, .ofx, .qfxBuys, sells, dividends, deposits, withdrawals, and other activity history.
positions.csv, .tsv, .txt, .xlsxStarting holdings for a new portfolio.

Bulk position files create new portfolios. To update an existing portfolio from a complete holdings file, use Positions → Import positions. For actual trade history, use transaction entry or transaction imports.

Preview, troubleshooting, and results ​

After you choose the manifest and data files, Bulk Import shows a preview:

  • Create means a new portfolio will be created.
  • Update means the file will be imported into an existing portfolio.
  • Update, Create If Needed means Bulk Import will update a matching portfolio or create one if no match exists.
  • Awaiting means the manifest row is waiting for a matching data file selection.
  • Needs Review means the row has a problem to fix before the batch can run.

Common review messages include:

  • The file listed in file_path was not selected.
  • More than one selected file matches the same path.
  • More than one existing portfolio has the same name.
  • The action is not supported.
  • The file type is not supported.
  • The split-adjustment mode or adjusted-through date is missing or invalid.
  • A row names a personal format that does not exist, is ambiguous, has the wrong import type, or cannot be applied to its file.
  • The file contains a future transaction or a transaction after its adjusted-through date.
  • A position file is trying to update an existing portfolio.

When you confirm the batch, imports run one at a time. If one file fails, the remaining files continue when possible. For a new portfolio, if the first file cannot create the portfolio, later files for that same portfolio are skipped.

What bulk import can do ​

  • Create multiple new portfolios from import files.
  • Update multiple existing portfolios with transaction files.
  • Mix creates and updates in the same batch.
  • Match existing portfolios by portfolio name.
  • Validate missing files, duplicate portfolio names, unsupported file types, and invalid actions before import.
  • Continue through the batch when one file fails, then show a per-file result list.

Interpreted transaction fields ​

Every tabular transaction file needs (snapshot requirements are listed below):

  • Symbol
  • Quantity
  • At least one of Price or Amount

If both Price and Amount are present, the supplied values are retained. If one is missing, Rover Portfolio calculates it:

text
Amount = -(Quantity * Price) - Fees
Price  = -(Amount + Fees) / Quantity

Amount is proceeds: positive values add cash and negative values consume cash. See Transaction data rules for the complete sign convention.

Automatic column matching ​

Automatic matching recognizes common headings such as Date, Symbol/Ticker, Quantity/Qty, Price, Fees/Commission, and Amount/Proceeds. It asks for review when a heading or buy/sell interpretation is ambiguous. Custom broker labels can be mapped directly in the dialog.

Use clear, specific headings for files you create yourself. Saved formats rebind by normalized exact heading names rather than guessing from old column positions. Headerless files require an explicit positional mapping.

Transaction file examples ​

The smallest useful trade file contains Symbol, Quantity, and either Price or Amount.

Using price ​

csv
Date,Symbol,Quantity,Price,Fees
2026-01-12,AAPL,10,225.00,4.95
2026-03-18,AAPL,-4,238.50,4.95

The buy has a positive quantity. The sell has a negative quantity.

Using amount ​

csv
Date,Ticker,Qty,Proceeds,Comm,Memo
01/12/2026,MSFT,5,-2104.95,4.95,Opening purchase
03/18/2026,MSFT,-2,889.05,4.95,Partial sale

The buy consumes cash, so Proceeds is negative. The sale generates cash, so Proceeds is positive.

Cash activity ​

A cash transaction has zero Quantity, zero Price, and a non-zero Amount.

csv
Date,Symbol,Quantity,Price,Amount,Description
2026-02-28,,0,0,2500.00,Account deposit
2026-03-31,AAPL,0,0,12.40,Dividend

A cash row with a symbol is treated as a dividend. $Cash is reserved for cash transactions.

Position file examples ​

Snapshot files require Symbol / Ticker and Quantity / Qty / Qty (Quantity). Optional columns are Position Date / Date / Position_as_of_date, Market Value / Value, Cost Basis / Basis / Cost, Original Purchase Date / Acquisition Date / Date Acquired / Buy Date, Identifier / Broker Lot ID / Lot ID. Underscore variants are accepted. Market Value supplies cash balances; stock valuation uses database pricing. Amount and Proceeds do not substitute for basis or market value.

csv
Position Date,Symbol,Quantity,Cost Basis,Acquisition Date,Broker Lot ID
2026-05-01,MSFT,1000,80000,2020-03-10,lot-1
2026-05-01,IBM,10,N/A,,
2026-05-01,Cash,0,,,

Blank basis, --, and N/A use a snapshot-date closing-price estimate in the position import UI. An explicit zero remains known zero. A row with no original purchase date or identifier is an aggregate holding. Use multiple rows per symbol for actual remaining lots. Conflicting dates, invalid numbers, duplicate identifiers within a symbol, and inconsistent file data are rejected.

Short opening positions use a negative quantity. Supply the opening short-sale proceeds in Cost Basis as either a positive amount or a negative signed basis; the server stores negative basis for shorts. For example, MSFT,-10,1200 establishes a ten-share short with $1,200 of opening proceeds. Snapshot cash is the actual cash balance, including any proceeds already received. Importing the holding does not add those proceeds to cash again. A subsequent buy-to-cover consumes cash and realizes the difference between the matched opening proceeds and the cover cost, including fees. Partial covers retain the remaining short quantity and proceeds; splits adjust share quantities and prices while preserving total proceeds.

A Cash or $Cash row supplies cash through quantity or market value. You may instead enter cash in the dialog. Both must agree when supplied together. Missing cash defaults to zero with a preview warning.

Import positions and review transactions ​

Choose New Portfolio → Import positions to establish starting holdings. Upload CSV, TSV, or a single-sheet XLSX workbook, map the columns, optionally enter a date and cash, and select Preview import. Enter the portfolio name and optional description on the file screen, then select Create Portfolio.

For an existing portfolio, choose Positions → Import positions:

  1. Upload a complete holdings file and choose its position date. A security missing from the file is treated as a zero holding.
  2. Select Preview import. The app compares the file with holdings calculated from your existing transactions at that date. It generates only the remaining buys, sells, short sales, and covers needed to reach the imported quantities.
  3. Review the generated transactions. Quantities are fixed and shown in shares as of the position date. Edit each transaction's date and total cost or proceeds. Amounts start from closing-price estimates; enter an amount if no price is available.
  4. Select Save import. The generated transactions become ordinary activity in the Transactions tab. You can edit or delete them afterward, including changing quantities. Future imports use the transaction stream with those edits included.

For a later import, transaction dates must be after the previous import date through the new import date, inclusive. The review shows the exact allowed range. If you insert an import within existing history, its transactions also affect subsequent holdings; previous imported positions are not enforced or automatically restored.

If the new import predates the portfolio's starting positions, those positions become the new opening holdings. The generated transactions connect them to holdings at the previous starting date. Their dates may run from the new import date, inclusive, to before the previous starting date. Existing subsequent transactions are retained.

When the file or dialog supplies cash, a deposit or withdrawal balances that cash after the reviewed trades. This amount recalculates as you edit trade costs; its date is editable. Without supplied cash, subsequent imports generate security transactions only. Initial positions default to zero opening cash when absent.

You do not need to supply intervening activity, select a snapshot mode, or resolve discrepancies. Imports generate transactions once and never constrain later edits. If the portfolio changes while you are reviewing an import, return with Back and preview it again before saving.

Bulk position imports continue to create new portfolios. Use the single-portfolio flow for subsequent position imports.

Unknown basis and gains display and export as Unknown. Unknown acquisition dates stay blank and holding periods remain Unknown. Unrealized gains compare value against historical basis; investment performance measures the period since tracking began.

Dates and defaults ​

Supported date formats are:

  • YYYY-MM-DD
  • MM-DD-YY
  • MM/DD/YY
  • MM/DD/YYYY

For transactions, a missing Date uses the existing transaction-import default. For snapshots, a blank requested date resolves from an unambiguous file date or the latest completed daily pricing date. An explicit date conflicting with the file, or a date after the pricing cutoff, is rejected. Prior quotes may cover weekends and holidays; intraday quotes do not advance the cutoff.

Position imports fill the date control with the server-resolved date before review. Cash remains blank with a Use file cash placeholder unless you enter an override; leaving it blank preserves file cash and the importer's existing defaults. Changing the file or column mappings refreshes the defaults. Bulk position imports show the resolved date and its source for each file. If the server cannot resolve the date, the form displays the reason instead of guessing a default.

Before you import ​

  1. Confirm that the first row contains column headers, not data.
  2. Remove totals, subtotals, notes, and blank heading rows.
  3. Confirm buy and sell quantity signs.
  4. Confirm proceeds signs and fees.
  5. Scan symbols for accidental spaces or values longer than 64 characters.
  6. Confirm whether the values are original or already adjusted for stock splits.
  7. Decide whether duplicate checking should be enabled for this import.
  8. Keep a copy of the original file in case you need to compare or retry.

For validation behavior and duplicate definitions, continue to Transaction data rules.

Clarity for the decisions that shape your portfolio.