My Journey from Spreadsheets to Beancount
Six months ago, I was tracking my finances in Google Sheets with formulas everywhere and manual categorization. After discovering Beancount, I made the switch and haven’t looked back. I want to share my journey, mistakes I made, and the workflow I’ve settled into.
Why I Switched from Spreadsheets
My spreadsheet system was breaking down:
- 40+ sheets with copy-pasted formulas (nightmare to maintain)
- No validation: I made data entry errors constantly
- Investment tracking: Impossible to track cost basis properly
- Historical analysis: Each month I’d accidentally overwrite past data
- Tax time: Spent 2 weeks manually aggregating everything
I briefly considered GnuCash (GUI-based) but the database felt like a black box. I wanted my data in plain text, version-controlled, and future-proof.
Month 1: The Learning Curve
Week 1: Installation and Setup
# Installing Beancount + Fava on macOS
pip3 install beancount fava
# Create directory structure
mkdir -p ~/finances/{documents,imports,prices}
touch ~/finances/main.beancount
I started with the absolute minimum:
; main.beancount - Day 1
option "title" "Personal Finances"
option "operating_currency" "USD"
; Opening balances
2024-05-01 open Assets:Bank:Checking
2024-05-01 open Expenses:Groceries
2024-05-01 open Income:Salary
; First transaction ever
2024-05-01 * "Whole Foods"
Expenses:Groceries 67.43 USD
Assets:Bank:Checking -67.43 USD
Mistake #1: I tried to import 5 years of history on Day 1. Error overload! Instead, I should have:
- Started with just ONE WEEK of current transactions
- Learned the syntax by manually entering expenses
- Only then tackled historical import
Week 2: File Organization
After a week of everything in one file, I reorganized:
~/finances/
├── main.beancount # Main entry point
├── accounts.beancount # Account definitions
├── 2024/
│ ├── 01-january.beancount
│ ├── 02-february.beancount
│ └── ...
├── 2023/
│ └── ...
├── prices/
│ └── prices.beancount # Price directives
└── documents/
├── receipts/
└── statements/
main.beancount became just includes:
option "title" "Personal Finances"
option "operating_currency" "USD"
include "accounts.beancount"
include "2023/*.beancount"
include "2024/*.beancount"
include "prices/prices.beancount"
accounts.beancount has all my account definitions:
; Bank accounts
2024-01-01 open Assets:Bank:Checking USD
2024-01-01 open Assets:Bank:Savings USD
; Credit cards
2024-01-01 open Liabilities:CreditCard:Chase USD
; Expenses (organized by category)
2024-01-01 open Expenses:Housing:Rent
2024-01-01 open Expenses:Food:Groceries
2024-01-01 open Expenses:Food:Dining
2024-01-01 open Expenses:Transport:Gas
; ... etc
; Income sources
2024-01-01 open Income:Salary:TechCorp
; Equity
2024-01-01 open Equity:Opening-Balances
Week 3-4: Daily Workflow Development
I tried different workflows and settled on this:
Daily (5 minutes):
# Open current month's file
code ~/finances/2024/10-october.beancount
# Add transactions from today (from phone notes or receipts)
# Run validation
bean-check ~/finances/main.beancount
# Quick visual check in Fava
fava ~/finances/main.beancount
# Open http://localhost:5000
I keep a note on my phone for quick expense capture:
10/30 Coffee shop $4.50
10/30 Lunch $12
10/31 Gas $45
Then transcribe to Beancount in the evening.
Month 2-3: Building Good Habits
Balance Assertions: Game Changer
This was the feature that made everything click:
; Every week, I check my bank balance and add:
2024-10-31 balance Assets:Bank:Checking 2847.32 USD
; If this doesn't match, bean-check FAILS
; This catches:
; - Missing transactions
; - Typos in amounts
; - Wrong account mappings
I set a weekly calendar reminder to add balance assertions. Takes 2 minutes, catches errors immediately.
Common Beginner Pitfalls I Hit
Pitfall #1: Wrong account signs
; WRONG - This doesn't balance!
2024-05-15 * "Paycheck"
Assets:Bank:Checking 3000.00 USD
Income:Salary 3000.00 USD ; Should be NEGATIVE!
; CORRECT
2024-05-15 * "Paycheck"
Assets:Bank:Checking 3000.00 USD
Income:Salary -3000.00 USD
Income has negative balances because it’s on the right side of the accounting equation. Took me 3 weeks to internalize this!
Pitfall #2: Forgetting commodity declarations
; This errors out:
2024-06-01 * "Buy stock"
Assets:Investments 10 AAPL {150.00 USD} ; Error: AAPL not declared
Assets:Cash -1500.00 USD
; Need to add to accounts.beancount:
2024-01-01 commodity AAPL
name: "Apple Inc."
Pitfall #3: Account type confusion
; WRONG - checking account is not an expense!
2024-06-10 open Checking ; Error: Must start with account type
; CORRECT
2024-06-10 open Assets:Bank:Checking
Month 4: Integration with Real Life
Using Fava Daily
I keep Fava running all the time now:
Home page: Quick net worth overview
- Assets: $45,230
- Liabilities: -$8,450
- Net Worth: $36,780
Income Statement: Month-to-date spending
Expenses:
Housing: $1,500
Food: $450
Transport: $200
Entertainment: $120
Query tab: Ad-hoc analysis
-- How much did I spend on dining out this month?
SELECT sum(position)
WHERE account ~ 'Expenses:Food:Dining'
AND month = 10
AND year = 2024
Tax Preparation Integration
I’m not an accountant, but Beancount makes tax prep easier:
Step 1: Mark tax-deductible expenses
2024-08-15 * "Home office desk"
tax-deductible: "yes"
tax-category: "home-office"
Expenses:Equipment 450.00 USD
Assets:Cash -450.00 USD
Step 2: Query at tax time
SELECT account, sum(position)
WHERE metadata('tax-deductible') = 'yes'
AND year = 2024
Step 3: Export to CSV for accountant
bean-query main.beancount "SELECT * WHERE ..." -f csv > tax_2024.csv
Month 5-6: Advanced Workflows
Monthly Reconciliation Process
First weekend of each month (30 minutes):
- Download statements from all accounts
- Add balance assertions for end of previous month
- Run bean-check - fix any errors
- Review in Fava:
- Income vs Expenses (am I saving enough?)
- Budget vs Actual (using custom BQL query)
- Net worth trend (is it growing?)
- File statements in
documents/folder
Quarterly Review
Every 3 months (1 hour):
- Investment performance: Compare cost basis to current value
- Spending trends: Are any categories growing unexpectedly?
- Goal tracking: Am I on track for savings goals?
- Account cleanup: Close any unused accounts, consolidate
Version Control
cd ~/finances
git init
git add .
git commit -m "Initial commit"
# Daily commits (automated)
git add -A
git commit -m "Update $(date +%Y-%m-%d)"
git push
I have a private GitHub repo. Benefits:
- History: Can see my finances on any date
- Backup: Don’t lose years of data
- Sync: Access from laptop and desktop
Tools I Use Daily
- VS Code with Beancount extension (syntax highlighting, autocomplete)
- Fava (always running at http://localhost:5000)
- bean-check (validate after every change)
- Apple Notes (quick expense capture on phone)
- Hazel (macOS automation - auto-move bank statements to correct folder)
What I’d Do Differently
If I started over today:
- Start smaller: Just track expenses for 2 weeks before anything complex
- Learn balance assertions earlier: They’re the killer feature
- Use Fava from Day 1: The web UI makes everything clearer
- Don’t stress about perfect categorization: You can always recategorize later (it’s plain text!)
- Join the community earlier: The Google Group is incredibly helpful
Results After 6 Months
- Complete financial picture: Every dollar tracked
- Investment tracking: Accurate cost basis for taxes
- Time spent: 15 min/week (vs 2-3 hours/month with spreadsheets)
- Confidence: I know exactly where my money is
- Tax prep: From 2 weeks → 2 hours (just export and hand to accountant)
Questions I Still Have
- Advanced budgeting: How do others implement budgets in Beancount?
- Mobile apps: Any good iOS apps for quick transaction entry?
- Forecasting: Can I use Beancount data to forecast future cash flow?
If you’re considering Beancount, my advice: Just start. Don’t wait for the perfect setup. Create a file, add one transaction, and build from there. The strictness that seems intimidating at first becomes your best friend.
Happy to answer questions about the beginner experience!