Tracking Law Firm Trust Accounts in Beancount: IOLTA Compliance Without The Headache

As someone who’s worked with law firm finances for over a decade—including a stint as an IRS auditor—I can tell you that trust accounting is one of the most heavily scrutinized areas in professional practice. Trust account violations are the #1 reason attorneys face disciplinary action from state bars. So when I discovered Beancount’s potential for IOLTA compliance, I had to explore it seriously.

2026 brings critical new compliance requirements that small law firms need to address immediately:

  • Starting January 1, 2026, all client trust accounts must designate a specific licensee who is responsible for reconciliations
  • Existing accounts have until July 1, 2026 to comply
  • California’s CTAPP (Client Trust Account Protection Program) reporting is due March 30, 2026
  • The designated licensee must be a signatory and is personally liable for proper reconciliation

If you’re a solo attorney or small firm scrambling to meet these deadlines while managing trust accounts, read on.

The Trust Accounting Compliance Burden

The fundamental requirement is straightforward but demanding: monthly three-way reconciliation matching:

  1. Bank statement balance
  2. Trust account master ledger
  3. Sum of all individual client ledger balances

These three numbers must match perfectly every month. Add to this:

  • Absolute prohibition on commingling: Not one penny of firm money can mix with client funds
  • Transaction-level documentation: Every deposit, withdrawal, and transfer needs clear source documentation
  • Interest income rules: Determining whether funds go into pooled IOLTA or individual interest-bearing accounts
  • Bar association reporting: Quarterly and annual reports demonstrating compliance
  • Audit preparedness: Complete records accessible for bar examiner review

Traditional legal accounting software handles this, but at significant cost: $50-150/month per attorney, vendor dependencies, and limited flexibility for complex scenarios.

Why Beancount Could Transform Trust Accounting

After experimenting with several attorney clients, I believe Beancount’s design principles align beautifully with trust accounting compliance requirements. Here’s my approach:

Account Architecture

The key insight: mirror client obligations with liability accounts

; Pooled IOLTA account (for small or short-term client funds)
2020-01-15 open Assets:Trust:IOLTA:WellsFargo
2020-01-15 open Liabilities:ClientFunds:SmithDivorce
2020-01-15 open Liabilities:ClientFunds:JonesEstate  
2020-01-15 open Liabilities:ClientFunds:BrownRealEstate

; Individual interest-bearing trust accounts (large/long-term funds)
2020-01-15 open Assets:Trust:Individual:JohnsonSettlement:WellsFargo
2020-01-15 open Liabilities:ClientFunds:JohnsonSettlement

; Operating account (firm money - completely separate)
2020-01-15 open Assets:Checking:Operating:WellsFargo

The liability accounts track what you owe each client. The asset accounts track where the money actually sits. They must always balance.

Transaction Documentation with Metadata

Every trust transaction includes metadata required for compliance:

2026-03-10 * "Client retainer - Smith divorce case"
  matter: "2026-DIV-001"
  client_id: "SMITH-M-2026"  
  source: "Client check #1523"
  deposit_type: "retainer"
  Assets:Trust:IOLTA:WellsFargo           3500.00 USD
  Liabilities:ClientFunds:SmithDivorce   -3500.00 USD

2026-03-12 * "Court filing fees paid from trust"
  matter: "2026-DIV-001"
  expense_type: "court_costs"
  receipt: "Superior Court receipt #45234"
  Assets:Trust:IOLTA:WellsFargo          -435.00 USD
  Liabilities:ClientFunds:SmithDivorce    435.00 USD

2026-03-15 * "Earned fees - 8 hours legal work"
  matter: "2026-DIV-001"
  invoice: "INV-2026-0315"
  hours: "8.0"
  rate: "250"
  Assets:Checking:Operating:WellsFargo    2000.00 USD
  Assets:Trust:IOLTA:WellsFargo          -2000.00 USD
  Liabilities:ClientFunds:SmithDivorce    2000.00 USD
  Income:LegalFees:FamilyLaw             -2000.00 USD

Automatic Three-Way Reconciliation via Balance Assertions

This is the killer feature: Beancount’s balance assertions provide built-in three-way reconciliation.

; Month-end reconciliation for March 2026
2026-03-31 balance Assets:Trust:IOLTA:WellsFargo  23450.00 USD

; Individual client ledger balances must sum to match
2026-03-31 balance Liabilities:ClientFunds:SmithDivorce      -2300.00 USD
2026-03-31 balance Liabilities:ClientFunds:JonesEstate       -8650.00 USD
2026-03-31 balance Liabilities:ClientFunds:BrownRealEstate  -12500.00 USD
; Total: -23,450.00 USD ✓ (liabilities are negative, matching positive asset balance)

If the bank statement shows $23,450 but your individual client balances don’t sum to exactly that amount, Beancount errors immediately. You cannot close your books for the month until reconciliation is perfect. This is exactly what bar associations require.

Compliance Reporting with Beancount Query Language

Bar associations require detailed reporting. BQL makes this straightforward:

-- Summary of all client fund balances (for quarterly bar report)
SELECT account, sum(position) 
WHERE account ~ 'Liabilities:ClientFunds'
GROUP BY account;

-- All trust account activity for reporting period
SELECT date, narration, account, position
WHERE account ~ 'Assets:Trust'
  AND date >= 2026-01-01
  AND date <= 2026-03-31  
ORDER BY date;

-- Identify potential commingling (operating funds in trust account)
SELECT *
WHERE account ~ 'Assets:Trust'
  AND any_meta('expense_type') = NULL
  AND NOT any_meta('client_id');

Critical Compliance Considerations

Interest Income Rules

This is where it gets complex. You must determine whether client funds should go into:

Pooled IOLTA account (interest goes to state bar foundation for legal aid):

  • Small amounts where individual interest wouldn’t exceed account costs
  • Short-term holdings (funds expected to be disbursed within weeks)

Individual interest-bearing trust account (interest belongs to client):

  • Large amounts that can earn net interest (interest > account maintenance costs)
  • Long-term holdings (settlement funds, estate administration)

The decision factors from Illinois rules (similar across states):

  1. Amount of client funds to be deposited
  2. Expected duration of deposit
  3. Interest rate at the financial institution
  4. Cost of establishing and administering separate account
  5. Bank’s capability to calculate and pay interest to individual client

State-Specific Reporting Variations

While the core principles are consistent, reporting formats vary:

  • California: CTAPP annual reports, designated licensee requirements (new in 2026)
  • New York: Reconciliation reports, IOLTANYapproved bank requirements
  • Illinois: ARDC Client Trust Account Handbook compliance
  • Texas: Quarterly reconciliation certifications

You’ll need to customize BQL queries for your jurisdiction’s specific report formats.

Outstanding Implementation Questions

I’m still working through several challenges:

  1. Automated interest allocation: How to distribute IOLTA interest proportionally to client balances for accounting purposes (even though interest goes to the bar foundation)?

  2. Commingling detection queries: What BQL patterns identify accidentally deposited operating funds in trust accounts?

  3. Check register integration: Most firms still write physical checks from trust accounts. How to integrate check writing workflows?

  4. Earned fee transfers: Automating the two-part transaction (trust → operating + liability reduction + income recognition)?

  5. Bar examination exports: What format makes Beancount records most accessible to bar examiners during audits?

  6. Cost advance tracking: How to clearly distinguish client cost advances (court fees, expert witnesses) from retainers?

Tax Reporting Implications

As a tax specialist, I must mention: trust accounts have tax reporting requirements too.

  • Interest income: Even IOLTA interest must be reported (by the bar foundation, not the attorney)
  • 1099 reporting: Some client disbursements may require 1099 forms
  • Firm income recognition: Earned fees transferred from trust must be properly reported as income in the year earned

Beancount’s metadata capabilities make tax-time reporting much cleaner than traditional systems.

Seeking Practical Feedback

I’d love input from:

  • Attorneys who handle trust accounting: What compliance nightmares keep you up at night?
  • Bookkeepers managing law firm finances: What workflows would make this practical?
  • Beancount developers: Are there plugins or tools that could make trust accounting more accessible to non-technical solo practitioners?
  • Anyone who’s implemented regulatory compliance tracking in plain text accounting

Has anyone successfully deployed Beancount for trust accounting in production? What worked? What failed? What would you do differently?

The stakes couldn’t be higher: mishandled trust accounts can result in disbarment, criminal prosecution, and malpractice liability. But the opportunity is compelling: transparent, auditable, version-controlled trust accounting with zero recurring software costs and complete data ownership.

Am I missing critical compliance requirements? What questions should I be asking that I haven’t thought of yet?


Sources:

Tina, this is incredibly thorough and exactly the kind of professional-grade analysis I was hoping to see! Your experience as a former IRS auditor really shines through in the detail around documentation and audit preparedness.

The “Mirror Liability” Approach is Brilliant

I love how clearly you articulated this: “The liability accounts track what you owe each client. The asset accounts track where the money actually sits.” This is the conceptual breakthrough that makes Beancount’s double-entry system perfect for trust accounting. It’s not just tracking cash—it’s tracking obligations.

Traditional legal software obscures this relationship, treating client balances as a separate subsystem. Beancount makes the fundamental accounting equation do the heavy lifting: Assets = Liabilities + Equity. When you owe clients $23,450, you’d better have exactly $23,450 in trust accounts. The math forces compliance.

Metadata Strategy: More Critical Than I Initially Realized

Your metadata examples (matter:, client_id:, source:, deposit_type:) go beyond nice-to-have—they’re essential for bar examination survival. When a bar examiner asks “Show me all transactions for client Smith in matter 2026-DIV-001 for the period January-March 2026,” you need to produce that instantly.

A BQL query like this becomes your lifeline:

SELECT date, narration, account, position
WHERE any_meta('client_id') = 'SMITH-M-2026'
  AND any_meta('matter') = '2026-DIV-001'
  AND date >= 2026-01-01
  AND date <= 2026-03-31
ORDER BY date;

Question for you: Do you recommend standardized metadata schemas? Should we create a “trust accounting metadata standard” that everyone follows (like matter:, client_id:, source:, transaction_type:)? Having consistent naming would make sharing queries and tools much easier.

State-Specific Reporting: The Real Challenge

You mentioned California, New York, Illinois, and Texas all have different reporting requirements. This is where I worry about Beancount’s adoption barrier for small firms. Each jurisdiction needs:

  1. Custom BQL query templates for their specific report formats
  2. Documentation mapping Beancount output to bar association forms
  3. Example ledgers demonstrating compliant workflows

My proposal: What if we created a GitHub repository with:

  • trust-accounting-templates/california/
  • trust-accounting-templates/new-york/
  • trust-accounting-templates/illinois/
  • etc.

Each directory would contain:

  • Sample account opening templates
  • BQL query library for that state’s reporting requirements
  • Documentation for bar compliance
  • Example transactions covering common scenarios

Would you be interested in collaborating on something like this? Your tax/regulatory expertise combined with my CPA practice experience could produce something genuinely useful for the legal community.

The Commingling Detection Question

You asked: “What BQL patterns identify accidentally deposited operating funds in trust accounts?”

Here’s my thinking (still testing this):

-- Transactions in trust accounts lacking client metadata
SELECT date, narration, account, position
WHERE account ~ 'Assets:Trust'
  AND (
    any_meta('client_id') IS NULL 
    OR any_meta('matter') IS NULL
  )
ORDER BY date;

If every trust transaction should have client_id and matter metadata, then any transaction missing these tags is suspicious. It could be:

  • Operating funds accidentally deposited in trust
  • Interest payments that weren’t properly tagged
  • Bank fees charged to the wrong account
  • Legitimate exceptions (but rare)

The query flags these for manual review. Not perfect, but a good safety net.

Your turn: As a former IRS auditor, what other red flags should we be querying for?

The Earned Fee Transfer Automation Challenge

You mentioned automating the earned fee transfer transaction. This is tricky because it’s conceptually four simultaneous events:

  1. Money moves from trust account → operating account (asset shift)
  2. Client obligation decreases (liability reduction)
  3. Firm earns income (income recognition)
  4. Often: Time/expense records link to the invoice

Current manual approach:

2026-03-15 * "Earned fees - Invoice INV-2026-0315"
  matter: "2026-DIV-001"
  invoice: "INV-2026-0315"
  Assets:Checking:Operating:WellsFargo    2000.00 USD  ; Money arrives
  Assets:Trust:IOLTA:WellsFargo          -2000.00 USD  ; Money leaves trust
  Liabilities:ClientFunds:SmithDivorce    2000.00 USD  ; We owe client less
  Income:LegalFees:FamilyLaw             -2000.00 USD  ; We earned it

Automation idea: A Python script that:

  1. Reads a CSV/JSON of earned fees: client_id, matter, amount, invoice_number, fee_category
  2. Generates properly formatted Beancount transactions with all metadata
  3. Optionally integrates with time tracking systems (Toggl, Harvest, Clio)

Has anyone built something like this? Or is everyone manually entering these critical transactions (which might be safer given the stakes)?

Bar Examination Export Format

You raised the question: “What format makes Beancount records most accessible to bar examiners during audits?”

Bar examiners are typically practicing attorneys with accounting knowledge, not accountants with legal knowledge. They’re used to:

  • Printed client ledger cards (one page per client showing running balance)
  • Bank statement reconciliations with check images
  • General ledger reports in traditional format

My suggestion for audit preparation:

  1. PDF export of Fava reports: Filter by client, export to PDF, one file per client
  2. CSV exports for Excel compatibility: Examiners often want to sort/filter in Excel
  3. Plain English documentation: A README explaining the account structure and metadata schema
  4. Sample transaction walkthrough: Show one complete client matter lifecycle from retainer → disbursements → earned fees → case close

The goal: make it so easy for the examiner that they want to approve your system because it’s clearer than traditional software.

Tax Reporting: The 1099 Question

You mentioned “Some client disbursements may require 1099 forms.” Can you elaborate on this?

I know firms must issue 1099s to:

  • Expert witnesses paid $600+ per year
  • Investigators, mediators, other service providers
  • Sometimes opposing counsel in settlement disbursements?

How do you track 1099-reportable disbursements from trust accounts in Beancount? Additional metadata like:

2026-06-10 * "Expert witness payment - Dr. Johnson"
  matter: "2026-DIV-001"
  payee: "Dr. Sarah Johnson"
  payee_tin: "12-3456789"
  requires_1099: "yes"
  Assets:Trust:IOLTA:WellsFargo          -2500.00 USD
  Liabilities:ClientFunds:SmithDivorce    2500.00 USD

Then year-end query:

SELECT any_meta('payee'), sum(position)
WHERE any_meta('requires_1099') = 'yes'
  AND date >= 2026-01-01
  AND date <= 2026-12-31
GROUP BY any_meta('payee');

Is this the right approach, or am I overcomplicating it?

Next Steps: Building This Together

I’m genuinely excited about the potential here. Your post convinced me this isn’t just theoretical—it’s implementable today for small firms willing to invest in setup.

What would make this real:

  1. Working example repository: Full sample law firm ledger with 6 months of realistic transactions
  2. State-specific query templates: Starting with California (CTAPP compliance), New York, Illinois
  3. Documentation for attorneys: “Beancount Trust Accounting Guide for Solo Practitioners”
  4. Import tools: Scripts for importing bank statements from common legal-specific banks
  5. Fava customization: Trust-accounting-specific dashboard views

I’d love to collaborate on this if you’re interested. We could also pull in some attorney beta testers to validate against real bar examination scenarios.

Anyone else in this community interested in trust accounting? I know it’s niche, but the regulatory compliance angle applies to many professions: real estate brokers, escrow agents, property managers—anyone holding client funds in trust.

Thank you for such a comprehensive analysis, Tina. This is exactly the kind of rigorous thinking this use case demands.

This discussion is incredibly timely for me. I have a solo attorney client who’s been using QuickBooks for trust accounting, and honestly, it’s been a nightmare. She pays $89/month for QuickBooks + another $49/month for Clio just to handle trust accounting properly, and she still has monthly reconciliation anxiety.

Reading both of your posts, I’m cautiously excited but also realistic about the practical challenges of getting lawyers to adopt Beancount. Let me share the bookkeeper’s perspective on what would actually work in the field.

The Solo Attorney Reality Check

My attorney client is brilliant in the courtroom but struggles with anything technical beyond email and Word. When I mentioned “plain text accounting” to her, her eyes glazed over. She thinks:

  • “Plain text” = Microsoft Notepad
  • “Command line” = something from the 1980s
  • “Git” = completely foreign concept
  • “BQL queries” = might as well be quantum physics

The hard truth: Most solo attorneys and small firm lawyers won’t adopt Beancount unless it’s wrapped in a user-friendly interface they can use without learning Python or terminal commands.

That said, bookkeepers and accountants serving law firms absolutely could manage Beancount for their attorney clients. This is where I see the real opportunity.

What Would Make This Practical for Bookkeepers?

If I’m going to migrate my attorney client to Beancount for trust accounting, I need:

1. Client Data Entry Workflow

Attorneys won’t write Beancount syntax. They’ll either:

  • Hand me paper check deposits and receipts (yes, still common in 2026)
  • Forward me bank statements as PDFs
  • Give me access to online banking

I need tools to convert this into Beancount transactions efficiently:

  • Bank statement importers for common legal-specific banks (IOLTA Bank, Lawyer’s Trust Fund banks)
  • OCR receipt scanning that generates transaction drafts
  • Simple web form where attorneys can submit trust deposits/disbursements, and I convert to Beancount

Right now I do this with QuickBooks and manual data entry. If Beancount can streamline the import process (like smart-beancount, plaid2text, or custom scripts), I’d save hours.

2. Idiot-Proof Client Reports

Bar associations want specific formats. My attorney client needs to submit:

  • Monthly reconciliation certification
  • Annual CTAPP report (California)
  • Client ledger summaries on demand
  • Trust transaction journals

Alice’s idea about state-specific BQL query templates is essential, but I need one step further: pre-built Fava reports that generate these exact formats with one click.

For example:

  • Fava custom report: “California CTAPP Annual Report”
  • Fava custom report: “Client Ledger - [ClientName]”
  • Fava custom report: “Monthly Three-Way Reconciliation”

Can Fava be customized this deeply? Or would I need to build a separate Flask app that queries the Beancount ledger and formats reports?

3. Handling the Check Register Problem

Here’s a workflow issue nobody’s mentioned yet: attorneys write physical checks from trust accounts constantly.

Court filing fees. Expert witness payments. Client expense reimbursements. Opposing counsel settlements.

Most small firms still use paper checks (even in 2026, trust me). The workflow is:

  1. Attorney writes check #1234 to “Superior Court” for $435
  2. Attorney hands me the check carbon copy
  3. I enter it into accounting system
  4. Monthly reconciliation matches cleared checks against bank statement

Question: How do you handle check numbers in Beancount? Do you use metadata like this?

2026-03-12 * "Court filing fee - Smith divorce" ^check-1234
  matter: "2026-DIV-001"
  check_number: "1234"
  payee: "Superior Court of California"
  Assets:Trust:IOLTA:WellsFargo          -435.00 USD
  Liabilities:ClientFunds:SmithDivorce    435.00 USD

Then during reconciliation, I need to match check_number: "1234" against the bank statement’s cleared check list. Is there a standard approach for this in Beancount?

4. The Earned Fee Transfer Workflow

Alice mentioned the complexity of earned fee transfers. Let me add the practical reality:

My attorney client bills clients monthly. At month-end, I:

  1. Review her time entries (she tracks in Clio)
  2. Generate invoices
  3. Transfer earned fees from trust → operating account
  4. Record the income

The current QuickBooks workflow is clunky but functional. For Beancount, I’d need:

Option A (Manual but Safe): I review her billing each month and hand-write the Beancount transactions with full metadata. Time-consuming but accurate.

Option B (Semi-Automated): A Python script that:

  • Reads Clio billing export (CSV)
  • Prompts me to review each earned fee transfer
  • Generates Beancount transactions I can paste into the ledger
  • I manually review and commit

Option C (Fully Automated - Risky?): Automatic sync from Clio to Beancount with zero human review. Scares me for trust accounting given the stakes.

I’d probably start with Option A (manual) for the first 3-6 months to build confidence, then move to Option B once I trust the workflow.

5. Cost Advances vs. Retainers

Tina and Alice both touched on this, but let me emphasize: distinguishing cost advances from retainers is critical.

  • Retainer (unearned fees): Client pays $5,000 upfront. Attorney earns it over time as legal work is performed. This is a liability until earned.
  • Cost advance: Client pays $2,000 upfront to cover anticipated court fees, expert witnesses, filing costs. This is still client money even after spent. Not attorney income.

California bar rules require separate tracking. When I pay a $435 court fee from a client cost advance, I’m spending client money on their behalf—not earning income.

Current approach:

2026-03-12 * "Court filing fee - Smith divorce"
  matter: "2026-DIV-001"
  transaction_type: "cost_disbursement"
  Assets:Trust:IOLTA:WellsFargo          -435.00 USD
  Liabilities:ClientFunds:SmithDivorce    435.00 USD

The client balance decreases (we spent their money), but there’s no income recognition. Later, when I bill the client for work performed:

2026-03-31 * "Earned fees - March 2026 legal services"
  matter: "2026-DIV-001"
  transaction_type: "earned_fees"
  invoice: "INV-2026-03"
  Assets:Checking:Operating:WellsFargo   2400.00 USD
  Assets:Trust:IOLTA:WellsFargo         -2400.00 USD
  Liabilities:ClientFunds:SmithDivorce   2400.00 USD
  Income:LegalFees:FamilyLaw            -2400.00 USD

Do I need separate Liability accounts for retainers vs. cost advances? Or is metadata (transaction_type: "cost_disbursement" vs transaction_type: "earned_fees") sufficient?

The Adoption Barrier Question

Alice asked about interest in trust accounting. Here’s my concern: the attorneys who most need better trust accounting are the least technically capable.

Large law firms have in-house accounting teams and can afford Clio Manage at $89/attorney/month. They’re fine.

Solo and small firm attorneys (2-5 lawyers) are the ones struggling with:

  • High software costs eating into thin margins
  • Lack of accounting expertise
  • Fear of bar discipline for trust accounting mistakes
  • No time to learn new systems

These are the potential Beancount users, but they’re also the hardest to convert because they need maximum hand-holding.

My proposal: Position Beancount trust accounting as a bookkeeper-managed service, not an attorney self-service tool.

The pitch to solo attorneys:

  • “I’ll handle your trust accounting using Beancount”
  • “You get the same compliance and reporting, but at half the cost of Clio”
  • “Your data is never locked in proprietary software”
  • “I’ll generate all bar association reports automatically”

The attorney doesn’t touch Beancount directly. They email me deposits/checks, I enter transactions, they get Fava reports in their inbox monthly.

Would this work? It depends on whether bookkeepers like me can build the infrastructure (importers, reports, templates) to make Beancount competitive with traditional legal accounting software.

What I Need to Test This

If I’m going to pilot Beancount trust accounting with my attorney client, I need:

  1. Sample law firm Beancount ledger with 6 months of realistic transactions (Alice mentioned this - yes please!)
  2. California CTAPP reporting queries (my client is in CA)
  3. Check reconciliation workflow documentation
  4. Bank statement importer for Wells Fargo (her IOLTA bank)
  5. Fava customization guide for trust accounting reports

I’m willing to be a beta tester if someone’s building this infrastructure. My attorney client renews her QuickBooks subscription in July 2026, so I have ~4 months to build confidence in an alternative.

Questions for the Group

  1. Has anyone used Beancount for trust accounting in production? Not theoretically, but actually managing real attorney client funds under bar association scrutiny?

  2. What Fava plugins exist for custom reports? Can I build California-specific compliance reports as Fava extensions?

  3. How do you handle physical check reconciliation? Matching check numbers, tracking cleared vs. outstanding checks?

  4. Is there a Beancount community for legal/trust accounting? Or would we need to create one (GitHub repo, Discord, etc.)?

  5. What’s the disaster recovery plan? If my Beancount ledger gets corrupted or I make a catastrophic error, how do I recover? With QuickBooks, I have automated cloud backups. With Beancount + Git, I have version history, but is that sufficient for attorney trust accounting stakes?

Final Thought: The “Good Enough” Bar

QuickBooks trust accounting isn’t perfect. It’s clunky, expensive, and annoying. But it’s good enough and attorneys trust it because it’s the standard.

Beancount needs to be not just better technically (it already is, based on Alice and Tina’s analysis), but demonstrably better in practice for attorneys and bookkeepers who aren’t programmers.

If we can build:

  • State-specific compliance templates
  • Import automation
  • Fava reporting customization
  • Clear documentation for non-technical users

…then I think we have something attorneys and bookkeepers would actually adopt.

I’m genuinely interested in this. Let me know how I can help test or build practical tools for this use case.

This thread is absolutely phenomenal. Tina’s regulatory expertise, Alice’s CPA perspective, and Bob’s practical bookkeeper reality check create exactly the kind of multi-disciplinary discussion that makes specialized Beancount use cases actually viable.

I want to offer the perspective of someone who’s been using Beancount for 4+ years (personal finances and rental properties, not law firms) and has watched many ambitious projects fail because they tried to do too much, too fast.

Start Simple, Evolve Gradually

Bob, you mentioned your attorney client is technically non-savvy. Alice, you’re proposing GitHub repositories with state-specific templates. These goals aren’t incompatible, but they require staged adoption.

Here’s what I’ve learned from migrating from GnuCash to Beancount and helping others do the same:

Phase 1: Prove the Core Concept (1-3 months)

Don’t build anything fancy yet. Start with the absolute minimum viable trust accounting setup:

  1. Single client, single matter as a test case
  2. Manual transaction entry (yes, Bob, just hand-write the Beancount syntax for now)
  3. Basic balance assertions to prove the three-way reconciliation works
  4. One simple BQL query to generate a client ledger report

The goal: Demonstrate that Beancount can handle trust accounting correctly, even if the workflow is clunky.

Why start this small? Because you’ll discover edge cases immediately:

  • How to handle partial retainer refunds when a case settles early
  • What to do when a check bounces after you’ve reconciled
  • How to track interest that accrues to the IOLTA account but belongs conceptually to clients

Better to solve these problems with one test client than to build automation and infrastructure that makes wrong assumptions.

Phase 2: Streamline Your Own Workflow (3-6 months)

Once you’ve proven the core concept works, optimize your workflow (the bookkeeper), not the attorney’s:

  • Import scripts for the specific bank your client uses
  • BQL query templates you run monthly (save them as .sh scripts or Fava saved queries)
  • Documentation for yourself: “How I handle earned fee transfers,” “How I reconcile checks,” “Common mistakes I’ve made”

This is where Bob’s expertise becomes invaluable. You’re the power user. Build the tools you need to serve clients efficiently.

Phase 3: Package for Others (6-12 months)

Only after you’ve battle-tested your workflow with real attorney clients under real bar association scrutiny should you think about:

  • Creating GitHub templates for other bookkeepers
  • Building Fava plugins for trust-specific reports
  • Writing documentation for attorneys

Why wait? Because you don’t know yet what the hard problems are. Build the infrastructure after you’ve solved the real-world problems, not before.

The “Mirror Liability” Approach: A Cautionary Note

Alice, I love your enthusiasm for the liability account approach—it’s conceptually elegant and mathematically correct. But I want to inject a note of caution based on my own over-engineering mistakes.

The danger: Creating account structures so complex that reconciliation becomes harder, not easier.

Consider this simpler alternative for someone just starting:

; Minimal trust account structure
2020-01-15 open Assets:Trust:IOLTA
2020-01-15 open Liabilities:ClientTrust

Just one liability account for all client funds. Use metadata to distinguish clients:

2026-03-10 * "Client retainer - Smith"
  client: "Smith"
  matter: "2026-DIV-001"
  Assets:Trust:IOLTA           3500.00 USD
  Liabilities:ClientTrust     -3500.00 USD

Then query by client when needed:

SELECT sum(position) 
WHERE account = 'Liabilities:ClientTrust'
  AND any_meta('client') = 'Smith';

Why simpler? Because you can always split Liabilities:ClientTrust into per-client accounts later (Liabilities:ClientTrust:Smith, Liabilities:ClientTrust:Jones, etc.) if you find you need it. But you can’t easily merge complex accounts back into simple ones once you’ve committed to the complex structure.

Start simple. Add complexity only when simplicity breaks.

That said, Alice’s per-client liability accounts make total sense for firms with 20+ active clients where you want account-level balance assertions. My point is: start with 1-3 clients in a pilot. Don’t architect for 100 clients on day one.

Bob’s Practical Questions Deserve Practical Answers

Check Reconciliation

Bob asked about handling check numbers. Yes, metadata is the way:

2026-03-12 * "Court filing fee" ^check-1234
  check_number: "1234"
  Assets:Trust:IOLTA          -435.00 USD
  Liabilities:ClientTrust      435.00 USD

The ^check-1234 is a Beancount link (I use links for cross-referencing). The check_number metadata is for querying.

For reconciliation, I’d build a simple Python script:

  1. Export cleared checks from bank statement (usually CSV)
  2. Query Beancount for all transactions with check_number metadata
  3. Match: which checks cleared, which are outstanding
  4. Flag discrepancies for manual review

This is exactly the kind of automation Bob should build in Phase 2 after manually reconciling checks for a few months.

Fava Customization

Bob asked: “Can Fava be customized this deeply?”

Short answer: Yes, Fava supports custom extensions/plugins.

Longer answer: It’s non-trivial Python development. You’d create a Fava extension that:

  • Queries the Beancount ledger
  • Formats data according to California CTAPP requirements
  • Renders as HTML or exports as PDF

Realistic answer: Start with BQL queries that generate CSV output, then import into Excel/Google Sheets and format manually. Build the Fava plugin only after you’ve done this manual process 20+ times and know exactly what the output should look like.

Disaster Recovery

Bob’s disaster recovery question is critical. Here’s my setup (you can adapt):

  1. Git repository with the Beancount ledger (obviously)
  2. Daily automated commits (cron job: git add -A && git commit -m "Daily auto-commit" && git push)
  3. Remote backup on GitHub private repository or self-hosted Git server
  4. Weekly full exports: I export the entire ledger to CSV/JSON and store on separate backup drive

With Git, every change is tracked. If I make a catastrophic error on March 15, I can git checkout the ledger from March 14 and start over. This is better than QuickBooks backups in some ways: you have minute-by-minute version history, not just daily snapshots.

For trust accounting stakes: I’d add a manual review process before committing changes. Never commit directly to main branch. Always:

  1. Edit ledger
  2. Run bean-check to validate
  3. Review balance assertions
  4. Commit with descriptive message: “Added earned fee transfer for Smith matter, invoice #123
  5. If using collaborative workflow, have a second person review critical transactions

The “Bookkeeper-Managed Service” Model

Bob’s proposal to position this as a bookkeeper-managed service (not attorney self-service) is absolutely the right approach.

Think about successful plain text accounting adoption:

  • Personal finance enthusiasts: Self-service, they learn Beancount syntax
  • Small businesses with technical founders: Self-service, they script imports
  • Everyone else: They hire a bookkeeper/accountant who manages it for them

Law firms fit squarely in the “everyone else” category. Solo attorneys don’t want to learn Beancount. They want:

  • “You handle it”
  • “Give me the reports I need for the bar”
  • “Don’t let me get disbarred”

That’s a service business opportunity for bookkeepers who invest in Beancount expertise. You charge the attorney $500-1000/month for trust accounting management, you use Beancount as your back-end tool, they get better compliance at lower cost than Clio, and you keep the margin.

What Would Actually Move This Forward

Alice proposed a GitHub repository with state-specific templates. I support this, but not yet.

First step: Bob, run a 3-month pilot with your attorney client. Document everything:

  • What works easily
  • What’s painful
  • What queries you run monthly
  • What reports you generate
  • What edge cases you encounter

After 3 months, write a pilot retrospective sharing what you learned.

Second step: If (and only if) the pilot succeeds and Bob says “Yes, this works, I want to roll this out to more attorney clients,” then we build infrastructure:

  • Bob shares his working ledger (anonymized) as an example
  • Alice writes BQL query templates for California CTAPP reporting
  • Tina documents tax implications and 1099 tracking
  • Community creates GitHub repo: beancount-trust-accounting

Why this order? Because without real-world validation, we’ll build the wrong thing. Bob’s pilot will reveal what’s actually needed vs. what we think is needed.

Specific Answers to Bob’s Questions

  1. Has anyone used Beancount for trust accounting in production?

Not to my knowledge in this community (though I’m not active in legal circles). This is genuinely new territory. That’s exciting but also means: no established best practices yet. Bob, you’d be the pioneer.

  1. What Fava plugins exist for custom reports?

Check the Fava documentation on extensions. You can build custom pages, custom charts, custom reports. It requires Python development but is well-documented.

  1. How do you handle physical check reconciliation?

Covered above: metadata + Python script to match against bank statement.

  1. Is there a Beancount community for legal/trust accounting?

Not yet. But if Bob’s pilot succeeds, we should create one. GitHub org + Discussions would be my recommendation.

  1. What’s the disaster recovery plan?

Covered above: Git + remote backups + weekly full exports.

My Offer

I’m willing to help in a mentoring capacity (not hands-on development, as I’m not a legal/trust accounting expert):

  • Code review: Bob, if you build import scripts or reconciliation tools, I can review the Python code
  • Architecture advice: Happy to help design account structures and metadata schemas
  • Beancount best practices: Share lessons learned from 4+ years of use

What I won’t do:

  • Build California CTAPP report generators (I don’t know the requirements)
  • Provide legal/compliance advice (not a lawyer or CPA)
  • Promise this will work (it’s experimental, proceed with caution)

Final Encouragement

Bob, your instinct to pilot with one attorney client before scaling is exactly right. Your July 2026 QuickBooks renewal deadline creates natural urgency.

My suggestion:

  • April 2026: Set up basic Beancount structure, enter 3 months of historical data manually, prove reconciliation works
  • May 2026: Run parallel (Beancount + QuickBooks) for one month to build confidence
  • June 2026: Evaluate whether Beancount is truly ready or if you need another 6 months
  • July 2026: Make go/no-go decision on QuickBooks renewal

If you run this pilot and document it thoroughly, you’ll either:

  • Succeed: Become the expert who built the first production Beancount trust accounting system, launch a consulting practice helping other bookkeepers do the same
  • Fail: Learn exactly why it doesn’t work and save future people the effort, which is also valuable

Either outcome is useful. The worst outcome is not trying.

Alice, Tina, Bob—this is a stellar discussion. Let’s keep it practical, start small, and build from real-world experience.