How I redesigned bank transaction matching in PracticePanther, so billing teams could trust their books without spending a day checking them.
Accountants and auditors at law firms spent up to a full day each month checking ~1,000 bank lines against the books by hand. One missed dollar could become a bar compliance issue.
Meanwhile, 60% of firms kept their books in QuickBooks, outside PracticePanther.
Led discovery and design for matching every bank transaction to the right record, with a person confirming each match.
3–4 hours instead of a full day. 348 firms upgraded.
Law firms hold client money in trust, and every cent must match their records. Two people sit at the center of that.
“I’d rather it take longer than have a dollar unaccounted for.”
“I don’t want to see the books. I just need to know they’re right.”
Money a firm holds for clients. Every cent must match the firm’s records, or it’s a bar compliance issue.
Download statements from every bank and card account.
Check each bank line against the ledger, one at a time.
Bank fees, short payments and deposits nobody recorded.
Bank, trust ledger and client matters must agree to the cent.
of firms kept their books in QuickBooks, outside our product.
It was never about speed. A fast tool Maria has to double-check saves her nothing.
Reconciliation is slow, so automate it.
It’s high-stakes, so make it trustworthy. Speed follows.
Two $500 payments on the same day look identical in bank data. So the system suggests, and a person decides.
All three pointed to manual reconciliation
Highest impact on time, trust and risk. Batch matching followed later.
The system suggests. A person confirms every match, and can undo it.
Accuracy first, then speed
Read-only, from Plaid
Each account to the right ledger
A list per account, with suggestions
One at a time, undo anytime
Three-way, audit-ready
Instead of a single "import transactions" feature, I organized the work into three steps that follow the money from the bank to the books. Each step builds trust before the next one.
Link bank and card accounts through Plaid, map each one to the right trust or operating ledger, then choose an import start date. New activity syncs daily.
The system suggests matches from amount, date and description. Maria confirms a match, creates the missing record, or excludes the line.
Matched transactions flow into three-way reconciliation, where a person reviews everything before the books close. Audit-ready for the bar.
Every bank line ends up matched, created or excluded, so every cent is accounted for.
Match to an existing record
Create the missing record
Exclude the line
Three-way reconciliation before the books close
Plaid gives a read-only feed from almost any bank. But each large client has its own trust account, so a firm like Nick’s has five accounts to connect. The goal wasn’t just to connect a bank, but to make the firm feel safe doing it.
A transaction is only useful if it lands in the right ledger. One unlinked account means money in the wrong place.
A one-time mapping step that links each bank account to one PracticePanther account. Once linked, up to 180 days of prior transactions import automatically.

The matching screen went through two major iterations before the final design, each shaped by user testing and engineering feedback.
I intentionally mirrored the grid-based approach used by our primary competitors to see if an industry-standard mental model would reduce the learning curve. A full-width data table with expandable rows revealed four action tabs: Review Match, Manual Match, Create New Payment, and Exclude.
Review Match tab
Inline grid matching
Exclude with reason
To solve the clutter problem of the grid, I pulled matching into focused modals with tabs: Suggested Match, Find Match, Create Match, and Exclude. Suggested matches were listed first for Maria to confirm. Each workflow got dedicated space and clearer information hierarchy.
Suggested Match modal
Find Match with filters
Create new match
Exclude transaction
Matching is really comparing two lists, and the modal hid one of them. In testing, 7 of 10 participants lost their place. We had already put work into the modal, but I made the call to redesign around a side-by-side layout, and engineering’s concerns supported it. I used AI prototypes so we could test the new layout with users quickly.
Modal-heavy, tab switching, context loss
Single screen, split panel, drag-and-drop matching
Bank transactions on the left, PracticePanther records on the right. Three decisions shaped it.
Split-panel reconciliation - Bank Transactions (left) vs PracticePanther Payments (right)
Built in Figma Make with sample data. Best on a laptop or desktop.
People lost their place when one list was hidden.
Users drag bank transactions from the left panel onto PracticePanther payments on the right. A green border and "Valid Match" indicator provides clear visual confirmation before committing. Every card has a handle, and clicking works too, so drag is a shortcut rather than the only way.
Drag interaction with payment type classification
Two $500 payments can look identical, so only Maria can pick the right one.
Hover reveals payment creation options
Hovering on a transaction card reveals options to record it as a contact payment, firm payment or expense, right from the bank line. This keeps the interface clean while providing quick access to classification actions.
Drag-to-scroll for navigating long payment lists
A wrong match only surfaces at reconciliation, when it’s already a compliance problem.
A "Recent Matches" dropdown shows the last several matches with a one-click "Unmatch" option - directly addressing user feedback about needing to undo wrong matches and fear of irreversible errors.
Recent Matches panel
Firm Payment creation - Deposit, Withdrawal, Transfer
Earn trust first, then automate.