Transaction categorization for lenders, from the PDF statement to the credit decision
For credit and lending operations teams, and the engineers who build their pipelines. See the categories that change a credit decision, one statement labeled line by line, and the rows that still need a person.

Key takeaways
- Transaction categorization labels each bank statement line by what the money is, such as revenue, a transfer, a loan payment or a fee.
- A lender needs only the categories that change a number in the credit decision. Spending labels like groceries or travel rarely do.
- PDF statements need one more step. Most categorization APIs take rows, so the rows have to be extracted first. If a minus is read as a plus, the row gets the wrong category.
- Rules label the lines from payers and payees you already know, such as transfers from the applicant's other accounts and payments to known lenders. A model labels the rest, with a score for how sure it is.
- Category totals have to match the statement. Deposits across all categories should equal the statement's total deposits, or a row was missed or misread.
On this page
- The categories that change a credit decision
- One business statement, labeled line by line
- How categories turn into underwriting numbers
- From PDF pages to labeled rows
- Rows that should reach a person
- Setting up categories for your own credit policy
- Start with files your credit team has already decided
- Frequently asked questions
Transaction categorization labels each line on a bank statement by what the money is. Typical labels are revenue, a transfer between the applicant's own accounts, a loan payment or an overdraft fee. Lenders add up the labeled lines to find revenue, monthly debt payments and how often the account didn't have enough money. When statements arrive as PDFs, the rows have to be extracted and checked before anyone can label them.
The categories that change a credit decision#
Budgeting apps and accounting tools sort spending into dozens of categories, such as groceries or travel. A lender needs far fewer. The test for each one is simple. Does the label change a number in the credit decision? These six usually do.
Revenue or income
Card processor payouts, customer payments and cash from sales. On a consumer loan, it means paychecks and benefits. A new loan gets repaid from this money.Transfers between own accounts
Money the applicant moves in from savings or from another account they own. It isn't new money, so counting it as revenue counts the same dollars twice.Other deposits that aren't revenue
Loan proceeds, money the owner puts in, and refunds or reversed deposits. They raise the balance without a sale behind them.Debt payments
Loan payments, merchant cash advance (MCA) debits, equipment leases and credit card payments. Together they show what the applicant already pays lenders each month.NSF and overdraft events
Overdraft fees, NSF (non-sufficient funds) fees, and payments the bank declined for lack of funds. They show the account didn't have enough money when a payment came due.Payroll and fixed costs
Payroll and rent, plus the suppliers a business pays every month. The business has to pay these first, so they leave less money for a new loan payment.
The same kind of line can belong in different categories for different lenders. On a consumer loan, a payroll deposit is the applicant's income. On a business loan, the payroll the business pays out is a cost. So build the list from your credit policy, not from a tool's default list.
One business statement, labeled line by line#
Harbor Street Bakery LLC banks with First Midwest Bank. Its July statement has 142 transactions on six pages, and the figure shows seven of them.
| Field | Extracted value | Confidence |
|---|---|---|
| Account holder | Harbor Street Bakery LLC | |
| Address | 118 Harbor St, Portland, ME | |
| Bank name | First Midwest Bank | |
| Account number | •••• 4821 | |
| Account type | Business checking | |
| Statement period | 2026-07-01 → 2026-07-31 |
| Field | Extracted value | Confidence |
|---|---|---|
| Opening balance | 42,180.55 | |
| Total deposits | 88,412.10 | |
| Total withdrawals | 91,686.44 | |
| Closing balance | 38,906.21 | |
| Transaction count | 142 |
| Field | Extracted value | Confidence |
|---|---|---|
| Date | 2026-07-14 | |
| Description | ACH DEPOSIT STRIPE PAYOUT | |
| Amount | +3,284.10 | |
| Debit / credit | Credit | |
| Running balance | 51,902.44 | |
| Category | Card processor payout |
Here is how a credit team would label those seven rows.
| Line on the statement | Amount | Category | Why |
|---|---|---|---|
| ACH DEPOSIT SQUARE INC | +4,812.30 | Revenue | Square pays out the bakery's card sales |
| PAYROLL GUSTO | −6,420.00 | Payroll | Gusto is a payroll provider |
| WIRE IN BAYSIDE FOODS | +9,150.00 | Revenue, once confirmed | Bayside Foods may be a customer, but the line doesn't say so |
| CHECK #1042 | −1,104.51 | Unknown | The line shows no payee |
| ACH DEPOSIT STRIPE PAYOUT | +3,284.10 | Revenue | The figure's label, Card processor payout, counts as revenue |
| CARD PURCHASE SYSCO | −2,318.72 | Supplier | Sysco is a food distributor |
| RENT HARBOR PROPERTIES | −5,800.00 | Rent | Rent is a fixed monthly cost |
Five of the seven rows are easy. A rule that knows the big card processors labels Square and Stripe as revenue. A payroll rule catches Gusto. A list of known suppliers covers Sysco, and the rent line says RENT. The running balance shows whether each amount came in or went out. On the Square row, the opening balance of 42,180.55 plus 4,812.30 is 46,992.85, the balance the statement prints.
The other two rows need a person. The Bayside Foods wire is the largest of the seven amounts shown, and it looks like a payment from a wholesale customer. It could also be a loan, or money from an investor. If you count the wire as revenue, revenue in the seven rows shown is $17,246.40. If you leave it out, revenue in those rows is $8,096.40.
Check #1042 can't be labeled from the statement at all. The line gives a check number and an amount, and nothing about who was paid. Only the check image or the applicant can answer that.
How categories turn into underwriting numbers#
Most numbers in a credit review are category totals. So one wrong label changes a total.
Revenue starts from total deposits. Then every deposit that isn't a sale comes off. That means transfers from the applicant's own accounts and loan proceeds. It also means refunds and reversed deposits. Harbor Street's July deposits total $88,412.10, and each deposit labeled a transfer or loan proceeds comes off that figure. Lenders call what's left true revenue, and underwriters compare it with the revenue on the application. Bank statement analysis works through the math.
Debt payments work the same way on the other side. The loan and MCA debits in a month add up to what the business already pays its lenders. Miss one, and the business looks able to carry more new debt than it can. Label a supplier payment as debt, and it looks able to carry less.
NSF and overdraft events show that the account didn't have enough money. The Consumer Financial Protection Bureau (CFPB) explains the difference. With an overdraft, the bank pays the transaction even though the balance is too low. With an NSF, the bank declines the payment. Both mean the money wasn't there, so count both.
A count built only from fee lines can come out low. In October 2023, the CFPB found that nearly two-thirds of banks with over $10 billion in assets had stopped charging consumers NSF fees. All banks with over $75 billion in assets had stopped too. When those banks decline a consumer's payment, no NSF fee line appears on the statement. So an NSF count that looks only for fee lines can miss the event. Where the count matters to the decision, ask the applicant whether any payments were declined.
Mortgage files use deposit categories to decide what needs proof. Fannie Mae defines a large deposit as a single deposit over 50% of the total monthly qualifying income for the loan. On a purchase, the lender must document that those funds come from an acceptable source. That applies when they go toward the down payment, closing costs or reserves. Some deposits need no further explanation, as long as the statement prints their source. Fannie Mae's examples are payroll from an employer, Social Security, an IRS or state tax refund, and a transfer between verified accounts. So the label on a deposit decides whether the file needs more paperwork. Income verification covers the pay stubs and tax returns behind those deposits.
From PDF pages to labeled rows#
Most categorization APIs start from rows, not pages. Plaid Enrich, for example, takes each transaction's description and amount. The amount comes without a plus or minus. A separate field says whether the money came in or went out, and another gives the currency. Plaid Enrich returns a merchant and a category. A bank feed from an aggregator, a service such as Plaid that connects to the applicant's bank account, already arrives as rows. A PDF statement arrives as pages, so the rows have to be extracted first.
Reading errors turn into category errors. A description that wraps onto a second line can lose the merchant's name. A table that continues on the next page can drop a row at the break. Some banks print deposits and withdrawals in separate columns. Reading the wrong column turns a minus into a plus. If a withdrawal is read as a deposit, revenue goes up by money the business never received.
The running balance catches a misread amount, and a minus read as a plus. Each row's balance should equal the balance on the row before, plus or minus the amount. On the Gusto row, 46,992.85 minus 6,420.00 is 40,572.85, which matches the statement.
- Downloaded PDFs
- Scanned statements
- Multi-month files
- 01Extract every row
- 02Check running balances
- 03Apply your category rules
- 04Review exceptions
Docsumo reads bank statements from PDFs and scans. When the transaction table runs across pages, Docsumo joins the parts into one table. It checks each transaction against the statement's running balance. Values Docsumo isn't sure of go to your reviewers. When a reviewer clicks one, Docsumo highlights the line in the statement that the value came from. Reviewer corrections to extracted values also improve the model. Grid Finance, a lender that uses Docsumo, reads complex statements in under a minute each, at 94%+ accuracy.
Docsumo works from the statements applicants send. It doesn't connect to bank accounts the way aggregators such as Plaid do. If your applicants connect their accounts through an aggregator, the rows arrive ready to label.
Rows that should reach a person#
Most rows can be labeled without anyone opening the statement. A few can't, and those are worth a reviewer's time.
- A line with no payee or payerCHECK #1042 shows only a number and an amount. Only the check image or the applicant can say who was paid.
- A large deposit from a name you don't recognizeThe Bayside Foods wire counts as revenue only if Bayside is a customer. Keep it out of revenue until someone confirms it.
- A new fixed debitA payment that repeats on a schedule, and wasn't on earlier statements, can be a loan the application doesn't list.
- A deposit that comes backIf a deposited check is returned unpaid, the money never arrived. Take that deposit out of revenue.
- A row that doesn't match the running balanceThe amount was probably misread, or a minus was read as a plus. Fix the reading before the row gets a category.
- A label below your confidence thresholdWhen the model is less sure than the level you set, a person picks the category.
Our take. Categorization should follow the same rules on every file. A row that matches a rule, or gets a model score above your threshold, goes straight into the totals. A person sees only the rows that are held back, each with the reason and the statement line beside it. If reviewers keep re-checking rows that passed, fix the rule or the threshold that let those rows through.
Setting up categories for your own credit policy#
- Start from the policyList the numbers your credit policy uses, such as revenue, monthly debt payments and NSF events. Keep a category only if it feeds one of them.
- Collect what the file already tells youThe application often lists the applicant's other accounts and existing loans. Rules can use them to spot own-account transfers and known debts.
- Write rules for payers and payees you knowName the card processors, payroll providers and bank fee codes you see, and the lenders that show up often. A rule gives the same answer every time, and a reviewer can see why.
- Let a model label the restA machine learning model reads the description and the amount, and suggests a category with a score for how sure it is. In Docsumo, your own category logic can run as a workflow step you set up. The step can call a large language model (LLM) or run your own Python code.
- Check that the categories add upDeposits across all categories should equal the statement's total deposits, $88,412.10 on the bakery's July statement. Withdrawals should equal $91,686.44. A gap means a row was missed or misread.
- Turn repeat fixes into rulesWhen reviewers change the same kind of row again and again, write a rule for it.
The labeled rows then go to the systems that use them. Docsumo sends the extracted data to your loan system or decision engine through its API and webhooks. It also offers cash flow analytics on the Enterprise plan. Converting bank statements to JSON shows what the data can look like.
Start with files your credit team has already decided#
Pick a month of applications where the credit decision is already made. Run their statements through your setup, and compare each label with how your analyst treated that line. Count the rows a person had to change, and note which categories they were in. If most changes fall in one category, add a rule there before you trust the setup with new files.
Book a demo with a few of your own statements, or start a free trial.
Frequently asked questions#
What are the main categories of bank transactions?
For a lender, deposits split into revenue and deposits that aren't revenue, such as transfers from the applicant's own accounts, loan proceeds or refunds. Money going out splits into operating costs such as payroll and rent, debt payments, and bank fees. NSF and overdraft events get their own category, because they show the account didn't have enough money.
How do you categorize bank transactions automatically?
Start with rules for payers and payees you already know, such as the applicant's other accounts, payroll providers and card processors. A machine learning model labels the rest from the description and the amount, with a score for how sure it is. Rows whose score is below your threshold go to a person. So do rows whose amount doesn't match the change in the running balance.
What is a transaction categorization API?
It's an API that returns a category for each transaction, and often a merchant name. Most take transaction rows as their input. Plaid Enrich, for example, needs each row's description and amount. It also needs to know whether the money came in or went out, and the currency. Plaid Enrich takes data, not documents, so statements that arrive as PDFs need their rows extracted first. Docsumo extracts those rows and sends them on through its API and webhooks.
What's the difference between an NSF fee and an overdraft fee?
A bank charges an overdraft fee when it pays a transaction the balance can't cover, which means it lends the customer the money. It charges an NSF fee when it declines the payment instead, according to the CFPB. Both mean the account didn't have enough money, so count both when you review a statement.
Sources
- Fannie Mae Selling Guide B3-4.2-02: Depository Accounts
- CFPB Office of Research: Overdraft and Nonsufficient Fund Fees (December 2023)
- CFPB Data Spotlight: Vast majority of NSF fees have been eliminated, saving consumers nearly $2 billion annually (October 2023)
- Plaid Docs: Enrich
- Plaid API reference: /transactions/enrich
- Mono Docs: Transaction categorisation
- Yodlee API docs: Transactions, category resource
First published .