Importing data
Bring your history with you - transactions, budgets, and investments imported from CSV, previewed before anything is saved.
Imports cover transactions from your bank or YNAB, your YNAB budget plan, and your investment trades or holdings. They're file-based (CSV), previewed before anything is saved, and they create any accounts, category groups, categories, and subcategories your file mentions that don't exist yet.
Where to find Import
- On an account - open the account's ledger and click Import in the toolbar (next to Filter). The import is pre-aimed at that account.
- While adding an account - in Add Account, pick Import from a file below "Add manually". You can map the file to existing accounts or create new ones during the preview step.
Both paths open the same flow: pick what you're importing, upload the file, review the preview (what will be created, what looks like a duplicate), then import. Nothing is written until you confirm the preview, and a failed import writes nothing at all.
Generic CSV (bank & institution downloads)
Most banks let you download transactions as CSV. Pocketwatch reads the common header names directly; if your bank's file doesn't match, rename the header row to the canonical names below - headers are case-insensitive and column order doesn't matter.
| Column | Required | Accepted values |
|---|---|---|
Date | Yes | 2026-06-12 (preferred), 06/12/2026, or 12/06/2026. Day/month order is detected from the file; if every date is ambiguous you'll get a format picker in the preview. |
Description (or Payee) | Yes | Up to 200 characters. |
Amount - or Outflow + Inflow | Yes | Signed decimal: spending negative, income positive (-54.20, 2,500.00). Currency symbols, thousands separators, decimal commas, and (54.20)-style negatives are all understood. With Outflow/Inflow columns, outflow is treated as negative. |
Category | No | Groceries - or Utilities: Water for a subcategory (see syntax). Created automatically when missing. |
Group (or Category Group) | No | Category group for a newly created category. Auto-created when missing. |
Notes (or Memo) | No | Up to 500 characters. |
Cleared | No | true/false, yes/no, or YNAB's cleared / uncleared / reconciled. |
Account | No | For files covering several accounts. Each distinct name is mapped in the preview - to an existing account or to a new one you create on the spot. |
A minimal example:
Date,Description,Amount,Group,Category,Notes 2026-06-01,Grocery Run,-54.20,Everyday Expenses,Groceries,weekly shop 2026-06-02,Paycheck,"2,500.00",Income,Income, 2026-06-03,Water Bill,-30.00,Monthly Bills,Utilities: Water,
Subcategory syntax
In any Category cell, colon-space (: ) splits a parent category from a subcategory: Utilities: Water means the subcategory Water under the top-level category Utilities. Both are created if they don't exist (the parent lands in the row's Group, the child always follows its parent's group). A bare name like Groceries is a top-level category. Only one nesting level exists, and the separator must be colon followed by a space - A:B without the space is read as a single category name.
Rules worth knowing
- Future-dated rows import as Upcoming - they don't touch the balance until their date arrives.
- Zero-amount rows and rows with no payee still import, flagged for attention (a zero-amount row carries no balance; a blank payee comes in as "(No payee)" for you to fill in).
- Only rows that truly can't be read - no usable date, or an unreadable amount - are skipped and listed by line number; the rest of the file still imports.
- Files up to 15 MB and 10,000 rows per import. Bigger history? Split by year and import in parts.
Importing from YNAB
In YNAB, open Budget Settings → Export budget. You'll get a zip - unzip it to find two files and drop both at once (or just one); Pocketwatch walks you through a preview for each:
- …Register.csv - every transaction in the budget. Pocketwatch automatically creates every account named in the file (no hand-mapping) with a best-guess type - credit card, checking, savings, loan - picked from the account name and the balance you carry; you can change any type later from the account's settings. Accounts you already have with a matching name are reused, not duplicated. Each transaction's Payee becomes the description, Memo the notes, Outflow/Inflow the signed amount, the discrete Category Group + Category columns your groups/categories (matched to existing ones where the names line up), and
cleared / uncleared / reconciledthe matching ledger states. - …Plan.csv - your monthly budget assignments. Each month's Budgeted value is written to the matching category and month here (categories are created as needed; an existing assignment for the same category + month is overwritten; $0 rows are ignored).
Special YNAB rows are handled for you:
- Inflow: Ready to Assign income lands in an Income category so it feeds Ready to Assign here too.
- Starting Balance rows import as ordinary transactions - if the target account already has an opening balance, they'll be flagged as possible duplicates for you to resolve.
- Transfers (payee "Transfer : …") import as plain uncategorized rows in each account, so balances stay exact. They are not re-linked as paired transfers.
- Flag colors are not imported.
Importing investments
Investment imports target one investment account (brokerage, retirement, HSA, or crypto wallet) at a time, chosen in the preview. Two file shapes are supported:
Trade history
| Column | Required | Accepted values |
|---|---|---|
Date (or Trade Date, Run Date) | Yes | Same formats as transactions. Future dates are rejected per-row. |
Action (or Type, Side) | Yes | Anything containing buy/purchase or sell. |
Symbol (or Ticker) | Yes | e.g. VOO, BRK.B, BTC. |
Quantity (or Units, Shares) | Yes | Positive decimal. |
Price | Yes | Per-unit price. |
Fees (or Commission) | No | Folded into cost basis on buys, out of proceeds on sells. |
Asset Class | No | stock, etf, crypto, bond, mutual_fund, commodity, derivative, other. Defaults to stock. |
Trades apply oldest-first; sells consume your buys first-in-first-out, so realized gains come out right. A sell larger than the units held at that point is skipped and reported. Imported trades record no cash movement - they reconstruct your positions, not your cash ledger.
Current holdings
A simpler snapshot when you don't have full history: Symbol, Quantity, optional Cost Per Unit (omit it and the position imports without a cost basis - gains show once a basis exists), optional Asset Class and Acquired date.
Flagged rows & the review flow
Some imported rows come in flagged for attention rather than being dropped - you stay in control of each one. A row is flagged when it looks like a possible duplicate (it matches an existing transaction on date + amount), when it has a zero amount, or when it's missing a payee:
- The preview tells you how many rows will be flagged, and why, before you import.
- Afterwards, a warning banner sits at the top of the account until every flag is resolved - for a possible duplicate, the balance may be double-counted until then.
- Each flagged row shows a chip naming the reason - Possible duplicate, Zero amount, or Needs a payee - with Keep (it's fine - clear the flag; add the payee inline first if it's missing) and Remove (delete it and re-adjust the balance).
- Approve all in the banner clears every flag at once.
Troubleshooting
- "Could not recognize the file's columns" - the header row is missing or unnamed. Add headers matching the tables above (minimum: Date, Description, Amount).
- Dates land on the wrong day/month - use the date-format picker shown in the preview, or re-export with ISO dates (
YYYY-MM-DD). - Amounts have the wrong sign - Pocketwatch expects spending negative. If your bank exports spending as positive with a separate column, rename the columns to
Outflow/Inflow. - Excel files - save/export as CSV first (
.xlsxisn't supported). - Limit errors (409) - imports respect your plan's resource caps (accounts, categories, groups). Delete unused ones and retry; failed imports write nothing.
Last updated June 19, 2026