Used YNAB 4 years. Love envelope budgeting but tired of subscription.
Love about YNAB:
- Envelope budgeting
- Easy to use
- Mobile app
Why Beancount:
- Own data (plain text!)
- No subscription
- Powerful reporting
- Version control
Fears:
- Learning curve
- Lose budgeting discipline?
- Migration painful
Anyone made this switch?
Migrated from GnuCash - best decision!Timeline:- Week 1: Frustrating- Week 2: Clicking- Week 3: Faster than old- Month 3: Love itGains:- Data ownership- Flexibility- Version control!- No vendor lock-inMigration:- Start with opening balances- Keep old system read-only- Commit to 30 daysWorth it!
YNAB concept mapping to Beancount - translation guide:
YNAB Concept |
Beancount Equivalent |
Budget Category |
Assets:Budget:CategoryName (virtual envelope) |
To Be Budgeted |
Assets:Budget:Unallocated |
Available |
Query: sum of budget account balance |
Category Balance |
Query balance of specific budget account |
Age of Money |
Custom BQL query (days since income) |
Goals |
Custom metadata + Fava extension |
Reconciliation |
balance assertions |
Payees |
payee field in transactions |
Memos |
narration field |
Flags |
Beancount #tags or ^links |
Split Transactions |
Multi-line postings (native!) |
Credit Card Payment |
Transfer between accounts |
Example - YNAB split in Beancount:
YNAB:
$100 to Target
$40 → Groceries
$35 → Household
$25 → Clothing
Beancount:
2024-01-15 * "Target"
Assets:Checking -100.00 USD
Expenses:Groceries 40.00 USD
Expenses:Household 35.00 USD
Expenses:Clothing 25.00 USD
Same concept, clearer syntax!
Pro tip: You can run BOTH systems in parallel for 1 month to build confidence before fully switching.
Mobile solution for Beancount - addressing YNAB’s biggest advantage:
Option 1: Fava on mobile browser
- Host Fava on a server (DigitalOcean, AWS, home server)
- Access via mobile browser
- Works surprisingly well!
- Can view balances, run queries
- Limited transaction entry
Option 2: Quick entry apps
- Beancount Mobile (Android) - basic transaction entry
- Plain Text Accounting (iOS) - syncs with Dropbox
- Both sync to your main ledger file
Option 3: My hybrid workflow
Mobile spending:
1. Take photo of receipt (Google Photos auto-backup)
2. Quick note in Apple Notes: "Starbucks $5.47"
3. Saturday morning: process week's notes → Beancount
Option 4: SMS/Email to Beancount
Send “Groceries $47.23” via SMS → Python script parses → adds to ledger
Reality check:
Mobile won’t be as good as YNAB. But:
- Most people budget on desktop anyway
- Quick mobile entry is enough
- Weekly processing = better financial awareness
My take: YNAB’s mobile app was great but I didn’t use it as much as I thought. Desktop + weekly processing works fine.
Cost-benefit analysis - YNAB vs Beancount (2025):
YNAB Costs:
- Subscription: $109/year (increased from $99!)
- 10-year cost: $1,090
- 20-year cost: $2,180
- Forever locked into subscription
Beancount Costs:
- Software: $0 (free, open source)
- Learning time: ~20 hours initial
- Weekly maintenance: 10-15 min
- Optional: VPS for Fava ($5/month = $60/year)
Break-even analysis:
If your time is worth $50/hour:
- Initial setup: 20 hours = $1,000
- Extra weekly time vs YNAB: ~5 min = 4.3 hours/year = $215/year
Year 1: $1,000 + $215 = $1,215 (more expensive)
Year 2: $215 vs $109 (still more expensive)
Year 3+: $215 vs $109 (still more expensive if counting time)
BUT the real value:
- Own your data - priceless
- No vendor lock-in - YNAB could 10x prices
- Unlimited capabilities - can’t put a price on flexibility
- Privacy - your financial data stays local
- Learning - understanding double-entry accounting
Who should migrate:
Technical users who value control
Multi-currency needs
Complex financial situations
Long-term thinkers
Privacy-conscious
Those frustrated by YNAB limitations
Who should stay with YNAB:
Non-technical users
Heavy mobile app users
Simple finances (1-2 accounts)
Value convenience over control
My verdict: Migration is an investment in financial independence!
Common migration pitfalls and how to avoid them:
Pitfall 1: Trying to migrate ALL history
Don’t: Import 10 years of transactions on day 1
Do: Start fresh with current balances, keep YNAB for historical reference
; Use opening balances for current state:
2024-01-01 * "Opening Balance" | "Migration from YNAB"
Assets:Checking 3,247.82 USD
Equity:OpeningBalances
2024-01-01 * "Opening Balance" | "Credit Card"
Liabilities:CreditCard:Chase -1,456.23 USD
Equity:OpeningBalances
Pitfall 2: Overcomplicating the chart of accounts
Don’t: Create 200 micro-categories from day 1
Do: Start simple, add granularity as needed
; Start here:
Expenses:Food
Expenses:Housing
Expenses:Transportation
; Not here:
Expenses:Food:Groceries:Produce:Organic:Vegetables
Pitfall 3: Ignoring reconciliation
Don’t: Import blindly without checking balances
Do: Add balance assertions regularly
; After each month:
2024-01-31 balance Assets:Checking 2,847.23 USD
2024-02-28 balance Assets:Checking 3,102.45 USD
Pitfall 4: Expecting the same UX
Don’t: Look for YNAB’s exact interface
Do: Embrace plain text advantages
- Version control with git
- Powerful queries with BQL
- Scriptable automation
- Own your data
Pitfall 5: Forgetting about backups
Don’t: Keep only local copy
Do: Use git + remote backup
cd ~/finance
git init
git add .
git commit -m "Initial Beancount setup"
git remote add origin [email protected]:you/finance-private.git
git push -u origin main
Pro tip: Run YNAB and Beancount in parallel for 1 month to build confidence before fully switching!
Quick entry workflows - solving YNAB’s biggest advantage:
The Problem:
YNAB’s mobile app makes entry instant. Beancount requires more steps.
Solution 1: Voice-to-text notes
iPhone/Android voice note:
"Starbucks 5.47 coffee"
"Target 124.32 split: groceries 87, household 37.32"
"Gas station 45 transportation"
Saturday morning: convert to Beancount
Solution 2: Simple note template
Keep a note with this format:
2024-01-15 | Starbucks | 5.47 | Dining
2024-01-15 | Target | 124.32 | Groceries/Household
2024-01-16 | Gas | 45.00 | Transportation
Python script converts to Beancount:
#!/usr/bin/env python3
import sys
for line in sys.stdin:
date, payee, amount, category = line.strip().split('|')
print(f'{date.strip()} * "{payee.strip()}"')
print(f' Assets:Checking -{amount.strip()} USD')
print(f' Expenses:{category.strip()}')
print()
Solution 3: SMS to Beancount
Send text to yourself → Python script processes:
# Watches inbox, parses texts like:
# "Spent $5.47 at Starbucks for coffee"
# Generates: 2024-01-15 * "Starbucks" Expenses:Dining
Solution 4: Fava mobile + Tailscale
- Run Fava on home computer
- Use Tailscale for secure remote access
- Access Fava via mobile browser anywhere
- Enter transactions directly
My workflow:
- Quick notes during week (Apple Notes)
- 10 minutes Saturday morning to process
- Better financial awareness than real-time entry!
Reality: YNAB’s instant entry is nice but not essential for most people.
Budget envelope method in Beancount - replicating YNAB’s core feature:
This is what made YNAB special. Here’s how to do it in Beancount:
Setup: Virtual envelope accounts
; Envelope accounts (like YNAB categories)
open Assets:Budget:Groceries
open Assets:Budget:Dining
open Assets:Budget:Entertainment
open Assets:Budget:Transportation
open Assets:Budget:Savings:Emergency
open Assets:Budget:Savings:Vacation
; Your actual money
open Assets:Checking
open Assets:Savings
Monthly allocation (like YNAB’s “To Be Budgeted”)
2024-01-01 * "January budget allocation"
Assets:Checking -3000.00 USD ; Money leaves checking
Assets:Budget:Groceries 500.00 USD ; Goes to envelopes
Assets:Budget:Dining 300.00 USD
Assets:Budget:Entertainment 150.00 USD
Assets:Budget:Transportation 400.00 USD
Assets:Budget:Savings:Emergency 500.00 USD
Assets:Budget:Savings:Vacation 200.00 USD
Assets:Budget:Unallocated 950.00 USD ; Leftover
When you spend (envelope decreases)
2024-01-15 * "Whole Foods"
Assets:Checking -87.43 USD ; Money spent from checking
Expenses:Groceries 87.43 USD ; Track actual expense
Assets:Budget:Groceries -87.43 USD ; Decrease envelope
Income:Budget:Released ; Balance it out
Check envelope balances (like YNAB’s category view)
SELECT account, sum(position)
WHERE account ~ 'Assets:Budget'
GROUP BY account
Results:
Assets:Budget:Groceries 412.57 USD (spent 87.43)
Assets:Budget:Dining 300.00 USD (nothing yet)
Assets:Budget:Entertainment 150.00 USD
Fava visualization:
Create custom query to show budget vs actual as bar chart!
This gives you YNAB’s envelope budgeting with Beancount’s power!
Resources that helped my migration:
Official Documentation:
-
Beancount docs - Beancount Documentation
- Read “Getting Started” first
- Reference “Language Syntax” often
-
Fava - GitHub - beancount/fava: Fava - web interface for Beancount
- Web interface for Beancount
- Essential for visualization
Community Resources:
-
Awesome Beancount - GitHub list of tools
- Import tools for every bank
- Scripts and utilities
- Extension gallery
-
Plain Text Accounting - plaintextaccounting.org
- Cross-tool resources
- Community discussions
Migration-Specific:
-
YNAB to Beancount converter (community tool)
pip install ynab2beancount
ynab2beancount export.csv > ledger.beancount
-
Beancount import framework
pip install beancount-import
# Smart categorization, learns from history
Learning Path I Followed:
Week 1: Read docs, create simple test ledger
Week 2: Export YNAB, practice imports
Week 3: Set up automation for banks
Week 4: Parallel run (YNAB + Beancount)
Month 2: Beancount only, canceled YNAB
Best tutorial:
The “Command Line Accounting in 2024” blog series covers modern workflows perfectly.
Pro tip: Join the Plain Text Accounting community - incredibly helpful people who’ve all done this migration!