Transactions
Every bank and credit card transaction lands here after syncing from connected accounts. Confirm each one is categorized correctly, match payments to invoices or bills, and resolve anything AI could not decide. Categorizing creates a balanced journal entry behind the scenes — a clean list means clean financial statements.
Key capabilities
- Automatic sync from connected accounts, with periodic fallback
- Layered auto-categorization: bank rules, your history, cross-business patterns, then AI
- One-click AI Categorize for the whole uncategorized backlog
- Category suggestions on demand, with a deeper AI pass for unresolved rows
- Link as Payment to settle invoices and bills from the transaction drawer
- Split one payment across multiple bills with allocation tracking
- Bulk recategorize, re-counterparty, mark reviewed, and mark reconciled
- Recurring detection for subscriptions and repeating charges
- CSV/Excel import (file, paste, or column mapping) plus manual creation — with an optional category column that maps straight to your chart of accounts
- Category Consistency tab: a counterparty × category pivot for spotting and bulk-fixing inconsistent categorization
- Attach receipts and documents — DayZero reads each one and captures the merchant, date, totals, and line items, then tells you whether it matches the charge
- Receipts arrive on their own too: import from Ramp, ask the client to upload one, or hand a file to the assistant
- Split by items — turn a receipt's lines into a category split in one click
- Receipt tracking — a receipt policy (expenses of $75+ by default), a coverage summary, a status on every row, bulk Request receipts, automatic client reminders, and No receipt needed for the ones that never will have one
- Cleaned merchant names from the counterparty registry
- Rich filters: account, category, tag, date, amount, uncategorized, missing counterparty, and receipt status (missing, requested from client, has receipt, no receipt needed)
How it works
Transactions flow in from Plaid. DayZero assigns a counterparty and suggested category. High-confidence rows post a journal entry automatically; the rest wait in the uncategorized queue.
flowchart LR
bank["Bank / card"] --> sync["DayZero sync"]
sync --> clean["Clean counterparty"]
clean --> engine["Categorization"]
engine --> confident{"High confidence?"}
confident -->|"Yes"| done["Categorized"]
confident -->|"No"| review["Uncategorized queue"]
review --> doneHow to use it
- Transactions appear automatically from connected accounts.
- Click a transaction to assign a category, add a memo, attach a receipt, or apply tags.
- Use Link as Payment to match an invoice or bill, or split one payment across several bills.
- Click AI Categorize to run categorization over every uncategorized transaction.
- Filter to only uncategorized or missing-counterparty to work the backlog, or use the Receipt column filter to list everything still missing a receipt.
- Select multiple rows to bulk-update category, counterparty, or review status.
- Open Recurring Detection to review subscriptions and repeating charges.
- Open the Category Consistency tab to audit how each counterparty is categorized across history and fix outliers in bulk.
Pro tips
- Uncategorized transactions do not appear on your P&L or Balance Sheet — clear them before close.
- Recategorizing all transactions for a counterparty creates a bank rule for future matches.
- Positive amounts are money in; negative are money out.
- Bank-synced rows can be hidden and restored; manual and imported rows delete permanently.
- Paste text straight from a bank export — DayZero converts it into an importable file.
- With a transaction open, paste a screenshot (⌘V / Ctrl+V) to attach it as a receipt — no need to save the file first.
- Filter to Missing receipt, then export: that file is your receipt chase list. Better, select the rows and press Request receipts — the client is asked, and reminded, for you.
- Bank fees, loan payments, and payroll will never have a receipt. Select them and press No receipt needed once so they stop showing as missing.
- Migrating pre-categorized history? Map a category column at import — rows post directly to those ledgers instead of needing a recategorization pass afterwards.
In-depth guide
Sources and status
| Source | Deletion |
|---|---|
| Bank sync | Hidden (reversible); can be permanently removed |
| Manual | Permanent delete |
| Imported (CSV/Excel) | Permanent delete |
| Imported transfer (Xero/QuickBooks) | Remove at the source |
Each transaction tracks three states independently: posted (appears in reports), reviewed (you verified it), and reconciled (matched to a bank statement).
How categorization is recorded
| Method | Source |
|---|---|
| Bank rule | A rule matched |
| Your own history | Prior pattern on your books |
| Cross-business pattern | Pattern from other businesses |
| AI | AI categorization |
| Similar transaction | Matched a past transaction |
| Internal transfer | Transfer between your accounts |
| Manual | You set it |
| Uncategorized | Not yet categorized |
AI Categorize runs in the background and auto-applies when confident; high-confidence decisions also teach new bank rules. Categorizing posts a balanced journal entry: bank account on one side, category ledger on the other.
Importing transactions
Import via file upload, paste, or column mapping — Preview validates and checks duplicates before creating rows.
Required columns are date, amount, and description. You can also map an optional category column — DayZero recognizes common header names such as Category, Ledger, Account, and Account Name:
- Category names resolve to your chart of accounts by case-insensitive name match, and matched rows post their journal entry directly to that ledger.
- Unknown category names are flagged as warnings in Preview and those rows fall back to normal categorization — fix the names or create the ledgers first for a clean one-pass import.
- Import raw — skip categorization skips the post-upload bank rules and AI pass. Journal entries still post during import: to the mapped category when one is provided, otherwise to Uncategorized Expense/Income. (Local accounting engine only.)
- Transfer detection runs on import (unless you import raw): equal-and-opposite rows landing in two of your account ledgers within a few days are paired and booked as Transfers Between Accounts before rules or AI run, so a transfer leg is never mis-coded as income or expense. Rows with an explicit category-column value are never overridden.
For historical migrations with categories already assigned (e.g. exports from another accounting system), mapping the category column is the fastest path — it replaces the old import-then-bulk-recategorize workflow.
Statements and bank exports
Statement PDF to transactions. A credit card or bank statement does not have to be retyped. Upload the PDF (or a screenshot, CSV or Excel) and choose the ledger it belongs to; DayZero reads every transaction and writes them as an upload file you then preview and import exactly like any other (POST /transactions/bulk-upload/from-statement, or ask the assistant: "here is the Amex PDF, upload September").
- Signs follow the ledger: credit card rows come out charge-positive, bank rows deposit-positive, the same as the import template.
- Pending items are left out unless you ask for them.
- When the statement shows an opening and closing balance, DayZero adds up the extracted rows and tells you whether they tie to those balances, and by how much they are off if not. A gap usually means a missing or duplicated row — check before importing.
- Nothing is imported by this step; the duplicate check, categorization and transfer detection all run in the normal preview and upload.
Fill in who paid, from the bank's own export. Bank feeds often show a wire or a mobile deposit as just "INCOMING WIRE" or "MOBILE DEPOSIT". The bank's activity export carries the originator or payer in extra columns (Originator, Payer, Beneficiary, Additional Details, Memo...). Enrich from export (POST /transactions/enrich-from-export) matches each export row to a transaction you already have (same amount, date within two days, counted one-for-one so three identical deposits stay three) and:
- appends the detail to the description ("MOBILE DEPOSIT · Pearson Education"), and
- sets the counterparty to that name.
It always starts as a preview (dry_run), listing what would change, what did not match, and anything ambiguous. Columns are detected automatically and shown back to you; override them with column_mapping if your bank names them differently. A description or counterparty someone edited by hand is left alone unless you turn on overwrite_user_edits, and a counterparty taken from your invoices or bills is never replaced. Running it twice changes nothing the second time.
Receipts and documents
Open a transaction and use Receipts & documents to attach backup: drop files onto the panel, click Browse, or paste a screenshot. PDF, JPG, PNG, WEBP, and HEIC (iPhone photos) are accepted, up to 20 files per transaction.
Each file is attached first and read second, so your upload is never lost to a slow or failed read. Reading captures:
- Merchant, date, and payment method (with the card's last four when printed)
- Subtotal, tax, tip, and total
- Every line item — description, quantity, unit price, and amount
DayZero then compares the receipt with the transaction and shows a verdict:
| Verdict | Meaning |
|---|---|
| Matches transaction | The receipt total equals the amount charged. |
| Likely tip | The card was charged a little more than the printed total and the receipt has no tip line — normal for restaurants. |
| Charged more / less than receipt | The totals disagree. Check the receipt belongs here, or that it isn't one of several. |
| Total matches, date differs | Right amount, but the receipt is dated more than a week from the posting date. |
| Receipt is in another currency | Totals aren't compared across currencies. |
The verdict is recalculated whenever you open the transaction, so it stays correct if the amount is later edited. If the receipt's merchant differs from the transaction's counterparty, Use as counterparty applies it in one click and remembers it for future transactions from that merchant.
In the grid, the Receipt column shows a paperclip with the file count, tinted by the verdict — amber means a receipt disagrees with its charge — and hovering lists each file with its merchant and total. Use the column's filter for Has receipt or Missing receipt; the filter carries into exports.
If a receipt can't be read (a blurry photo, a blank page), it stays attached and you can Try again. Re-read is always available from the file's row. Removing an attachment only unlinks it from the transaction.
Tracking what's missing
Attaching a receipt is one transaction; tracking receipts is the whole book. DayZero applies a receipt policy to every transaction and gives each one a status, shown in the Receipt column:
| Status | Meaning |
|---|---|
| Paperclip + count | Has a receipt. Tinted amber when the receipt disagrees with the amount. |
| Missing | The policy asks for a receipt, there is none, and nobody has been asked. |
| Requested | Needs one, and the client has an open request for it. |
| Not needed | You marked it as not needing a receipt. |
| faint paperclip | The policy doesn't ask for one — money in, under the threshold, a transfer between your accounts, or a pending charge. |
The policy. By default, expenses of $75 or more need a receipt (the IRS substantiation threshold). Click Policy on the coverage bar to change the threshold, turn tracking off, or tune client reminders. Nothing is stored per transaction, so changing the threshold re-classifies everything instantly. Changing the policy needs admin access.
The coverage bar above the grid summarizes the date range on screen — "82% of expenses of $75 or more have a receipt · 14 of 17" — with one-click buttons for N missing · $X and N waiting on client. Transactions you mark No receipt needed leave the calculation, so doing that raises your coverage rather than leaving it stuck.
Working the list. Filter the Receipt column to Missing receipt, select the rows, and choose:
- Request receipts — asks the client for every selected transaction in one go. They get a single notification, see each request in their Questions tab, and answer by uploading the file. Rows that already have a receipt, a request, or a not needed mark are skipped, so selecting a whole page is safe. (Available when the business is managed through an advisory firm. For Ramp charges, try Import from Ramp first — the receipt is often already there.)
- No receipt needed — for bank fees, loan payments, payroll, and anything else that will never have a receipt. Undo it any time from the transaction.
Open a single transaction and the Receipts & documents section says where it stands and offers the same actions.
Reminders. A client who hasn't uploaded a requested receipt is reminded automatically — every 3 days, up to 3 times, by default — with one message per business however many are outstanding. When they upload, the request closes itself, the file lands on the transaction, and whoever asked is notified.
At close. The period's close readiness check includes a Missing Receipts line (count and dollars, and how many are already with the client). It is advisory — a period can close without them. Firms also get a Missing Receipts Report across all clients, each measured under its own policy.
Getting the receipt without uploading it yourself
A small chip on each file — From Ramp, From client, Via assistant — shows where it came from.
- Import from Ramp. On a transaction synced from Ramp, Import from Ramp fetches the receipts the cardholder uploaded there. DayZero asks Ramp live, so a receipt added days after the charge is still found. It is safe to press again: receipts already imported are skipped.
- Ask the client. With no receipt attached, No receipt? Ask the client for it opens Ask Client prefilled with a receipt request (the same template is one click away from Ask Client in the header). The client sees the question in their portal's Questions tab and can attach a photo or PDF right there — a receipt on its own counts as an answer. Their file lands in this section.
- Hand it to the assistant. Attach a receipt in chat and say which transaction it belongs to ("attach this to the Blue Bottle charge"); the assistant attaches and reads it, and tells you if the total doesn't match.
Files that arrive this way are read the first time someone opens the transaction, so the merchant, totals and line items are waiting for you — no click needed.
Working with receipts in chat
Everything in this section also works by asking the assistant:
| Ask | What happens |
|---|---|
| "Which expenses last month are missing a receipt?" | Lists them under your receipt policy — the same filter as the Receipt column. |
| "How are we doing on receipts for August?" | Coverage: how many are owed, attached, requested, and missing, and the dollars outstanding. |
| "Ask the client for all the missing ones" | Sends the requests in one batch, skipping anything already handled. |
| "Those bank fees don't need receipts" | Marks them as not needed so they stop showing as missing. |
| "Attach this to the Staples charge" (with a file attached) | Finds the transaction, attaches the file, reads it, and reports whether it matches. |
| "Pull the receipt for that charge from Ramp" | Imports the cardholder's receipt from Ramp and reads it. |
| "What did we buy on the Costco charge?" | Reads back the merchant, totals, and line items from the receipt. |
| "That receipt looks wrong — read it again" | Re-reads the file. |
| "Remove the duplicate receipt" | Detaches it (asks which, if there are several). |
| "Split it by the receipt — the chair goes to Furniture" | Splits by the receipt's lines; lines you don't mention stay on the current category. |
| "Ask the client for the receipt" | Sends the receipt request to their Questions tab. |
Changes to your books — attaching, importing, removing, splitting — are shown for your approval first. The assistant won't split by a receipt whose total disagrees with the charge; it tells you about the mismatch instead.
Over MCP the same tools are attach_transaction_receipt, import_ramp_receipts, read_transaction_receipt, remove_transaction_receipt, split_transaction_by_receipt, get_receipt_coverage, request_transaction_receipts and set_receipt_exempt. get_transaction returns receipt_status plus each receipt under receipts[] (merchant, totals, line items, match verdict, and split_lines[]), and list_transactions accepts receipt_status and has_receipt.
Split by items
When a receipt has two or more priced lines and it agrees with the amount charged, Split by items opens the split editor with one row per line. Tax, tip and rounding are spread across the lines in proportion to their price, so the rows always add up to the transaction exactly. Rows start on the transaction's current category — change only the lines that belong elsewhere (the monitor to Equipment, the snacks to Meals), then save. Long receipts keep their ten largest lines and fold the rest into a single Other items row. The option is withheld when the receipt's total disagrees with the charge, so a mismatch is never papered over with tidy category lines.
Category Consistency tab
The Category Consistency tab pivots your history by counterparty × category so you can see, for each merchant, every category its transactions landed in. Inter-account transfers are bucketed separately (detected from the transfer categorization method, connected-account ledgers, and the built-in transfers ledger) so they don't read as miscategorized spend. Select the outlier rows and bulk-recategorize or re-counterparty them in place — the fastest way to break up an overloaded catch-all category or clean up inconsistent vendor coding after a migration.
For ambiguous recurring descriptions (e.g. "Revenue Roll Payment"), use the Description contains… filter: the pivot narrows to matching transactions, a banner shows the match count, and Select all matching stages every occurrence for one bulk category or counterparty fix — resolve the mystery once, apply it everywhere.
Bulk edits, row by row
PATCH /transactions/batch (and the MCP / Regent tool bulk_edit_transactions) edits up to 500 transactions where each row has its own description (or memo), category, counterparty and review status. Every row is validated first: one bad row (unknown transaction, a bank account as the category, a closed period) rejects the request and changes nothing, and dry_run lists every problem per row. Applying is then isolated per row, so a row that fails at write time is reported without undoing the rest. Counterparty edits honour remember (a saved rename for the business, never for payment processors); a description edit keeps the counterparty and marks the row hand-edited so bank syncs do not overwrite it. bulk_edit_transactions_from_csv does the same from an uploaded file, and split_transaction splits one transaction across categories.