To automate bookkeeping for a small business without QuickBooks: export your bank activity (CSV, or parse the PDF statements), run every line through a short list of rules you write once, let an AI model suggest a category for the 10-20% the rules miss, and review only those exceptions once a week. Then have the system print the package your CPA actually wants instead of handing over a login. I built exactly that for my own three sets of books, Revisions Unlimited, Style Marking and personal: 1,229 transactions so far. This is how the pipeline works, where the rules-versus-AI line really falls, and the bugs that bit me on the way.
I ran a remodeling company on a spreadsheet and a shoebox for longer than I want to admit, then tried the software everyone recommends. The software was fine. The problem was the shape of the job.
Every Sunday night I was still the one sitting there deciding whether a Menards run was materials for a job or screws for my own garage. The bank feed disconnected twice. In 2025 a batch of Revisions Unlimited customer checks got deposited into my personal account, so the business book was missing its own income and the personal book had it.
Then I asked my CPA what they actually wanted from me. Not a login. A package: income by source, expenses by category, a yes or no on every transaction that could be personal, copies of the larger checks, and a short list of open questions. That is a report, not a subscription.
So the target became simple: statements in one end, that package out the other, with me touching only the lines a human has to touch.
The whole thing is a small desktop app I call Fischer Books. It runs on my Mac, stores everything in a local SQLite file, and has five stages.
Nothing in that list is exotic. It is the same approach I used when building a desktop app for one business: a parser, a rule table, a queue and a report.
When I migrated everything from October 2024 through March 2026, the import was 1,229 transactions across the three books: 1,038 personal, 172 Revisions Unlimited, 19 Style Marking. All 69 statement sections reconciled to the penny against the printed balances.
Rules and aliases placed 1,081 of them on the first pass. That is 88%, and it is the number people underestimate. A small business buys from the same forty places over and over; one rule per place does most of the job forever.
The leftover 148 rows (12%) are where the model earns its keep, and where it does not:
So the honest split is not "rules 80%, AI 20%." It is rules for most of it, AI for a chunk of the rest, and a hard floor of lines only the owner can answer. My target for that floor is under 5%. I am at 12% and dropping as the aliases pile up.
I was not going to put my bank statements in a cloud bookkeeping tool, and I was not going to paste them into a chat window either. The design rule is simple: the data lives on my machine, and the model only sees what it needs to make one decision.
What stays local: the statement PDFs, every parsed row, account numbers, running balances, the rule table, the receipts and the SQLite database itself. The rules engine runs entirely on the Mac. It works with no internet connection and no API key at all.
What goes out: for the 10-20% of lines no rule claims, the app sends the merchant description as printed and the amount, plus which book it belongs to, to Anthropic's Claude API, and gets back a suggested category and a confidence. No account number, no balance, no date range, no statement. Receipt photos go the same way, one image at a time, to read the vendor, date and total.
The API key sits in the macOS Keychain, not a config file. The nightly backup is an AES-encrypted file in my own iCloud Drive, 356 KB for the whole history. If I never paste in a key, the app still runs rules-only and the leftovers simply wait in the queue for me.
If you use ChatGPT or any other model for this, hold yourself to the same line: merchant and amount, under API or business terms you have actually read, never the full statement.
Paper receipts die in truck cup holders, so the capture step had to be one tap. An iPhone Shortcut takes the photo, asks me one question (which book), and drops the image into an iCloud folder for that entity. The app watches that folder, reads the vendor, date and total, and pins the receipt to the matching bank line. Building the Shortcut was the one piece I had to do by hand in Apple's app; everything else is code.
Once every line has a category, tagging it with a job is one more field. Materials are the Menards and lumber-yard lines tagged to the job. Labor is hours times a loaded rate. Subs are the checks.
Overhead is the part most contractors skip: my September audit put my own fixed burn at $3,425 a month; use your shop's number. If the crew bills about 300 hours a month, every hour carries roughly $11 of overhead before anyone makes a dollar. Bid minus those four buckets is the true margin, and it is usually a different number than the one in your head.
The app sends severity-ranked push notifications to my phone. Not "you spent money today." Things like: a statement that should exist and does not (41 of those cards flagged gaps in my own history the first week), an expected recurring payment that never posted, and the winter fund. That last one computes a target from November-to-March burn minus snow income and tells me whether I am on pace by November 1, which matters a great deal in a Minnesota remodeling business.
Here is the part the software ads leave out.
The $18,818.10 Culver's charge. On a split-column statement the parser grabbed the running-balance column instead of the amount column. A lunch became an eighteen-thousand-dollar expense. The fix was a reconciliation test on every section: opening balance plus the rows must equal the closing balance, exactly, or the section is marked unreconciled.
The reconciliation that lied. Savings sections on my statements print no summary table, and when the beginning balance was 0.00 a zero filter dropped it and shifted every amount by one. In March 2025 that lost a $15,000 transfer and booked $15,000 as dividend income; the real dividend was twelve cents.
Worse, the old check searched for a number that made the math close, then reported success. A check that hunts for a value that makes the math work is not a check. Now amounts come from the printed running-balance chain, and the test is open plus rows equals close, nothing else.
143 rows in "Other." The first-pass categorizer had a catch-all, and 143 transactions went there and stayed. "Other" is where books go to die. It is no longer a category in my app; it is a review card.
Placeholder dates. Lines without a printed day got the first of the month, which quietly broke every weekly view.
The dedup that ate 15 rows. Two fuel stops, same station, same amount, same day, look exactly like a duplicate to a naive rule. Fifteen real transactions vanished. Dedup now keys on the statement's own line order as well.
Every one of those is now a regression test; the app has 500 of them. That is the real difference between a system built and tested for your books and a spreadsheet: the bugs stay fixed.
Three honest options, costed over three years.
If your business has a few hundred transactions a year and one clean account, QuickBooks or even the spreadsheet is enough. If you run a crew, mix personal and business on one card like most of us do, and the books are the thing you dread, a system built around your books is worth pricing before the next tax season.
Where to start this week, no hire required: export twelve months of bank activity as CSV, sort by merchant, and write a rule for the top forty. You will see the 80-90% number yourself before you spend a dollar. Then tell me what the leftovers look like and I will come back with a free quote for the rest. If you are not sure the books are the first thing to automate, start with what to automate first in a Minnesota small business instead.
Yes, for the lines that carry information. Give a model the merchant description and the amount and it will name the category of a restaurant, a hardware store or a software subscription reliably. It cannot categorize CHECK 1158 or a cash withdrawal, because there is nothing in the line to read. In my books, rules handled 88% first and the model only saw the leftovers.
Pasting a full statement into a chat window is the wrong shape: account numbers, balances and a year of your life in one prompt. The safer pattern is to send one merchant line and one amount per decision, through the API under business terms you have read, and keep the statements and the database on your own machine. That is how my app is built, with Anthropic's Claude API for the leftovers only.
Rules are as accurate as the rules you wrote; a merchant alias is right every time once it is right once. AI suggestions on readable merchants are good enough that I treat them as a strong first guess, which is why they stay suggestions until I confirm them. The real accuracy problem is upstream: a parser that misreads a balance as an amount, or a dedup that deletes real rows. Reconcile every statement to the penny and the categories take care of themselves.
Most of us run one bank account plus a card, mix personal and business more than we should, and catch up before tax time. The working version is: one rule set that categorizes the recurring merchants, a weekly twelve-minute review of what is left, a receipt photo habit tied to the bank line, and a package for the CPA with a business-or-personal answer on every questionable line. Whether that lives in QuickBooks, a spreadsheet or a system built for your books matters less than doing it weekly.
Tag every transaction with a job and subtract four buckets from the bid: materials, labor at a loaded rate, subs, and a share of your fixed overhead. The overhead share is the one everyone skips. Divide your monthly fixed costs by the hours your crew actually bills and add that to every hour. A job that looked like a 30% margin often turns out closer to 12% once overhead is on it.
Yes. Your CPA needs clean categorized transactions, a business-or-personal decision on anything questionable, backup for the large items and a summary, not a specific brand of software. A CSV export plus rules gets you most of the way; a small custom tool adds the review queue, receipts and the printed package. Ask your CPA what format they want before you build anything.
Tell me which bank you use, how many accounts, and whether you want receipts and job costing. I'll come back with a clear scope, a set price for the build, and a monthly plan for only the services you need, priced to compete with QuickBooks. Your data stays on your machine, and our development team builds it around how your books actually work.