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:

  1. 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.
  2. Software feels effectively free now with Opus 4.5.
  3. 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.

Claude Code v2.1.3
Welcome back Sean!
Opus 4.5 · Claude Max · [email protected]'s Organization
~/projects/wcc/rmd
❯ User
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.
⏺ Claude
I'll help you prepare structured financial reports for your accountant. Let me start by exploring the data you've provided to understand what we're working with.
Bash
ls -la data/
total 568
drwxr-xr-x 4 sean staff 128 Jan 10 08:59 .
drwxr-xr-x 4 sean staff 128 Jan 10 10:10 ..
… +4 lines
⏺ Claude
I can see two data files - one from Stripe and one from Mercury (for "foobarbaz-llc"). Let me examine both to understand their structure.
Read
data/foobarbaz-llc-transactions-2025-jan-01-to-2025-dec-31.csv
Read 100 lines
Read
data/Itemized_balance_change_from_activity_USD_2025-01-01_to_2025-12-31_Eastern_Time_EST__EDT.csv
Error: File content (33504 tokens) exceeds maximum allowed tokens (25000). Please use offset and limit parameters to read specific portions of the file.
⏺ Claude
The Mercury file is readable but the Stripe file is large. Let me get the full Mercury data and a sample of the Stripe file structure.
Read
data/foobarbaz-llc-transactions-2025-jan-01-to-2025-dec-31.csv
Read 63 lines
Bash
head -50 "data/Itemized_balance_change_from_activity_USD_2025-01-01_to_2025-12-31_Eastern_Time_EST__EDT.csv"
"balance_transaction_id","created_utc","created","available_on_utc","available_on",...
… +439 lines
⏺ Claude
I now have a clear picture of the data. Before I build the reports, I have some important questions to ensure accuracy for accrual-based accounting.
User Answers
  • 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
⏺ Claude
I have what I need. Let me now analyze the full data and create the reports. I'll set up a todo list to track this work.
Bash (Python Analysis)
=== STRIPE REVENUE ANALYSIS ===
Total Charges (Gross): $19,435.81 (398 transactions)
Total Stripe Fees: $749.38
… +3 lines
Bash (Python Analysis)
=== STRIPE BY CATEGORY ===

CHARGE (398 transactions):
… +18 lines
Bash (Python Analysis)
=== EXPENSE SUMMARY ===
Canva: $-672.59
Facebook: $-649.96
… +24 lines
⏺ Claude
Let me categorize expenses properly and verify the balance sheet calculations.
Bash (Python Analysis)
=== EXPENSES BY CATEGORY ===

Software & Technology: $-1,934.11
… +18 lines
User Answer
What is the 'Corp E Corp' expense of $300? How should it be categorized?
→ Legal/Filing Fees
Bash (Python Analysis)
=== MONTHLY REVENUE (STRIPE) ===

Month            Gross      Fees    Refunds    Credits         Net
… +31 lines
Bash (Python Analysis)
=== MERCURY ACCOUNT RECONCILIATION ===

Starting Balance (Jan 1): $1,628.46
… +38 lines
⏺ Claude
Let me recalculate the Stripe balance more carefully.
Bash (Python Analysis)
=== STRIPE <-> MERCURY TRANSFERS ===

01-06-2025: $    299.00  (running: $299.00)
… +59 lines
⏺ Claude
Now I have all the numbers reconciled. Let me create the financial reports.
Bash
mkdir -p reports
Write
reports/income-statement-2025.md
Wrote 84 lines

# foobarbaz, LLC
## Income Statement (Profit & Loss)
### For the Year Ended December 31, 2025
… +74 lines
Write
reports/balance-sheet-2025.md
Wrote 70 lines

# foobarbaz, LLC
## Balance Sheet
### As of December 31, 2025
… +60 lines
Bash (Python Analysis)
Date,Partner,Amount,Method
02-07-2025,Nicholas Franck,500.0,Bank Transfer (USAA)
02-10-2025,Sean Moriarity,500.0,Direct Payment
… +12 lines
Write
reports/partner-distributions-2025.md
Wrote 70 lines

# foobarbaz, LLC
## Partner Distributions Schedule (Schedule K-1 Support)
### For the Year Ended December 31, 2025
… +60 lines
Bash (Python Analysis)
=== MONTHLY EXPENSE SUMMARY ===

2025-01: $40.90
… +77 lines
Write
reports/expense-detail-2025.md
Wrote 127 lines

# foobarbaz, LLC
## Expense Detail Report
### For the Year Ended December 31, 2025
… +117 lines
Write
notes.md
Wrote 198 lines

# 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
⏺ Claude
I've completed the financial reports for foobarbaz, LLC for tax year 2025. Here's a summary:
Key Financial Results
Metric Amount
Net Revenue$18,579.81
Gross Profit$17,847.30
Operating Expenses$2,941.56
Net Income$14,905.74
Partner Distributions$14,000.00 ($7,000 each)
Ending Cash Balance$2,728.70
Reports Created
reports/
income-statement-2025.md # P&L with monthly revenue breakdown
balance-sheet-2025.md # Assets, liabilities, equity, reconciliation
partner-distributions-2025.md # K-1 support with distribution detail
expense-detail-2025.md # Categorized expenses with monthly breakdown

notes.md # Accounting decisions and justifications
Partner K-1 Summary (50/50 split)
Each partner's allocable share:
  • Ordinary business income: $7,452.87
  • Distributions received: $7,000.00
  • Ending capital account: $1,364.35
Items for Your Accountant
  1. Both partners' shares are subject to self-employment tax
  2. No W-2s were issued (all member compensation via distributions)
  3. The Upwork payment ($57.49) is below the 1099 threshold
  4. Verify estimated tax payments were made by partners
The notes.md file contains detailed justifications for all accounting decisions, including revenue recognition timing, expense categorization, and the treatment of Stripe fees and USAA transfers.
Brewed for 5m 41s

❯ User
I have verified Mercury account ending balance of 2638.11 and Stripe ending balance of 90.59 which matches your ending cash balance reported of 2728.70. Excellent work. Can you convert all markdown files to PDFs please so that I can share these with my accountant?
⏺ Claude
I'll convert all the markdown files to PDFs. Let me check what tools are available and generate the PDFs.
Bash
which pandoc && pandoc --version | head -1
Error: Exit code 1 - pandoc not found
Bash
which npm && npm --version
/Users/sean/.asdf/plugins/nodejs/shims/npm
10.8.2
Bash
npm install -g md-to-pdf 2>&1 | tail -5
added 202 packages in 6s

13 packages are looking for funding
… +2 lines
Bash
md-to-pdf notes.md --pdf-options '{"format": "Letter", "margin": "20mm"}'
[10:23:19] generating PDF from notes.md [started]
[10:23:20] generating PDF from notes.md [completed]
Bash
md-to-pdf reports/income-statement-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}'
[10:23:21] generating PDF from reports/income-statement-2025.md [started]
[10:23:22] generating PDF from reports/income-statement-2025.md [completed]
Bash
md-to-pdf reports/balance-sheet-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}'
[10:23:23] generating PDF from reports/balance-sheet-2025.md [started]
[10:23:24] generating PDF from reports/balance-sheet-2025.md [completed]
Bash
md-to-pdf reports/partner-distributions-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}'
[10:23:24] generating PDF from reports/partner-distributions-2025.md [started]
[10:23:25] generating PDF from reports/partner-distributions-2025.md [completed]
Bash
md-to-pdf reports/expense-detail-2025.md --pdf-options '{"format": "Letter", "margin": "20mm"}'
[10:23:26] generating PDF from reports/expense-detail-2025.md [started]
[10:23:27] generating PDF from reports/expense-detail-2025.md [completed]
Bash
ls -la *.pdf reports/*.pdf 2>/dev/null
-rw-r--r-- 1 sean staff 294314 Jan 10 10:23 notes.pdf
-rw-r--r-- 1 sean staff 230305 Jan 10 10:23 reports/balance-sheet-2025.pdf
… +6 lines
⏺ Claude
All PDFs have been generated. Here's what you have:
notes.pdf(294 KB)
reports/
income-statement-2025.pdf(245 KB)
balance-sheet-2025.pdf(230 KB)
partner-distributions-2025.pdf(236 KB)
expense-detail-2025.pdf(332 KB)
These are ready to share with your accountant. The notes.pdf contains all the accounting decisions and justifications, which will be helpful context for your accountant when preparing the partnership return and K-1s.
Cogitated for 48s

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 :)