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)
- Morning review: Check overnight transactions via bank apps
- Quick entry: Add new transactions to
inbox.beancount - Validation:
bean-check main.beancount - Smart categorization: Run ML categorizer on uncategorized expenses
- Git commit: Daily snapshot with meaningful commit messages
Weekly Deep Dive (45 minutes)
- Import automation: Run all CSV importers in parallel
- Reconciliation:
bean-report main.beancount balancesvs bank statements - Review predictions: Check ML-categorized transactions for accuracy
- Investment review: Update prices and check rebalancing needs
- Client billing: Extract billable hours and expenses for invoicing
Monthly Analysis (1 hour)
- Financial dashboard: Generate comprehensive reports via Fava
- Budget variance: Compare actual vs planned spending
- Tax planning: Update quarterly estimates based on YTD income
- Investment rebalancing: Execute trades if allocations drift >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:
- Personal finance starter: github.com/fchen/beancount-personal
- Business/consulting setup: github.com/fchen/beancount-business
- ML categorization tools: github.com/fchen/beancount-ml
- Advanced reports: github.com/fchen/beancount-reports
Professional Training Materials
- Plain Text Accounting for Financial Professionals
- My Beancount Webinar Series
- Client Onboarding Templates
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! ![]()
![]()