Some banks export usable CSVs. Some don't. AI bank statement import (sometimes called Smart Import) is the fallback for everything else — paste a block of statement text, drop in a PDF, or upload a screenshot, and the AI extracts a clean list of transactions you can review before saving.
When to use it
- Your bank's CSV is malformed or missing key columns.
- All you have is a PDF statement.
- You took a screenshot of a transaction list.
- You copied text out of a banking site that doesn't offer downloads.
If you have a clean CSV, CSV import is faster and more deterministic — use that instead.
Run an AI import
- Go to Transactions.
- Tap Import Transactions and choose AI mode (Smart Import).
- Paste the text or upload the PDF / image.
- Wait for the AI to parse — it returns a list of transactions with date, amount, description, and a suggested category.
- Review every row. Adjust amounts, fix descriptions, override categories where needed.
- Apply your auto-categorization rules if you want them to run.
- Confirm and import.
Email drop
If the receipt is sitting in your inbox, you don't have to copy-paste anything. Drag the email from your mail client (Outlook, Apple Mail, Gmail web — anything that lets you drag an email out) directly onto the Smart Import drop zone. We pull the body text, plus any image attachments through vision and any PDF attachments through text extraction. Counts as one Smart Import use, no matter how many attachments came along for the ride.
A few clients drop the email as an HTML payload instead of a file (Outlook on the web, Gmail web). That works too — same path, same result.
By default the source email is attached as the receipt for every transaction it produces — uncheck "Attach source as receipt to all imported transactions" in the preview if you'd rather not. The same auto-attach applies when you upload a PDF or image via Smart Import.
What gets extracted
For each row the AI returns:
- Date — usually the post date.
- Amount — positive number, with the sign inferred from context.
- Description — the cleaned merchant or counterparty.
- Suggested category — best guess based on the description; you decide whether to keep it.
Confidence scores are shown when the AI isn't certain — anything under "high" deserves a quick second look in the preview.
On desktop, the category dropdown for each row shows how much budget is left for that category in the row's month — e.g. Groceries — $150 left, or Lunch — over by $12 — so you can file each transaction against the right category without leaving the preview. If you create a new category from the dropdown ("Create New Category"), it becomes immediately selectable for that row's month.
Cleaner merchant names (Apple Pay, Square, Toast)
Mobile-wallet and point-of-sale charges arrive cluttered — Aplpay Meijer Store, Tst* Deckers, Sq *Boulevard Lounge, Aplpay Bp#3686458Sp. The merchant name is already in there; the Aplpay / Tst* / Sq* prefix and the trailing store number are just noise. BudgetLabs strips that automatically in the import preview, so you see Meijer Store, Deckers, Boulevard Lounge, and BP. The raw bank text is never thrown away — it appears on the small "Original:" line under the cleaned name and is stored with the transaction, so deduplication and your rename rules still match against it.
This is cosmetic cleanup of what the merchant already sent. It can't recover what you bought from an aggregator like Amazon.com or Apple.com/Bill — that item-level detail isn't in the bank feed at all.
How uploads work
When you upload a file, BudgetLabs picks the right path automatically:
- Digital PDFs (anything you downloaded from your bank's website) — text is extracted in the browser and only the cleaned text is sent to the AI. Cheap, fast, and works for the vast majority of bank statements.
- Scanned PDFs and images (photos, screenshots, paper statements you scanned) — each page is rendered as an image and sent to the vision-capable AI. Slower and counts the same against your daily limit, but handles everything text extraction can't.
Limits:
- 8 MB max per file.
- 10 pages max for the vision fallback. If a scanned PDF is longer, only the first 10 pages are processed.
- PDF, PNG, JPG, and WebP are supported.
Tips for clean results
- One statement per import. Mixing accounts confuses the parser.
- Crop screenshots tightly — extra UI chrome can be misread as transactions.
- For PDF statements, the searchable text version (not a scan) parses much more accurately.
Pick up where you left off
Reviewing a long statement in one sitting isn't always realistic. If you close the import part-way, your work is saved — the parsed rows, the categories you picked, the splits, all of it.
The next time you open the Dashboard or Transactions, a prompt tells you so: "You have an unfinished import from 8/29/2026 — 42 transactions · 6 still uncategorized." Tap Resume import and you're back in the preview exactly where you stopped. Opening Import Transactions directly offers the same choice — Resume or Discard — on its first screen.
Two things worth knowing:
- The draft belongs to the budget, so you can start on a laptop and finish on your phone.
- It doesn't keep forever. A draft is deleted the moment you finish or discard the import, and automatically after 30 days of no activity. If you started something a while ago, resume it rather than leaving it.
Limits and pricing
Smart Import is one of the things Pro actually unlocks. Free users get 1 Smart Import per day — enough to try it. Pro lifts that cap. See Plans & billing for current pricing.
Privacy
The text or image you upload is sent to BudgetLabs's AI provider (xAI's Grok) for parsing. The provider does not retain it, and BudgetLabs doesn't store the source — only the structured transactions you confirm. Don't paste anything more than you need: account numbers and addresses don't help the parser.
Splitting a transaction at import
If one imported row spans multiple categories — say a $237.31 phone bill that's part business and part personal — you can split it right in the preview without saving it first:
- In the preview table, click the Split icon (the branching-arrow icon next to the Ignore button) on the row.
- Two sub-rows appear below the parent. Pick a category for each.
- Type a dollar amount into the first sub-row (e.g.
70). The second sub-row auto-fills as the remainder (e.g.167.31) so the splits always sum to the original amount. - Click + Add split to add a third (or more) category.
- Click Import and Close as usual. Each parent saves as a single transaction with per-category allocations — any attached receipt lands on the parent.
To split a transaction after import, open it in the Transactions list and use the split flow there — both routes produce the same end result.
How import deduplication works
BudgetLabs checks every row in the import preview against your existing transactions using both the raw bank description and any description you've manually edited. This means if you renamed "AMZN Mktp US*2X4B9" to "Amazon" last month, a new import of the same bank string still shows up as a possible duplicate — the dual-key check catches it even after a rename.
If the importer flags a row as a possible duplicate and you disagree, you can override it in the preview and import anyway.
Check whether a row is already in your budget
The importer only flags rows it's fairly sure about. To check one yourself, click the magnifier next to the row's status. A panel opens under the row, already searched for the row's merchant within ±7 days, and lists matching transactions from any category or month — marked Same merchant & amount, Same amount or Same merchant. Change the search words, the amount range (Exact, ±$0.50, ±$5, Any amount) or the date window (up to ±31 days) to widen or narrow it. If you find it, click Mark row as already imported: the row is skipped when you import and shows what it matched, with an Undo link.
Use a category from another month
The category picker is searchable — start typing to filter. Below this month's categories it lists Other categories: ones from earlier months, or ones removed from this month. Pick one and the row notes Adds this category to {month} on import; when you import, the category is added back to that month so the transaction shows on its dashboard. No need to create a duplicate category.
Clicking outside the import window closes it. Nothing is lost — reopen it with Resume import.
Confirming a duplicate (and helping the matcher learn)
When a row is flagged as a "Possible Dup", you have two options:
- Import it anyway (default): leave the row in the preview and confirm as usual. BudgetLabs records this as implicit feedback that the suggestion was wrong.
- Confirm the duplicate: tap the green ✓ (checkmark) button on the badge. The badge changes to "Confirmed Duplicate" and the row is removed from the import count — it won't be saved when you confirm. BudgetLabs records your confirmation and uses it to tune the matcher over time.
A small accuracy line appears below the filter pills (for example, "Matcher accuracy: 87% (42 samples)") once you have at least 10 feedback samples. It reflects how often the duplicate detector's suggestions have matched your decisions.
Your confirmations and the incoming row's date, description, and amount are stored encrypted at rest. They are used only to improve duplicate detection — never shared with third parties. See the Privacy policy for details.
Adjust an amount before importing
Banks post the pre-tip charge — the table amount, not what you actually paid. If you need to correct a figure before it lands in your budget, click the amount cell directly in the preview table:
- A small popover opens. Enter the corrected amount (e.g.
55.00for a $45 charge with a $10 cash tip). - Optionally add a brief reason (e.g. "added $10 cash tip") so you know why the figure was changed.
- Click outside or press Escape to close, then import as usual.
BudgetLabs stores the original bank-reported amount in the background, so if you import the same statement again later the row is still detected as a duplicate — the dedup check uses the bank figure, not your edit. A +$X.XX · reason badge appears on the transaction row in the Dashboard and Transactions list after import.
You can also adjust the amount on any existing transaction from the Transactions list — see Transactions → Adjust the amount on a transaction for the full flow.
Tag the whole statement to one account
Most statements come from one account — this month's Amex, or this month's checking. Instead of linking each transaction afterward, pick the account once at the top of the preview, next to Target Month.
The Paid With dropdown lists two groups:
- Credit Cards — your revolving accounts (credit cards, HELOCs, lines of credit) that aren't marked paid off. Every purchase in the batch is added to that card's balance on the Debt Tracker. Refunds and statement credits keep their negative sign, so they subtract instead.
- Cash Accounts (debit) — your checking and savings accounts. A debit card isn't a separate thing here: it's the cash account it draws on. Purchases lower that account's balance and deposits raise it, because each row's own category already says which direction the money moved. That means a single checking-statement import handles your paycheck and your debit purchases in one pass.
Under the dropdown you'll see how many rows the tag will actually reach — for example, "Adds 34 of 41 rows to that card's balance." The gap is deliberate, and it's shown so you can tell a skipped row from a bug:
- On a credit card, income rows are skipped (a cashback credit filed as income would raise the card balance instead of lowering it), and so is any row whose category is set up to pay that same card — a transaction can't both pay a card and be charged to it.
- On a cash account, transfers out to another account are skipped. BudgetLabs treats a linked account as the destination of the money, so tagging the source would raise the account it just left. Link those rows by hand.
The tag applies to the batch you're previewing. If you use Import Ready and then paste a second statement, pick the account again — it clears deliberately, so a new statement never inherits the last one's account.
You can always change or clear the account on an individual transaction afterward from the transaction's edit form.
Auto-applied rename rules
If you've previously renamed a transaction, BudgetLabs saves a rule that applies your preferred name to future imports automatically. You only have to rename once — every subsequent import of the same merchant arrives already cleaned up. You can view and manage these rules in Settings → Rules.
Related
- CSV import — faster when your bank exports clean CSVs.
- Auto-categorization rules — apply during the AI import preview.
- Receipt scanning — for single-receipt OCR.