How I Manage My Entire Financial Life with Beancount: A 3-Year Journey

How I Manage My Entire Financial Life with Beancount: A 3-Year Journey

From financial chaos to complete clarity using plain text accounting


Why I Switched to Beancount

Three years ago, my personal financial tracking was a complete disaster:

  • Mint couldn’t handle my international accounts and investment complexity
  • YNAB felt too restrictive with its envelope budgeting philosophy
  • Excel became an unmaintainable nightmare of 47 interconnected tabs
  • Quicken was expensive, Windows-only, and felt like software from 2005

As a financial consultant, I was helping clients with sophisticated accounting, but my own finances were chaos. I needed something that could handle:

  • Multiple currencies (USD, EUR, JPY from international clients)
  • Investment tracking across 3 different brokerages
  • Cryptocurrency holdings on various exchanges
  • Real estate and complex mortgage amortization
  • Freelance consulting income with quarterly tax estimates
  • Business expense tracking for client reimbursements

Beancount changed everything. Plain text accounting means:

  • My financial data is mine forever (no vendor lock-in)
  • Version controlled in Git with complete audit history
  • Infinitely customizable with Python scripts and queries
  • Completely transparent double-entry bookkeeping
  • Professional-grade accuracy for personal use

My Complete Beancount Setup

Directory Structure

finances/
├── main.beancount          # Main file with includes
├── accounts.beancount      # Account definitions
├── commodities.beancount   # Currency & stock definitions
├── prices/                 # Price history files
│   ├── stocks.beancount
│   ├── crypto.beancount
│   └── forex.beancount
├── years/                  # Yearly transaction files
│   ├── 2022.beancount
│   ├── 2023.beancount
│   ├── 2024.beancount
│   └── 2025.beancount
├── importers/             # Custom import scripts
│   ├── chase_credit.py
│   ├── schwab_brokerage.py
│   ├── coinbase_pro.py
│   └── paypal_business.py
├── reports/               # Custom queries & reports
│   ├── monthly_summary.bql
│   ├── tax_report.py
│   └── client_billing.bql
└── budget/                # Budget tracking
    └── 2025_budget.beancount

Real Transaction Examples from My Personal Ledger

Consulting Income with Tax Planning

2025-01-31 * "Client ABC Corp" "Financial consulting project Q4 2024"
  Assets:US:Chase:Business           4,500.00 USD
  Income:US:Consulting:Financial    -4,500.00 USD
  
; Immediately set aside estimated taxes
2025-01-31 * "Tax Allocation" "Q1 2025 estimated taxes - consulting"
  Assets:US:Chase:Business          -1,125.00 USD  ; 25% effective rate
  Assets:US:Chase:TaxReserve         1,125.00 USD

Complex Investment Purchase with Multiple Lots

2025-02-15 * "Charles Schwab" "Dollar cost averaging - VTI purchase"
  Assets:US:Schwab:Personal         -2,000.00 USD
  Assets:US:Schwab:Personal:VTI         4.421 VTI {452.14 USD}  ; Feb lot
  Expenses:Financial:Fees                0.00 USD  ; Commission-free

; Track separate lot from January for tax purposes
2025-01-15 * "Charles Schwab" "VTI purchase - January lot"
  Assets:US:Schwab:Personal         -2,000.00 USD
  Assets:US:Schwab:Personal:VTI         4.521 VTI {442.41 USD}  ; Jan lot

Cryptocurrency with DeFi Tracking

2025-02-20 * "Coinbase Pro" "ETH purchase for DeFi staking"
  Assets:US:Chase:Personal          -3,000.00 USD
  Expenses:Financial:Fees               22.50 USD  ; 0.75% fee
  Assets:Crypto:Coinbase:ETH            1.245 ETH {2,410 USD}
  
; Track staking rewards
2025-02-25 * "Lido Finance" "ETH staking rewards"
  Assets:Crypto:Lido:stETH               0.0012 STETH {2,410 USD}
  Income:Crypto:Staking:ETH             -2.89 USD

International Client Payment with Currency

2025-03-10 * "European Client SA" "Financial audit consulting"
  Assets:EU:Deutsche:Business        3,200.00 EUR @ 1.0850 USD
  Income:EU:Consulting:Audit        -3,472.00 USD
  
2025-03-10 price EUR  1.0850 USD  ; Exchange rate

Home Office Expenses for Tax Deduction

2025-01-31 * "Comcast Business" "Internet - home office"
  Liabilities:US:Chase:CreditCard      -89.99 USD
  Expenses:Business:HomeOffice:Internet  89.99 USD
  
2025-01-15 * "PG&E" "Electricity - 25% business use"
  Liabilities:US:Chase:CreditCard     -145.67 USD
  Expenses:Personal:Utilities:Electric -109.25 USD  ; 75% personal
  Expenses:Business:HomeOffice:Utils    36.42 USD   ; 25% business

Automation That Saves 15 Hours per Week

Smart Transaction Categorization

#!/usr/bin/env python3
"""Intelligent transaction categorizer using machine learning"""

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
import joblib

class TransactionCategorizer:
    def __init__(self):
        self.vectorizer = TfidfVectorizer(max_features=1000, ngram_range=(1,2))
        self.classifier = MultinomialNB()
        self.is_trained = False
        
    def train_from_ledger(self, ledger_path):
        """Train on existing categorized transactions"""
        transactions = self._extract_transactions(ledger_path)
        
        # Features: payee + narration
        X = transactions['description']
        y = transactions['account']
        
        # Vectorize and train
        X_vectorized = self.vectorizer.fit_transform(X)
        self.classifier.fit(X_vectorized, y)
        self.is_trained = True
        
        # Save model
        joblib.dump(self.vectorizer, 'models/vectorizer.pkl')
        joblib.dump(self.classifier, 'models/classifier.pkl')
        
    def predict_category(self, description):
        """Predict account category for new transaction"""
        if not self.is_trained:
            self._load_model()
            
        X_vectorized = self.vectorizer.transform([description])
        prediction = self.classifier.predict(X_vectorized)[0]
        confidence = self.classifier.predict_proba(X_vectorized).max()
        
        return prediction, confidence
        
# Usage in importer
categorizer = TransactionCategorizer()
expense_account, confidence = categorizer.predict_category("WHOLE FOODS MARKET")
if confidence > 0.8:
    # High confidence, auto-categorize
    return expense_account
else:
    # Low confidence, flag for manual review
    return "Expenses:ReviewNeeded"

Automated Price and Exchange Rate Updates

#!/bin/bash
# update_all_prices.sh - Runs daily at 6 PM ET via cron

cd ~/finances

echo "Updating stock prices..."
# Stock prices from Yahoo Finance
bean-price -e 'USD:yahoo/^VTI' -d $(date +%Y-%m-%d) >> prices/stocks.beancount
bean-price -e 'USD:yahoo/^VXUS' -d $(date +%Y-%m-%d) >> prices/stocks.beancount  
bean-price -e 'USD:yahoo/^BND' -d $(date +%Y-%m-%d) >> prices/stocks.beancount

echo "Updating crypto prices..."
# Crypto prices from CoinGecko API
bean-price -e 'USD:coingecko/bitcoin' -s BTC -d $(date +%Y-%m-%d) >> prices/crypto.beancount
bean-price -e 'USD:coingecko/ethereum' -s ETH -d $(date +%Y-%m-%d) >> prices/crypto.beancount

echo "Updating forex rates..."
# Foreign exchange rates
bean-price -e 'USD:exchangerate-api/EUR' -s EUR -d $(date +%Y-%m-%d) >> prices/forex.beancount
bean-price -e 'USD:exchangerate-api/JPY' -s JPY -d $(date +%Y-%m-%d) >> prices/forex.beancount

# Validate and commit
bean-check main.beancount
if [ $? -eq 0 ]; then
    git add -A
    git commit -m "Daily price update $(date +%Y-%m-%d)"
    git push origin main
    echo "✅ Prices updated and committed successfully"
else
    echo "❌ Beancount validation failed, prices not committed"
    git checkout -- prices/
fi

Powerful Analysis Queries

Monthly Cash Flow Analysis

-- Detailed monthly cash flow by category
SELECT 
  year(date) as year,
  month(date) as month,
  root(account, 2) as category,
  sum(position) as amount,
  count(*) as transactions
WHERE 
  (account ~ '^Income:' OR account ~ '^Expenses:')
  AND date >= 2024-01-01
GROUP BY year, month, category
HAVING abs(amount) > 50  -- Filter noise
ORDER BY year DESC, month DESC, amount DESC

Investment Performance with Benchmarking

-- Current positions vs S&P 500 equivalent
SELECT
  account,
  units(sum(position)) as shares,
  cost(sum(position)) as cost_basis,
  value(sum(position)) as market_value,
  (value(sum(position)) - cost(sum(position))) as unrealized_gain,
  (value(sum(position)) - cost(sum(position))) / cost(sum(position)) * 100 as gain_pct
WHERE 
  account ~ '^Assets:.*:Personal:'
  AND currency != 'USD'  -- Non-cash holdings
  AND number(position) != 0
GROUP BY account
HAVING abs(cost(sum(position))) > 100
ORDER BY cost_basis DESC

Tax Planning Query

-- Current year tax-deductible business expenses
SELECT 
  root(account, 3) as expense_type,
  sum(position) as amount,
  count(*) as transactions
WHERE 
  account ~ '^Expenses:Business:'
  AND year(date) = 2025
GROUP BY expense_type
ORDER BY amount DESC

My Optimized Workflow

Daily Routine (10 minutes)

  1. Morning review: Check overnight transactions via bank apps
  2. Quick entry: Add new transactions to inbox.beancount
  3. Validation: bean-check main.beancount
  4. Smart categorization: Run ML categorizer on uncategorized expenses
  5. Git commit: Daily snapshot with meaningful commit messages

Weekly Deep Dive (45 minutes)

  1. Import automation: Run all CSV importers in parallel
  2. Reconciliation: bean-report main.beancount balances vs bank statements
  3. Review predictions: Check ML-categorized transactions for accuracy
  4. Investment review: Update prices and check rebalancing needs
  5. Client billing: Extract billable hours and expenses for invoicing

Monthly Analysis (1 hour)

  1. Financial dashboard: Generate comprehensive reports via Fava
  2. Budget variance: Compare actual vs planned spending
  3. Tax planning: Update quarterly estimates based on YTD income
  4. Investment rebalancing: Execute trades if allocations drift >5%
  5. Client reporting: Generate financial summaries for advisory clients

Advanced Features I Can’t Live Without

Dynamic Budget Tracking

; Percentage-based budget allocation
2025-01-01 custom "budget-rule" Income:US:Consulting
  housing: "30%"     ; Max 30% of income to housing
  savings: "20%"     ; Min 20% to investments
  taxes: "25%"       ; Estimated tax rate
  
; Monthly budget assertion with tolerance
2025-01-31 balance Assets:US:Chase:Personal  12,847.33 USD ~ 100.00 USD

Project and Client Tracking

; Client project with profit tracking
2025-02-15 * "Client XYZ" "Strategy consulting - Phase 1" #project-xyz ^contract-001
  Assets:US:Chase:Business           5,000.00 USD
  Income:US:Consulting:Strategy     -5,000.00 USD
  
2025-02-20 * "Uber" "Client meeting transportation" #project-xyz ^receipt-uber-001
  Liabilities:US:Chase:CreditCard      -45.67 USD
  Expenses:Business:Travel               45.67 USD
  
; Query project profitability:
; SELECT sum(position) WHERE 'project-xyz' in tags

Multi-Currency Net Worth

; Track international investments
2025-03-01 * "Deutsche Bank" "European ETF investment"
  Assets:EU:Deutsche:Investment      -2,500.00 EUR @ 1.0850 USD
  Assets:EU:Deutsche:MSCI:Europe       42.3 MSCI-EUROPE {59.10 EUR}
  
; Consolidated net worth query handles all currencies automatically

Results After 3 Years: Quantified Impact

Financial Improvements

  • Tax preparation: Reduced from 25+ hours to 90 minutes
  • Found money: Discovered $4,200/year in forgotten subscriptions and fees
  • Investment optimization: Better tax-loss harvesting improved after-tax returns by 1.8%
  • Business deductions: Systematic tracking increased deductions by $8,500/year
  • Client billing: Automated expense tracking improved billing accuracy by 15%
  • Fraud detection: Real-time transaction monitoring caught 3 unauthorized charges within hours

Professional Benefits

  • Client credibility: Demonstrating personal financial discipline wins trust
  • Improved advice: Understanding plain-text accounting deepened financial expertise
  • Automation skills: Python scripting led to consulting opportunities in fintech
  • Data analysis: Advanced queries provide insights that traditional software can’t match

Personal Life Impact

  • Stress elimination: Complete financial transparency with spouse
  • Decision confidence: Data-driven approach to major purchases and investments
  • Future planning: Clear historical trends enable accurate financial projections
  • Estate preparation: Complete financial documentation for beneficiaries

Integration with Professional Tools

Fava for Client Presentations

# Custom Fava configuration
fava main.beancount --host 0.0.0.0 --port 5000
# Access beautiful dashboards at http://localhost:5000
# Export charts and reports for client meetings

Git Integration for Audit Trail

# Professional-grade version control
git log --oneline --since="2024-01-01" | head -10
# Complete audit trail of every financial decision

Export to Traditional Formats

# Generate QuickBooks-compatible exports
bean-report main.beancount export-qif > client_books.qif

# Create Excel reports for non-technical clients
bean-query main.beancount "SELECT * FROM transactions WHERE year(date) = 2024" > 2024_summary.csv

Common Challenges & Professional Solutions

“It’s too complex for personal use”

Reality: Start simple. I began with just checking + expenses. Complexity grows with needs.

“Manual entry takes forever”

Solution: 85% automation via ML categorization + imports. Remaining 15% manual review prevents errors.

“No mobile access”

Solution: Fava’s responsive web interface + quick voice notes for later entry work perfectly.

“Spouse/family resistance”

Solution: Focus on results, not process. Fava’s visual reports make benefits clear to non-technical users.


Is Beancount Right for Your Personal Finances?

Perfect For:

  • Financial professionals who want to practice what they preach
  • Complex situations: Multiple income sources, investments, currencies
  • Privacy advocates: Complete data ownership and control
  • Automation enthusiasts: Enjoy scripting and customization
  • Long-term planners: Value permanent, portable data formats
  • Detail-oriented people: Want transaction-level precision

Consider Alternatives If:

  • You prefer plug-and-play solutions over customization
  • You need real-time mobile access to spending data
  • You’re uncomfortable with command-line tools
  • You prioritize ease-of-use over flexibility and control
  • Your finances are simple (single checking, basic expenses)

Resources & Getting Started

My Open Source Templates

I’ve published my complete setup:

Professional Training Materials


Final Thoughts from a Financial Professional

Beancount transformed both my personal finances and my professional practice. As someone who helps others with financial planning, using the same rigorous double-entry principles for my own finances provides:

  • Credibility: I practice what I preach
  • Insight: Deep understanding of financial data flows
  • Efficiency: Automated workflows save hundreds of hours annually
  • Accuracy: Professional-grade precision in personal finance
  • Transparency: Complete audit trail for any financial decision

The learning curve is significant, but the payoff is immense. Three years later, I can’t imagine managing finances—personal or professional—any other way.

For financial professionals: How can you advise clients on financial discipline if your own finances aren’t meticulously tracked?

For individuals: Your financial data is too important to trust to companies that can change, disappear, or lock you out.


Questions about implementation details? Want to share your own plain-text accounting journey? Let’s discuss the future of personal financial management! :bar_chart::briefcase:

Fred, this is exactly what I needed to see! I’ve been using QuickBooks for clients but my personal finances are a mess. The ML categorization approach is brilliant - I spend way too much time manually sorting transactions. Your business expense tracking setup is perfect for my CPA practice. Question: How do you handle mileage tracking for client visits? I’m currently using a separate app but want everything in Beancount. Also, the quarterly tax estimation workflow could save me hours during tax season.

This is incredibly comprehensive! As a tax specialist, I love the systematic approach to deduction tracking. The home office expense allocation (75% personal, 25% business) is exactly how it should be done. Your client project tracking with tags is genius for 1099 reporting. I’m definitely implementing the automated price updates - manually updating investment values for tax planning is tedious. The Git audit trail will be perfect for IRS documentation if ever questioned.

Fred, your automation setup puts my small business workflows to shame! The ML categorizer trained on historical transactions is next-level - I’m still manually categorizing everything. Your multi-currency handling is impressive too. Most of my clients avoid international transactions because of complexity, but this makes it manageable. Quick question: how do you handle bank reconciliation when automated imports sometimes miss transactions? Also, the Fava integration for client reports looks professional.