How to automate bookkeeping for a small business: 1,229 transactions, rules first, AI second (and what broke)

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.

Bank feed in, categorized books out โ€” no QuickBooks seat.

Key takeaways

  • Rules written once placed 1,081 of my 1,229 transactions (88%) on the first pass; the AI only ever sees the leftovers.
  • What leaves the Mac is the merchant line and the amount for the 10-20% of leftovers, never an account number or a balance.
  • Receipts go from my iPhone to a watched iCloud folder to the matching bank line without me opening a laptop.
  • The same tagged data answers 'did this job make money' per job, with overhead included.
  • Three years of QuickBooks Essentials is about $2,340 in subscription alone; a system built around your books is a set build price plus a monthly plan for only what you use, with the data on your machine.

Why QuickBooks felt like a second job (and what a CPA actually needs)

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.

Sunday night with a spreadsheet vs. a 12-minute Monday review

Same job. Two very different days.

Before

  1. Download the statement, open the spreadsheet, start at row one
  2. Decide line by line: materials for a job, or screws for my own garage?
  3. Hunt for the receipt in the truck; give up; guess
  4. Discover a running balance got pasted in as an amount; redo the month
  5. Email the CPA a login and a "sorry, it's a mess"
About 3 hours a month, all of it at night, and 143 rows parked in "Other"

After

  1. Statement lands; the parser reconciles every section to the penny or flags it
  2. Rules place the recurring merchants (88% of my lines) before I ever see them
  3. Leftovers go to the AI tier as the merchant line and amount only, no account numbers, to Anthropic's Claude API; a suggested category and confidence come back
  4. I clear the review cards once a week; each answer becomes a new rule
  5. One button prints the CPA package: summary, open questions, every line with a business/personal tick
About 12 minutes a week; 12% of lines need me, and that number drops every month

How to automate bookkeeping for a small business: the five-stage pipeline

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.

  1. Statement parser. My credit union's PDF statements go through a 751-line parser that turns them into clean rows. It is tested against a 967-row export it has to reproduce byte for byte; if one digit drifts, the test fails.
  2. Rules. A rule is just "if the merchant line contains X, book it to Y, for this entity." KWIK TRIP is fuel. VERIZON is phone. A Stripe payout is Style Marking income. I started with 494 payee aliases pulled out of my old spreadsheets.
  3. AI fallback. Anything no rule claims gets a suggested category and a confidence from a language model. The suggestion is marked as a suggestion and never booked silently.
  4. Review queue. Every suggestion, every missing receipt and every statement that should exist but does not shows up as a card in an inbox. I clear it once a week. Each answer teaches a new alias, so the queue shrinks every month.
  5. CPA package. One button prints a PDF built to the same layout as the 2025 packet for Revisions Unlimited, which came out at 83 pages: summary, open questions, all 607 April-through-December transactions with a business/personal tick, check copies, and the statements themselves.

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.

What rules catch vs what AI catches: real counts from 1,229 transactions

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.

Local-first: what stays on the Mac and the 10-20% that goes to the AI API

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.

Receipts, job costing and alerts from the same data

Receipts: an iPhone shortcut into a watched folder

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.

Job costing: did this job make money?

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.

Alerts that matter

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.

What broke: the $18,818 phantom charge, 143 rows in "Other", the dedup that ate 15 rows

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.

Spreadsheet vs QuickBooks vs a system built for your books, over three years

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.

Frequently asked questions

Can AI categorize my bank transactions?

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.

Is it safe to use ChatGPT for bookkeeping?

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.

How accurate is automatic transaction categorization?

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.

How do small contractors keep their books?

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.

How do I know if a job was profitable?

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.

Can I do my own bookkeeping without QuickBooks?

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.

Want the books off your Sunday night?

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.

Jacob Fischer
Jacob Fischer

Founder, Style Marking ยท owner, Revisions Unlimited. Jacob builds custom websites, apps and operations systems for small-business owners โ€” and runs a remodeling company on the same tools he builds for clients. Every post here comes from systems he has actually shipped.

Related reading