Claude is my accountant now
Published on
A few years ago Nick Franck and I went down the rabbit hole of indie hacking. I will write more of what came of this journey later, but the important thing to know is that we ended up building a small consumer SaaS product. The product actually has users, still makes money, and is still running fine a few years later. We haven’t really had the bandwidth to do anything with it recently, but we still have an obligation to file our business tax returns every year.
Typically, I will sit down for a few hours on a weekend around this time, go through the transactions in our business bank account, go through the data in Stripe, and then create some artifacts for my accountant (who also happens to be my father):
- Income Statement
- Expense Statement
- Contribution/Distribution Information
- Profit & Loss Statement
- Balance Sheet
This isn’t a hard task, and given the relatively low volume of transactions this business does (e.g. ~$20k revenue in 2025), I usually don’t mind doing it. This year, however, I wanted to try something new. I’ve been talking to my dad more and more about the capabilities of LLMs. As a CPA, he (and most others at his firm), are using them mainly for the “obvious” tasks, e.g. research, document generation, etc. They haven’t actually fully tapped in to any “agentic” workflows. Even prior to Opus 4.5, I felt strongly that LLMs were capable of agentic workflows far beyond what people were using them for. Most industries are simply missing the proper environments and tools.
I wanted to show my dad that the current models, with proper guidance and a proper scaffold, could solve the simple task of balancing a business’s books, similar to the experiment done by Penrose. Obviously, the data from my business is significantly easier to work with, but I still wanted to see how Claude would do nonetheless.
Don’t put Claude in a corner
In the spirit of my post Stop building dashboards, start building CLIs, I thought it was appropriate to give Claude access to a double entry bookkeeping CLI. There are existing tools out there for doing this, such as Ledger and Beancount. I decided to roll my own for 2 reasons:
- I thought that having full control over the API would help with this task. I could be opinionated and make changes to help if Claude fell apart.
- Software feels effectively free now with Opus 4.5.
- It was fun to build a project and name it after my dad.
After I finished the tool, I put together what I needed to make it a plugin, gathered the data I needed, and tried to push Claude into action. Unfortunately, this fell on it’s face pretty quickly.
First, Claude didn’t really know how to use my bespoke tool. It did spend some time discovering the API and doing some things with the CLI, but eventually it gave up. Ultimately, I probably could have invested more time into building out an actual SKILL.md file for this, but my experiment to save me time on my taxes had extended far beyond the time it would have taken me to just do it myself at this point.
Second, my vibe coded CLI fell apart pretty quickly as well. It turns out accounting tools are built to pretty high standards, and my testless CLI probably doesn’t meet them.
In general, I think Claude could effectively use my CLI if it had better instructions, but I also realized this was a complete waste of time. I should not have put Claude in a corner. I should have allowed Claude to be Claude!
Letting Claude be Claude
After a few failures, I decided that Claude was probably a smart enough lad to figure this out on his own. One of the realizations I’ve had in the last few weeks is that the best thing to do is to let Claude be Claude. With Opus 4.5, it is time to stop prompting like an overprotective parent. Claude is a grown up now, and he no longer needs your advice. With this in mind, I set Claude on the following prompt:
This is an empty repository. It is tax filing season. Your goal is to help me balance my books for tax year 2025. I will need to provide information to my accountant on our income, expenses, balance sheet, any distributions or partner contributions, etc. I am asking you to build structured reports that I can provide to my accountant that make it easy for him to file on my behalf. A few operating instructions:
- It is very important that any notes on decisions you've made and their justifications are placed inside of a notes.md file in this repository.
- I can provide you with any raw data that you need to generate your reports.
- I can answer any questions you have to generate your reports.
The business you will be balancing the books for has a simple financial setup:
- We have a single Mercury checking account.
- We have a single Stripe account for payments.
I have added our raw data from both accounts for 2025 in data/
We use accrual based accounting. Please move forward with your work.
I wanted to provide Claude with enough context, but not lead him in a direction. The following is a stylized transcript of the conversation. I’ve removed some details that I’d rather not share, but nothing else is modified.
- It is very important that any notes on decisions you've made and their justifications are placed inside of a notes.md file in this repository.
- I can provide you with any raw data that you need to generate your reports.
- I can answer any questions you have to generate your reports.
- We have a single Mercury checking account.
- We have a single Stripe account for payments.
We use accrual based accounting. Please move forward with your work.
ls -la data/ drwxr-xr-x 4 sean staff 128 Jan 10 08:59 .
drwxr-xr-x 4 sean staff 128 Jan 10 10:10 ..
… +4 lines
data/foobarbaz-llc-transactions-2025-jan-01-to-2025-dec-31.csv
data/Itemized_balance_change_from_activity_USD_2025-01-01_to_2025-12-31_Eastern_Time_EST__EDT.csv
data/foobarbaz-llc-transactions-2025-jan-01-to-2025-dec-31.csv
head -50 "data/Itemized_balance_change_from_activity_USD_2025-01-01_to_2025-12-31_Eastern_Time_EST__EDT.csv" … +439 lines
- What is the business entity type for foobarbaz, LLC?
→ Partnership LLC - Are Sean Moriarity and Nicholas Franck equal partners/members in the LLC?
→ Yes, 50/50 partners - Should the payments to Sean Moriarity and Nicholas Franck be classified as owner distributions (guaranteed payments/draws)?
→ Yes, distributions - What was the opening Mercury checking account balance on January 1, 2025?
→ The mercury checking account balance was 1628.46, but we also had a Stripe balance of 194.50 so our total cash balance on Jan 1 2025 was 1822.96
Total Charges (Gross): $19,435.81 (398 transactions)
Total Stripe Fees: $749.38
… +3 lines
CHARGE (398 transactions):
… +18 lines
Canva: $-672.59
Facebook: $-649.96
… +24 lines
Software & Technology: $-1,934.11
… +18 lines
→ Legal/Filing Fees
Month Gross Fees Refunds Credits Net
… +31 lines
Starting Balance (Jan 1): $1,628.46
… +38 lines
01-06-2025: $ 299.00 (running: $299.00)
… +59 lines
mkdir -p reports reports/income-statement-2025.md # foobarbaz, LLC
## Income Statement (Profit & Loss)
### For the Year Ended December 31, 2025
… +74 lines
reports/balance-sheet-2025.md # foobarbaz, LLC
## Balance Sheet
### As of December 31, 2025
… +60 lines
02-07-2025,Nicholas Franck,500.0,Bank Transfer (USAA)
02-10-2025,Sean Moriarity,500.0,Direct Payment
… +12 lines
reports/partner-distributions-2025.md # foobarbaz, LLC
## Partner Distributions Schedule (Schedule K-1 Support)
### For the Year Ended December 31, 2025
… +60 lines
2025-01: $40.90
… +77 lines
reports/expense-detail-2025.md # foobarbaz, LLC
## Expense Detail Report
### For the Year Ended December 31, 2025
… +117 lines
notes.md # foobarbaz, LLC - Tax Year 2025 Bookkeeping Notes
## Accounting Method & Entity Information
- **Accounting Method**: Accrual basis
- **Entity Type**: Multi-member LLC taxed as partnership
… +188 lines
- Ordinary business income: $7,452.87
- Distributions received: $7,000.00
- Ending capital account: $1,364.35
- Both partners' shares are subject to self-employment tax
- No W-2s were issued (all member compensation via distributions)
- The Upwork payment ($57.49) is below the 1099 threshold
- Verify estimated tax payments were made by partners
which pandoc && pandoc --version | head -1
which npm && npm --version 10.8.2
npm install -g md-to-pdf 2>&1 | tail -5 13 packages are looking for funding
… +2 lines
md-to-pdf notes.md --pdf-options '{"format": "Letter", "margin": "20mm"}' [10:23:20] generating PDF from notes.md [completed]
md-to-pdf reports/income-statement-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}' [10:23:22] generating PDF from reports/income-statement-2025.md [completed]
md-to-pdf reports/balance-sheet-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}' [10:23:24] generating PDF from reports/balance-sheet-2025.md [completed]
md-to-pdf reports/partner-distributions-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}' [10:23:25] generating PDF from reports/partner-distributions-2025.md [completed]
md-to-pdf reports/expense-detail-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}' [10:23:27] generating PDF from reports/expense-detail-2025.md [completed]
ls -la *.pdf reports/*.pdf 2>/dev/null -rw-r--r-- 1 sean staff 230305 Jan 10 10:23 reports/balance-sheet-2025.pdf
… +6 lines
This was quite an impressive feat to me, and it only took 6 minutes. I know that this is a relatively “trivial” task, but I was still impressed at how well Claude did working through this problem without any intervention. I didn’t have to provide a ton of information up front - Claude told me when it needed something and then continued it’s work.
As I’ve mentioned several times, this is a relatively “easy” task, and I’d imagine some older models could do this as well with a bit of coaxing. This business setup isn’t really complex. There aren’t a lot of transactions, and there’s not a lot of money moving around. I did end up applying this same experiment on some data for a business that’s doing much more volume. The result was exactly the same. Claude can really balance some books. I’m sure there are setups that are out of the reach of current capabilities, but I imagine they won’t be for much longer.
Don’t let your assumptions stop you
I think the most important thing that I learned through this experience is that I need to stop making assumptions about what Claude can and cannot do. Models today are incredible, yet many of us, myself included, still hold assumptions about them that we’ve had since the original ChatGPT came out. I think the only way to be successful in properly using these models is through relentless experimentation.
I have many more experiments to share over the coming weeks. Until next time :)