Empower's Fee Analyzer 'Automatically Analyzes Fees on Investment Accounts'—Can We Replicate This with Beancount + BQL Queries?

Empower’s Fee Analyzer “Automatically Analyzes Fees on Investment Accounts”—Can We Replicate This with Beancount + BQL Queries?

I’ve been diving deep into FIRE tools lately, and Empower’s (formerly Personal Capital) fee analyzer keeps catching my attention. It automatically tracks investment fees and shows you exactly how much those “tiny” percentages are costing you over time.

The Problem: Fees Are Portfolio Killers

Here’s the brutal math that woke me up: a 1% annual fee might sound trivial, but on a $1M portfolio over 30 years at 7% returns, that 1% fee costs you over $300,000 in lost wealth. Research shows that someone paying 1% annually could end up with 28% less than someone paying just 0.25% over 30 years.

Empower’s fee analyzer makes this visible—it automatically:

  • Pulls expense ratios from connected accounts via Plaid
  • Calculates total fee burden as a percentage
  • Projects long-term impact in actual dollars
  • Compares your fees to low-cost benchmarks

The Privacy Trade-off I’m Not Willing to Make

But here’s my problem: to use Empower’s free tools, you have to:

  1. Share bank/brokerage credentials via Plaid
  2. Accept their black-box categorization algorithms
  3. Lock your financial data in their proprietary system

As someone tracking my path to FIRE in Beancount, I own my data. I know every transaction. I can query 5 years of history in seconds. But I don’t have an equivalent to Empower’s fee analyzer.

The Beancount Challenge: Can We Build This?

So here’s my question for the community: Can we replicate Empower’s fee analyzer functionality using Beancount + BQL queries?

Here’s what I think we’d need:

1. Track Investment Fees

  • Expense ratios (the 0.04% on my Vanguard index fund)
  • Advisory fees (if you use a wealth manager)
  • Transaction costs (trade commissions, bid-ask spreads)
  • 12b-1 fees (mutual fund marketing fees)

2. Calculate Total Fee Burden

Total Annual Fees / Total Portfolio Value = Fee Percentage

3. Compare to Benchmarks

What’s the low-cost alternative? If I’m paying 1.25% on an actively managed fund when a comparable Vanguard index fund costs 0.04%, that’s a 1.21% drag I could eliminate.

4. Project Long-Term Impact

This is where it gets motivating: show me that my current 0.8% fee burden will cost me $240K over 30 years vs a 0.15% low-cost portfolio.

My Initial Approach

I’m thinking:

  1. Manual data entry (the privacy-preserving trade-off): Look up expense ratios on fund prospectuses, enter as metadata or transactions, update annually
  2. Tag all fees with category: "investment_fee" metadata
  3. BQL queries to sum fees by account and calculate percentages:
    SELECT account,
           SUM(fees) AS total_fees,
           VALUE(SUM(position)) AS market_value
    FROM account ~ "Assets:Investments"
    WHERE metadata.category = "investment_fee"
    GROUP BY account
    
  4. Python script to calculate fee percentage and project 30-year impact

The Accuracy Question

Empower shows exact fees to the penny. Do I need that precision, or is “approximately 0.8% total fees” good enough for decision-making?

If I’m choosing between two investment accounts—one at 0.8% and another at 1.5%—knowing the rough percentages is probably sufficient to make the right move.

The Action Trigger

Here’s the real value: once I know Account A costs 1.2% and Account B costs 0.15%, what do I actually do?

  • Option 1: Move money from A to B (but this might trigger taxes, early withdrawal penalties)
  • Option 2: Stop new contributions to A, redirect to B
  • Option 3: Just track it and feel guilty (not helpful)

The psychological impact matters: seeing “$12,450 paid in fees last year” is visceral and motivating. Seeing “1.2% expense ratio” is abstract and easy to ignore.

Questions for the Community

  1. Do you track investment fees in Beancount? How granular do you get (every fee as a separate transaction vs quarterly summaries)?

  2. Has anyone built fee analyzer queries? BQL scripts, custom reports, dashboards? What insights did you gain?

  3. DIY vs Empower: Is manually building a fee analyzer worth the effort (learning + ongoing maintenance) vs just using Empower’s free tool and accepting the privacy trade-off?

  4. Has fee tracking changed your behavior? Did seeing the numbers motivate you to switch to lower-cost funds?

I’m planning to build this over the next month. If there’s interest, I’ll share my scripts and queries when they’re working.

TL;DR: Empower’s fee analyzer is powerful but requires sharing bank credentials. Can we replicate the core functionality (fee tracking, percentage calculation, long-term projections) using Beancount + BQL while maintaining data ownership?

This is a great question, and I’ve been tracking investment fees in Beancount for about 3 years now. Let me share what’s worked for me.

My Fee Tracking Evolution

Year 1: I tried to track every single fee as a separate transaction. This was exhausting and not particularly useful—I’d have 50+ tiny expense ratio transactions per year that cluttered my reports.

Year 2: I switched to quarterly summaries. Every quarter, I’d calculate the total expense ratio costs across all holdings and record them as single transactions:

2024-03-31 * "Q1 2024 Investment Fees - Expense Ratios"
  Expenses:Investments:Fees:ExpenseRatios    156.23 USD
    fee_type: "expense_ratio"
    account: "Assets:Investments:Vanguard401k"
  Assets:Investments:Vanguard401k

Year 3 (current): I now track fees semi-annually and focus on the fee percentage rather than absolute dollars. This gives me the metric that actually matters for decision-making.

The BQL Query That Changed My Behavior

Here’s the query I run every 6 months:

SELECT
  account,
  COST(SUM(position)) AS cost_basis,
  VALUE(SUM(position)) AS market_value,
  SUM(number) AS total_fees
FROM
  WHERE account ~ "Assets:Investments"
  AND year = 2024
GROUP BY account

Then I manually calculate: (total_fees / market_value) * 100 = fee_percentage

When I first ran this in 2022, I discovered I was paying 1.35% average fees across all my investment accounts. That was my wake-up call.

The Action I Took (And the Impact)

Seeing 1.35% in black and white motivated me to:

  1. Roll over my old 401k ($180K) from high-fee actively managed funds (1.8% average) to Vanguard index funds (0.04% average)
  2. Switch my Roth IRA from a managed account (1.2% advisory fee + 0.5% fund fees) to self-directed Vanguard (0.05% average)
  3. Stop contributing to my taxable brokerage’s managed account (1.5% total fees) and open a new account with Fidelity index funds (0.08%)

Result: I went from 1.35% average fees to 0.18% in about 18 months. On a $350K portfolio, that’s saving approximately $4,100/year in fees.

Over 30 years at 7% returns, that difference compounds to roughly $380,000 in additional wealth. That’s real money.

The Precision Question: Good Enough vs Perfect

You asked whether “approximately 0.8%” is good enough. In my experience, absolutely yes.

The decision to move from a 1.5% fund to a 0.15% fund doesn’t require knowing whether you’re paying exactly 1.47% or 1.52%. The order of magnitude is what matters.

I update my expense ratios once per year in January (funds publish updated ratios in their annual reports). This 30-minute manual task is totally worth it for the clarity it provides.

Empower vs Beancount: The 9-Hour-Per-Year Trade-off

Here’s my honest assessment of the manual work:

  • Annual fee lookup: 30 minutes (check prospectuses for 8 funds I own)
  • Quarterly fee recording: 15 minutes × 4 = 60 minutes
  • Semi-annual analysis: 30 minutes × 2 = 60 minutes
  • Total: ~9 hours per year

Is 9 hours/year worth complete financial privacy and full data ownership? For me, absolutely.

Empower’s convenience comes with surveillance capitalism. Every time you log in, they’re learning about your spending habits, investment preferences, income, net worth—and monetizing that data through targeted financial product recommendations.

One Warning: Tax Implications Matter

You mentioned moving money from high-fee Account A to low-fee Account B. Be very careful here:

  • 401k/IRA rollovers: Generally tax-free if done correctly (direct trustee-to-trustee transfer)
  • Taxable account sales: You’ll trigger capital gains taxes on appreciated holdings
  • Early withdrawal penalties: If you’re under 59.5 and touch retirement accounts incorrectly, you’ll face 10% penalties

I learned this the hard way. I sold $15K of appreciated holdings in my taxable account to move to lower-fee funds, and ended up with a $2,400 tax bill (long-term capital gains). Still worth it long-term, but I should have planned better.

Better approach: Stop new contributions to high-fee accounts and redirect to low-fee accounts. Let the high-fee positions ride until you can exit tax-efficiently (retirement, tax-loss harvesting opportunity, etc.).

If You Build This, I’ll Use It

If you create a fee analyzer script/plugin, I’d absolutely use it. The features I’d want:

  1. Annual fee percentage by account (my current manual calculation)
  2. 30-year projection showing cost of current fees vs optimized fees (the motivating number)
  3. Benchmark comparison (how do my fees compare to Vanguard/Fidelity averages?)
  4. Alert if fee percentage increases year-over-year (funds sometimes raise expense ratios quietly)

Share your scripts when you’ve got something working. This would be valuable for the community.

This is exactly the kind of thing that made me excited about Beancount in the first place! I’m coming from a software engineering background (DevOps), and the idea of building my own financial analysis tools instead of trusting black-box SaaS products really appeals to me.

The Developer Mindset: Build vs Subscribe

As someone who spends all day building infrastructure automation, the Empower model feels backwards to me:

  • Empower approach: Pay with your privacy, get convenience
  • Beancount approach: Pay with your time (upfront learning + maintenance), get ownership and control

In software, we’d never accept “just trust this proprietary service with all your critical data and hope they don’t screw you.” We’d build it ourselves, make it auditable, and keep it under version control.

Why should financial data be any different?

My Current Fee Tracking (Spoiler: It’s Embarrassingly Simple)

I literally just started tracking investment fees last month after reading about FIRE and realizing I had no idea what I was paying. Here’s my ultra-basic setup:

Step 1: I added a metadata field to my investment accounts:

2024-01-01 open Assets:Investments:Vanguard401k
  expense_ratio: "0.04%"
  fund_name: "VTSAX"

Step 2: Every quarter, I manually calculate the expense ratio cost and record it:

2024-03-31 * "Q1 2024 Expense Ratio - VTSAX"
  Expenses:Fees:Investments    18.50 USD
  Assets:Investments:Vanguard401k

It’s not sophisticated, but it works. And most importantly, I understand exactly what’s happening.

The Part Where I Got Obsessed: Fee Comparison Spreadsheet

After I started tracking fees, I got curious about how much I could save by switching funds. So I built a quick spreadsheet (yes, I know, not pure Beancount, but hear me out):

My current portfolio:

  • Vanguard 401k (VTSAX): $85K @ 0.04% = $34/year
  • Old rollover IRA (American Funds): $40K @ 0.68% = $272/year
  • Roth IRA (Fidelity target date): $22K @ 0.12% = $26.40/year
  • Total fees: $332.40/year on $147K = 0.226% average

If I optimized everything to Vanguard index funds @ 0.04%:

  • Total fees: $58.80/year
  • Savings: $273.60/year

Over 30 years at 7% returns, that $273.60/year savings compounds to… $26,000.

Is it life-changing? No. But it’s a free $26K just for spending 2 hours moving money around. That’s a pretty good hourly rate.

The Git Analogy That Makes This Click

You mentioned that seeing “$12,450 in fees” is more motivating than “1.2% expense ratio.” This reminds me of how code review works:

  • Abstract metric: “This function has cyclomatic complexity of 15” → Easy to ignore
  • Concrete impact: “This function will cause 3 production bugs per month” → Immediate action

For fees:

  • Abstract metric: “1.2% expense ratio” → Meh, sounds small
  • Concrete impact: “$12,450/year = $375K over 30 years” → HOLY CRAP

The Beancount advantage is we can write custom reports that show BOTH:

  1. The precise percentage (for comparing options)
  2. The scary dollar projection (for motivating action)

Commercial tools only show you what they want you to see (usually downplaying fees because they’re paid by fund companies). With Beancount, I control the narrative.

Question: How Do You Track Fees That Aren’t Explicit?

Here’s where I’m stuck: expense ratios are easy (published in fund prospectuses). But what about:

  • Bid-ask spreads: When I buy an ETF, I pay slightly above market price. That’s a real cost, but how do I track it?
  • Opportunity cost of cash drag: My target date fund holds 10% cash (0% return). That’s a hidden “fee” vs being 100% invested
  • Tax inefficiency: Some funds distribute huge capital gains each year, creating tax bills. That’s a cost, but it’s indirect

Empower probably doesn’t track these either (they’re too complex), but in theory Beancount could. Has anyone attempted this level of detail?

My Plan: Start Simple, Expand Later

I’m going to start by:

  1. Quarterly expense ratio tracking (like @helpful_veteran suggested)
  2. Annual fee percentage report (simple BQL query + Python script)
  3. 30-year projection calculator (show scary dollar amounts to stay motivated)

Once that’s working smoothly, maybe I’ll add:
4. Benchmark comparison (vs Vanguard/Fidelity averages)
5. Historical fee trend chart (am I improving over time?)
6. Alert if fees increase year-over-year

Would Love to Collaborate

@finance_fred, if you build this and share the code, I’d absolutely use it and contribute improvements. This feels like a perfect community project:

  • Solves a real problem (fee awareness)
  • Preserves privacy (no sharing credentials)
  • Educational (teaches Beancount + BQL + financial concepts)
  • High ROI (potential to save thousands per person)

Let me know if you want to collaborate on GitHub. I’m decent at Python and would love to learn more BQL in the process.

As a CPA who works with both individual and small business clients, I want to add a professional perspective on investment fee tracking—and a few warnings that the FIRE community sometimes overlooks.

The Professional Angle: Fee Tracking for Tax Optimization

While you’re focused on expense ratios (which is great), don’t forget that investment fees can be tax-relevant in several ways:

1. Investment Advisory Fees (Sometimes Deductible)

Before the Tax Cuts and Jobs Act (TCJA) of 2017, investment advisory fees were deductible as miscellaneous itemized deductions (subject to 2% AGI floor). That changed.

Current rules (2024-2025):

  • Personal investment advisory fees: NOT deductible
  • Business investment advisory fees (if you’re a trader/investor as a business): Deductible as business expense

This means if you’re paying a 1% advisory fee on a $500K portfolio ($5,000/year), that’s pure after-tax cost. You can’t deduct it.

Beancount implication: If you track these fees separately (which you should), you can run reports showing exactly how much non-deductible advisory fee expense you’re paying. This might motivate switching to self-directed investing faster than just looking at returns.

2. Mutual Fund Expenses Buried in NAV

Here’s something most people don’t realize: expense ratios are already deducted from your fund’s returns. You never see them as a line item on your brokerage statement.

Example:

  • Fund’s gross return: 8%
  • Expense ratio: 1%
  • Your net return: 7%

You see “7% return” and think that’s the fund’s performance. But you actually paid 1% in fees that are invisible.

Beancount advantage: By explicitly tracking these fees as expenses, you make the invisible visible. This is psychologically powerful for clients.

In my practice, I have clients who track investment fees in Beancount purely for this reason—it forces conscious awareness of costs they’d otherwise ignore.

3. Tax Reporting Complexity: 1099-DIV and Capital Gains

Some funds are wildly tax-inefficient. They churn their portfolios, generate short-term capital gains, and distribute them to you annually—triggering tax bills.

I’ve seen clients in high tax brackets (37% federal + 13.3% California = 50.3% total) pay effective fees of:

  • 1.2% explicit expense ratio
  • 2.5% tax cost from capital gains distributions
  • 3.7% total drag

That’s devastating to long-term wealth accumulation.

Beancount tracking idea: Track “tax cost” as a separate category of investment expenses:

2024-12-31 * "Capital Gains Distribution Tax - MUTUAL FUND X"
  Expenses:Investments:TaxCost    1,250 USD
    fund: "MUTUALFUNDX"
    tax_type: "capital_gains_distribution"
  Assets:Cash

Now your fee analyzer can show total cost of ownership (expense ratio + tax cost), which is the real metric that matters.

The CPA Warning: Be Careful With Tax-Deferred vs Taxable Accounts

You mentioned moving money from high-fee Account A to low-fee Account B. Here’s where clients get into trouble:

Scenario 1: Moving Within Tax-Deferred Accounts (401k, IRA)

  • Tax impact: Generally none (if done as direct trustee-to-trustee transfer)
  • Penalty risk: 10% early withdrawal penalty if you accidentally take a distribution instead of rolling over
  • CPA recommendation: Do NOT attempt this yourself. Use your custodian’s rollover service and confirm in writing that it’s a “direct rollover” not a “distribution + 60-day rollover window”

Scenario 2: Moving Within Taxable Brokerage

  • Tax impact: You’ll trigger capital gains tax on appreciated holdings
  • Calculation: (Sale price - Cost basis) × Tax rate = Tax owed
  • CPA recommendation: Do the math BEFORE selling. Sometimes it’s better to eat the high fees for a few more years than take a massive tax hit now.

Real example from my practice:

Client wanted to sell $200K of actively managed fund (1.5% fee) to buy Vanguard index fund (0.04% fee). Sounds great, right?

Tax math:

  • Cost basis: $80,000
  • Sale price: $200,000
  • Capital gain: $120,000
  • Long-term capital gains tax (20% federal + 3.8% NIIT + 9.3% CA): $39,720 tax bill

Fee savings:

  • Old fee: $200K × 1.5% = $3,000/year
  • New fee: $200K × 0.04% = $80/year
  • Annual savings: $2,920/year

Payback period: $39,720 / $2,920 = 13.6 years

In this case, I advised the client to:

  1. Stop new contributions to the high-fee fund (redirect to low-fee fund)
  2. Hold existing positions until retirement (when they’ll be in a lower tax bracket and can sell more tax-efficiently)
  3. Tax-loss harvest if the fund ever drops below cost basis (sell at a loss, buy the low-fee fund, offset other gains)

This saved them $39,720 in immediate taxes while still achieving long-term fee reduction.

The Beancount Advantage: Model Multiple Scenarios

Here’s where Beancount shines compared to Empower:

Empower says: “You’re paying 1.5% in fees. Switch to our advisor at 0.89%.”

Beancount lets you model:

  • Scenario A: Stay in current fund (1.5% fee, $0 tax bill now)
  • Scenario B: Sell everything now (0.04% fee, $40K tax bill now)
  • Scenario C: Tax-loss harvest opportunistically (0.04% fee on new purchases, gradual transition over 5 years)

You can write a Python script that projects all three scenarios over 30 years and shows the optimal strategy.

This is the power of ownership. Empower wants you to make the decision that benefits them (switch to their advisor). Beancount lets you make the decision that benefits YOU.

Practical CPA Advice: What to Track

If you’re building a fee analyzer, here’s what I’d track (in order of importance):

Tier 1: Essential (Track These First)

  1. Expense ratios (the 0.04% on index funds, 1.2% on managed funds)
  2. Advisory fees (if you use a wealth manager)

Tier 2: Important (Add These Once Tier 1 Is Working)

  1. Transaction costs (trade commissions, though most are $0 now)
  2. Tax cost (capital gains distributions in taxable accounts)

Tier 3: Advanced (Only If You’re Obsessive)

  1. Bid-ask spreads (hard to track, usually negligible for index funds)
  2. Cash drag (opportunity cost of uninvested cash in funds)
  3. Rebalancing costs (tax consequences of annual rebalancing)

Most people should stop at Tier 1. Adding Tier 2 is worthwhile for taxable accounts. Tier 3 is probably overkill unless you’re managing $1M+.

Bottom Line: Fee Tracking Changes Behavior

In 15 years of practice, I’ve found that clients who explicitly track investment fees (whether in Beancount, spreadsheets, or even just annual summaries I provide) make MUCH better investment decisions than those who don’t.

Why? Because seeing “$5,000/year in fees” creates urgency. Seeing “1% expense ratio” creates… nothing.

Build your fee analyzer. Share the scripts. The community will benefit, and you’ll save thousands (possibly hundreds of thousands) over your lifetime.

Just don’t forget the tax implications. Paying fees sucks. Paying unnecessary taxes because you didn’t plan the transition properly sucks even more.