After three years of freelancing, I finally faced a harsh truth: I wasn’t making anywhere near what I thought I was charging.
The Wake-Up Call
I left my day job as a financial analyst to pursue freelance work, thinking I’d make great money at $65/hour. On paper, that’s $135,000 a year at 40 hours per week. Reality? I was making the equivalent of $31/hour when I actually did the math in Beancount.
The Brutal Math
Here’s what I discovered when I started tracking everything in my Beancount ledger:
Quoted rate: $65/hour
Hours worked per week: 45 (thinking I was hustling!)
Billable hours per week: Only 24
Annual billable hours: 1,248 (not the mythical 2,080)
The rest of my time went to:
- Writing proposals and estimates (8-10 hours/week)
- Client emails and communication (4-5 hours/week)
- Invoicing and bookkeeping (2-3 hours/week)
- Marketing and business development (4-6 hours/week)
Gross income: $81,120
Platform fees (Upwork 10%): -$8,112
Health insurance: -$10,800/year ($900/month)
Business expenses (software, equipment, etc.): -$4,200
Self-employment tax + income tax (~35% effective): -$20,153
Net take-home: $37,855
Actual hours worked: 2,340 (45 hours × 52 weeks)
True hourly rate: $16.18/hour
Wait, it gets worse. That doesn’t include retirement savings (which my old employer matched) or paid time off (which I no longer had). If I factor in 2 weeks unpaid vacation and lost 401k match, my effective rate was even lower.
How Beancount Exposed the Truth
I set up my ledger to track this properly:
2025-01-15 * "Acme Corp" "Project Alpha - Phase 1" #client-acme #billable
Income:Consulting:Billable -1300.00 USD
time: "20 hours"
effective-rate: "65.00 USD"
Assets:Bank:Checking 1300.00 USD
2025-01-15 * "Time spent" "Proposal writing for new client" #unbillable #sales
Expenses:Time:Unbillable 0.00 USD
time: "4 hours"
Every week, I tag my time as #billable or #unbillable. Then I run this query monthly:
SELECT
sum(number(time)) as total_hours,
sum(position) as revenue
WHERE account ~ 'Income:Consulting:Billable'
The dashboard I built in Fava shows:
- Billable vs unbillable hours
- Effective hourly rate (after platform fees)
- Net hourly rate (after all business expenses)
- True hourly rate (after taxes)
What I Changed
Armed with real data, I made hard decisions:
- Raised my rates to $95/hour (lost 2 low-value clients who were shocked)
- Stopped bidding on Upwork (20% platform fee was killing me)
- Implemented project minimums ($2,000 minimum, no exceptions)
- Tracked proposal conversion rates (stopped writing proposals for <30% close rate industries)
Six months later:
- Billable hours: 28/week (increased by focusing on fewer, better clients)
- Gross income: $137,280 annually
- True hourly rate: $52/hour after all expenses and taxes
Still not where I want to be, but 221% better than where I started.
The Question That Haunts Me
How many freelancers out there think they’re making good money but haven’t actually run the numbers?
For those of you tracking consulting/freelance income in Beancount: how do you calculate your true hourly rate? Do you factor in unbillable time? What rate would you need to match your previous W-2 lifestyle?
I’m sharing this because I wish someone had shown me these numbers three years ago. The math is uncomfortable, but it’s the only way to build a sustainable practice.