💶 CaliMoney

Documentation

Import from file

Upload a bank statement or CSV export and create movements automatically

CaliMoney can read a bank statement or CSV export and create all the movements for you in a single import.

Tap the ↑ button next to the search bar on the movements list to open the import wizard.

On Android, with CaliMoney installed on your home screen, you can also start from your bank's app or your file manager: Share a statement or a photo and pick CaliMoney. The wizard opens with the file already loaded, exactly as if you had chosen it in the picker — the same size limits, and the same rules online and offline. The file waits on your device only until the wizard picks it up, and is removed when you log out. (iPhone and iPad don't let web apps receive shared files, so there you use the picker.)

Supported formats

FormatNotes
CSVComma- or semicolon-separated; quoted fields supported
Excel.xlsx / .xls — first sheet used
PDFBank statement PDF — each page is rendered to an image on your device, then sent to the AI
TXTPlain text transaction list

Maximum file size: 5 MB.

How it works

Upload — drop the file or tap to browse. CaliMoney validates the type and size before sending.

Extract — an AI model reads the file and identifies each transaction: date, description, and amount. Signs are normalised automatically (debits become negative, credits positive).

Auto-categorise — each transaction's description is matched to one of your existing categories by an AI model, which is also shown a sample of your recent movements so it can follow the way you already categorise — unless encryption is on, in which case no past movement is sent. Rows the AI isn't confident about are left without a category, so Apply to all (below) can fill them in.

Review — an editable table lets you inspect every row before committing. You can change the type or category, deselect rows you don't want, or remove rows entirely.

Import — tap Import N movements. Movements are saved locally first and synced to the cloud when online, using the same write path as manual entries.

Importing without AI

CSV and Excel files can be read entirely on your device — no upload, no AI, works offline.

  • Offline, this is the only option: the picker still accepts CSV, Excel and text files (PDF and photo need a connection) and reads them locally.
  • Online, tick Skip AI — process on this device (CSV/Excel only) before choosing a file, if you'd rather nothing left your device, or just want it faster.

Column detection (date, description, amount) runs on-device, matching header wording in English and Italian and a handful of real bank export formats. If it can't work out every column on its own, you'll see a short screen asking you to pick which column is which, with a preview of the first few rows.

Rows from this path have no auto-categorisation — there's no AI step to run it. When some rows have no category, the review screen offers Apply to all: pick a type and category once and it fills in every row that's still missing one, so clearing forty uncategorised rows doesn't mean forty taps.

Review table

Each row shows:

  • Checkbox — deselect to skip this row
  • Date — extracted from the file
  • Description — cleaned merchant or payee name
  • Amount — red for expenses, green for income
  • Type / Category — AI suggestion; editable via dropdowns. Subcategories are listed under their parent as Food › Groceries, and the AI sees them the same way
  • ⚠ badge — possible duplicate (same date + amount already in your movements)

The header shows a summary: 47 found · 1 duplicate · 46 selected.

Duplicate detection is approximate — it matches by date and amount. Check amber-flagged rows before importing.

Undoing an import

Imported the wrong file, or the right one twice? On the success screen tap Undo this import, then tap again to confirm: every movement that import added is deleted in one go. Rows it skipped as duplicates were already yours, so they are never touched, and a movement you already deleted by hand is simply skipped.

The undo stays available on the import screen (Undo the last import) until you import another file, close the tab or log out — after that, delete movements one by one from the list. It works offline too: movements that never reached the cloud are just dropped, and the others are deleted on every device at the next sync.

Privacy

  • The file you upload is sent to the AI provider for extraction — that includes the amounts, dates and descriptions it contains, and anything else printed on it (such as account numbers or names). PDFs (first converted to page images on your device), photos and text all go to Fireworks AI with zero data retention: the file and the result are never stored and never used for training.
  • The auto-categorise step sends each transaction's description, your category and type names, and — only when encryption is off — up to 20 recent movement descriptions as examples. Amounts and dates are not sent at this step.
  • Encrypted movements are never used as examples. If you use end-to-end encryption, your encrypted history stays on the device.
  • All movements are saved locally to your device first; cloud sync follows the standard offline-first path.

If encryption is enabled, imported movements are encrypted using your passphrase before being written to Firestore — exactly like manually added movements.

Limits

  • Excel files are capped at 500 rows (rows beyond that are ignored while parsing) — this applies on both the AI and the on-device path, since both read an Excel file the same way. A CSV file read on-device has no such cap.
  • PDF size is capped at 5 MB by the upload validator.
  • Auto-categorisation sends up to 25 rows per request; a statement of a few hundred rows takes a few seconds, and a little longer if you import several files back to back.