Getting your data in
Every way into Expensicat, from dropped files and forwarded email to bank history and bulk imports
Your books stay current only if data keeps arriving. Expensicat has several ways in, and they are meant to be mixed: connect the bank, forward the receipts, drop the odd PDF by hand. Pick the ones that fit how you already work and ignore the rest. Nothing has to be set up in a particular order.
Whichever path a file takes, it ends up in the same place. Documents are read, the vendor, date, and amounts are extracted, and each one is matched against your bank transactions. Confident matches are applied and stay visible. Anything ambiguous waits in the review queue on your dashboard with the reasoning attached.
Everyday capture
Drop files into your inbox
Drag a file onto the Inbox and it lands there directly. A receipt can also be dropped straight onto a transaction to attach it to that transaction.
Dropped files go into the same pipeline as everything else: text extraction, then matching. Processing counts against your plan's monthly document allowance, and uploads are blocked once it runs out.
Your inbox address
Every organization has its own address in the form <inbox_id>@inbox.expensicat.com. You will find it in Settings, under Integrations, Inbox. Email a receipt to it, or forward one from any mailbox, and the attachments are processed the same way a dropped file is.
Limits per email: 5 attachments, 10 MB each, 25 MB total. Per organization: 300 emails an hour, which is high enough to forward an archive in bulk.
If the address ends up somewhere you would rather it hadn't, "Change" in the same settings screen issues a new one and switches the old one off immediately.
Forward from Gmail without connecting your mailbox
You do not have to give Expensicat access to your email. Gmail can forward the mail you pick, your filter decides what that is, and we only ever receive what the filter sends.
- In Gmail, open Settings, then "Forwarding and POP/IMAP", then "Add a forwarding address", and paste your Expensicat inbox address.
- Google emails a confirmation to that address. Expensicat catches that email and relays it to you as a notification, and it is also listed on the inbox settings screen you copied the address from. Depending on the format Google uses, that is a confirmation link to open or a code to type into Gmail, and the original email is always one click away, so you can see exactly what Google sent. The confirmation email is treated as what it is, a control message. It creates no inbox entry, no document, and it does not count against your hourly email limit.
- Open the link, or type the code into Gmail, to confirm the address.
- Create a Gmail filter for the mail you actually want forwarded (
has:attachment, or the vendors who invoice you), and set its action to forward to your inbox address.
A few things about step 2 worth knowing. The confirmation reaches owners and admins, and it arrives the moment Google sends it, so if you set up forwarding in another tab, it is already waiting when you switch back. Each mailbox you forward from gets its own confirmation, so verifying two or three accounts against the same address works fine. Once you have confirmed in Gmail, dismiss it like any other notification. Gmail is the only mail service we catch these confirmations from today; on Outlook, use the connect path below.
Originals stay in Gmail. Nothing else in your mailbox is read, searched, or stored, because nothing else is ever sent to us. If handing an accounting tool the keys to your email feels wrong, this is the setup we would point you to. That instinct deserves a real answer rather than a permissions screen.
Connect Gmail or Outlook
The shorter path. Connect the account in Settings, Integrations, and attachments on incoming mail are captured as they arrive, with no filter for you to maintain.
Send a photo of a receipt, or a PDF, to Cat on WhatsApp. It goes through the same extraction and matching as anything else and you get the result back in the chat. Voice notes and videos are not supported.
Getting your history in
Bank connections
Connect an account through GoCardless in Settings, Banking. Syncs run on their own over a rolling 90-day window; for history beyond that, import a bank export below.
We read transactions. Expensicat never moves money.
Import a CSV or XLSX
For accounts you cannot connect, or would rather not, transactions import from a bank export. Open Transactions, then Import: drop the file, map the columns, watch it run. CSV, XLSX, and XLS all work.
Date, amount, currency, and a transaction ID are required. Name, description, IBAN, and a debit/credit column are optional. Columns are guessed from the headers and you correct the guesses before anything is written, with the first rows previewed as they will land. Rows whose transaction ID is already on file are skipped as duplicates. A large file keeps importing in the background if you close the dialog.
CLI and API
For an actual migration, the CLI moves things in bulk:
expensicat document upload ~/receipts-2026 --recursive --pattern '*.pdf'Most create commands read JSONL on stdin, so customers, invoices, transactions, categories, projects, and tasks can be piped straight out of another system's export:
cat customers.jsonl | expensicat customer create --batch -Run expensicat --help for the full list. The REST API covers the same resources if you would rather drive it from your own script.
What we do not do
- We do not read your mailbox unless you connect it. Forwarding sends us only the mail your own filter matches, and your originals stay in your mailbox.
- We do not move money. Bank connections are read for transactions and nothing else.
- We do not become the only copy of anything. Your documents and books export whenever you want them.