Rules and splits
How to split one bank line across several accounts, name its payee, and teach Evenbead to do the same every time with a rule that can match on an amount and an account and split by percentages; and how money in from a customer becomes a sales receipt. (Dated 2026-10-16; ADR-0164, ADR-0175.)
Split a bank line
On Banking, a line waiting for a category has Split…. The split page shows one part per category, each with its own account, amount, class, project and memo.
- What is left to assign shows under the parts as you type, in dollars: "$42.17 left to assign of $84.21", "$10.00 over $84.21", or "Adds up to $84.21". Post the split waits until the parts add up to the line exactly, and says what is missing.
- Assign the rest on a part fills it with what the other parts leave.
- Add a part adds a row (up to 50).
- Without JavaScript the page works the same way: Add a part and Assign the rest reload it with what you typed, and posting a split that does not add up answers with what is off ("The split adds up to $32.17, but the bank line is $42.17. Add $10.00 to a split line").
Over the API: POST /v1/bank-lines/{id}/categorize with splits (each part account, amount_cents, optional class, project, memo); a split that does not add up is a validation_error whose details.split_total holds both amounts. MCP: categorize_bank_line.
The payee
Every way of coding a bank line (the categorize row, the split page, the API) takes a payee: pick one of your contacts or type a new name. Left empty, the payee is the vendor read from the bank's description.
- Money out coded to expense accounts is recorded as an expense under that vendor (a new name becomes a new vendor), so it shows in Expenses by vendor, on the vendor's page and in 1099 tracking. A matched receipt goes onto the expense.
- Money in coded to income accounts with a customer as the payee is recorded as a sales receipt for that customer, deposited to the line's own bank account (a split posts as one sales receipt with a line per part). It shows in Sales by customer and on the customer's page, and the bank line links to it. On money-in lines the field reads Customer and prefers a customer of the name you type. Evenbead never adds a customer from a bank line: pick one you already have.
- Anything else (a balance-sheet account, money into a card account, a vendor on money in) posts as a journal entry whose description starts with the payee's name.
Undo categorization on the Categorized tab voids the expense or sales receipt and puts the line back to waiting.
API: payee_id (a contact) or payee (a name) on categorize; the answer's document is the expense or sales receipt.
Rules
Banking, Rules and suggestions lists every rule in words: When ("text contains “OAKWOOD”, money out, amount is more than $1,000.00") and Then ("split: 80% to 6700 Rent, $150.00 to 7000 Utilities, the rest to 6300 Insurance; payee Oakwood Properties"). Rules run in priority order (lower first); the first that matches a line wins.
New rule (or Edit on a rule) opens the rule's form:
- When a bank line… contains some text (in its description or payee), is money in or money out, and has an amount that equals a figure, is between two figures (both included), is more than or is less than a figure. Amounts are the line's size, whichever way the money goes.
- On these accounts: tick one or more of your bank and card accounts to limit the rule to their lines. Nothing ticked means any account (every rule made before works that way). The rule then reads "on Operating Checking ...1234, text contains …".
- Then… an optional payee to record (a vendor for money out; for a money-in rule, a customer, whose lines then post as sales receipts; a new name typed here is added as a customer for a money-in rule and as a vendor otherwise), and either one account (with a class and project) or a split across accounts: each part is a percentage of the line, a fixed amount, or the rest. Exactly one part takes the rest.
- Test this rule shows the lines waiting to be categorized that it would match now and what it would do to each, to the cent, before anything is saved ("split $131.20 to 7000 Utilities, $56.23 to 6700 Rent"). A line an earlier rule takes first says so.
- Saving an edit keeps the old version in the rule's history: rules are never changed in place.
A line that matches a split rule offers Split as the rule says… on the Banking page: the split page opens filled in from the rule.
How a split rule rounds
For each line, fixed amounts are taken as written; each percentage part is the line's amount times the percentage, rounded to the nearest cent (half a cent rounds up); the part that takes the rest gets what is left. So the parts always add up to the line exactly: 33.33%, 33.33% and the rest of $100.00 are $33.33, $33.33 and $33.34. When a line is too small for the template (a part would be $0.00 or less, e.g. a $5.00 fixed part on a $3.00 line), the rule does not split it: the line waits for you.
Rules and AI agents
Agents follow your rules: a coding that is exactly what a rule a person made says for the bank's own line (the same accounts, the same split to the cent, the rule's payee, a line of one of the rule's accounts) posts on its own within the agent's limit, and the proposal and the audit log say which rule allowed it. Anything else an agent does with that line (another split, one account under a split rule, another payee) waits for a person.
Money in from a customer: an agent's coding that names a customer (it would become that customer's sales receipt) waits for a person, unless a rule a person made sets that customer as the payee for the line; then it posts as the rule says, as a sales receipt. A deposit that payments waiting in Undeposited Funds explain is never an agent's income, rule or not: match it to the deposit instead.
An agent never makes or changes a rule. It may ask for one (createBankRule / replaceBankRule, MCP create_bank_rule / replace_bank_rule): the request waits in Approvals, showing the rule in words and the lines it would match. A person who may make rules ("Create and edit categorization rules") approves it, and the rule is then theirs. Until then it codes nothing.
API: POST /v1/bank-rules with amount_condition (op: equals, between, over, under; amount_cents, to_cents), bank_account_ids (one or more; leave it out for any account), payee_id and split (each part account with percent, amount_cents or remainder: true); POST /v1/bank-rules/preview to test one (MCP preview_bank_rule); every rule comes back with conditions_text and coding_text.