The Revenue Diversification Playbook: Tracking Multiple Income Streams in Beancount

In my journey toward Financial Independence, I’ve become obsessed with income diversification. The FIRE community talks endlessly about portfolio diversification—don’t put all your eggs in one basket, spread across asset classes, hedge against market crashes. But we don’t talk enough about income stream diversification.

Then I started volunteering as a board member for a local nonprofit. And I realized: nonprofits in 2026 are facing the EXACT same challenge I’m tackling in my personal FI/RE journey. They need multiple income streams to survive economic uncertainty.

This got me thinking about how Beancount—my tool for tracking every penny toward early retirement—could help organizations manage multiple revenue sources. And honestly, nonprofits have it WAY more complicated than I do.

The Nonprofit Revenue Challenge

From my board work, I’ve learned that modern nonprofits juggle:

  • Foundation grants (with strict restrictions on how money can be spent)
  • Individual recurring donors (the monthly giving programs)
  • Earned revenue (fee-based services, social enterprises)
  • Corporate sponsorships
  • One-time major gifts
  • Government contracts
  • Event income

The complexity? Some money is “restricted” (can only be used for specific purposes), some is “unrestricted” (flexible), and tracking which is which is legally required. Mess it up, and you violate donor trust and potentially lose tax-exempt status.

How I’d Structure This in Beancount

As someone who tracks my own diverse income sources (W-2 salary, side consulting, dividend income, rental property, blog revenue), here’s how I’d approach nonprofit revenue tracking:

Income:Grants:FoundationA:Restricted
Income:Grants:FoundationA:Unrestricted
Income:Grants:FoundationB:Restricted
Income:EarnedRevenue:ProgramFees
Income:EarnedRevenue:SocialEnterprise
Income:Recurring:MonthlyDonors
Income:Corporate:Sponsorships
Income:Individual:MajorGifts:Unrestricted

The pattern mirrors how I track my income:

  • Top level = income type (like “W2” vs “Consulting” vs “Passive”)
  • Second level = specific source (employer, client, property)
  • Third level = restrictions or characteristics

For my FI/RE planning, I tag income as “active” vs “passive” to track my progress toward living off investments. Nonprofits need similar tagging for “restricted” vs “unrestricted.”

Revenue Mix Analysis (The FIRE Way)

In my personal finances, I run monthly queries to see:

  • What % of income is passive vs active?
  • How diversified are my income sources?
  • If I lost my day job, how long could I survive on other streams?

Nonprofits could run similar Beancount queries:

  • What % of revenue is restricted vs unrestricted?
  • How diversified are funding sources? (No single source > 30%?)
  • If top funder disappeared, what’s the financial runway?

Here’s a simple Beancount query I’d use:

SELECT 
  account, 
  sum(position) as total
FROM 
  OPEN ON 2026-01-01 
  CLOSE ON 2026-12-31
WHERE 
  account ~ 'Income:'
GROUP BY 
  account

This shows revenue by source—critical for both FIRE planning and nonprofit resilience.

My Questions for the Community

  1. Are nonprofits actually using Beancount? Or is this theoretical? I’d love to hear from anyone tracking organizational finances (not just personal) in plain text.

  2. How would you handle the “release from restriction”? When restricted funds are spent on their intended purpose, they become unrestricted. Is this a transfer transaction between accounts?

  3. What about multi-year pledges? In FIRE planning, I forecast future income. How would you track a 3-year grant commitment that pays out annually?

  4. Seasonal variance? My dividend income and rental income are predictable, but consulting varies wildly. Nonprofits face similar seasonality—end-of-year giving spikes, summer slumps. How do you model this?

I’m fascinated by the parallels between personal FI/RE planning and nonprofit financial management. Both require resilience, diversification, and obsessive tracking. Beancount gives us the tools—I want to hear how people are actually using them.

What’s your experience with multi-stream income tracking, whether personal or organizational?

Fred, this is a fantastic connection between personal FI/RE and nonprofit financial management! I love how you’re applying the same diversification principles across both domains.

I’ve been using Beancount for 4+ years now, and while I’m not tracking nonprofit finances, I am tracking multiple income streams that mirror what you’re describing:

  • W-2 salary (primary)
  • Rental property income (2 properties)
  • Dividend and interest income
  • Occasional freelance consulting

My Account Structure

Here’s what works for me:

Income:Salary:TechCorp
Income:Rental:OakStreetProperty
Income:Rental:MapleAveProperty
Income:Investment:Dividends:VanguardVTI
Income:Investment:Dividends:VanguardVXUS
Income:Investment:Interest:AllyBank
Income:Freelance:Consulting

The key insight from your post that resonates: start simple, add complexity only when needed.

When I started with Beancount, I had way too many sub-accounts. I was trying to track everything six levels deep. It was overwhelming and brittle—every time I needed to refactor, it broke my historical queries.

Now I follow a principle: each account level should answer a specific question I actually ask.

  • Top level (Income:Salary vs Income:Rental): “What type of income?”
  • Second level (Income:Rental:OakStreet vs MapleAve): “Which specific source?”

I don’t subdivide further unless I have a real need.

On Your Questions

“Release from restriction” for nonprofits: I think this is analogous to how I track my rental property security deposits. They start as a liability (I owe them back), then become income (when tenant damages property). I use transfer transactions:

2026-03-15 * "Security deposit forfeited - carpet damage"
  Liabilities:SecurityDeposits:Tenant-Smith   500.00 USD
  Income:Rental:OakStreet:SecurityDepositForfeit  -500.00 USD

For nonprofits, maybe:

2026-06-30 * "Grant restriction satisfied - youth program expenses incurred"
  Income:Grants:FoundationA:Restricted  75000.00 USD
  Income:Grants:FoundationA:Released  -75000.00 USD

Though I’m sure actual nonprofit accountants have more sophisticated approaches!

Multi-year pledges: I don’t track future income in my Beancount ledger itself—that’s forecasting, not accounting. I use a separate spreadsheet for projections. Beancount records transactions when they happen, not when they’re promised.

Seasonal variance: I’ve learned to look at rolling 12-month totals rather than month-to-month. My dividend income spikes in March, June, September, December (quarterly dividends). Looking at monthly variance would be misleading. I run custom queries:

SELECT
  year, 
  sum(position) as annual_total
WHERE 
  account ~ 'Income:Investment:Dividends'
GROUP BY 
  year

This smooths out the seasonality and shows the real trend.

The Parallel Is Real

You’re onto something important, Fred. The financial discipline required for FI/RE—tracking everything, understanding your numbers, planning for uncertainty—is exactly what nonprofits need to survive.

And the beauty of Beancount? The same tool, the same query language, the same plain text philosophy works whether you’re tracking toward early retirement or managing a mission-driven organization.

Anyone else here tracking organizational finances in addition to personal? I’d love to learn from people using Beancount in a professional context.

Fred and Mike, this thread is gold! I’m coming at this from the professional bookkeeping side—I run a small bookkeeping practice in Austin serving 20+ small businesses.

Most of my clients aren’t nonprofits, but they absolutely face the multi-stream revenue challenge you’re describing. A typical client might have:

  • Product sales (online and brick-and-mortar)
  • Service revenue (consulting, maintenance contracts)
  • Subscription/recurring revenue (SaaS, memberships)
  • Affiliate or referral income
  • Occasional project-based work

Sound familiar? It’s the business equivalent of your FI/RE diversification strategy.

What I’ve Learned From Client Work

1. Revenue accounts should mirror how you invoice, not how you think about strategy

Early mistake I made: creating accounts based on abstract categories. Better approach: structure accounts to match your actual customer transactions.

If a client sells “widgets” and “services,” their accounts should be:

Income:Products:Widgets
Income:Services:Consulting
Income:Services:Maintenance

Not some elaborate category scheme that makes analysis difficult.

2. Beancount’s superpower is retrospective restructuring

This is why I’m converting clients from QuickBooks to Beancount. If you realize your account structure is wrong six months in? In QuickBooks, you’re recategorizing hundreds of transactions manually.

In Beancount? Change your query. The transactions stay intact. You can view the same data through multiple lenses without touching the underlying records.

3. Warn clients about over-engineering early

Mike, you said it perfectly: “start simple, add complexity only when needed.”

I’ve seen too many business owners (and let’s be honest, myself included early on) create elaborate account hierarchies that become maintenance nightmares.

Start with 3-5 top-level income categories. If you find yourself needing to answer a specific question and can’t, THEN add granularity.

My Question for Fred

You mentioned tracking “restricted” vs “unrestricted” for nonprofits. In the business world, we sometimes face similar constraints—think:

  • Retainer payments (can only be used for specific client work)
  • Grant funding for small businesses (SBA grants with use restrictions)
  • Revenue with contractual obligations attached

Do you use a similar account structure? Or is there a Beancount pattern for marking money that has “strings attached” even if it’s not nonprofit fund accounting?

I’m curious whether the nonprofit approach could help my small business clients who deal with restricted funds.

On Consultant_Claire’s Approach (If She’s Here)

Fred, you mentioned volunteering with a nonprofit. Do they actually use Beancount? Or are they stuck in QuickBooks like most of my clients?

I’d love to hear from anyone who’s successfully pitched plain text accounting to a nonprofit board. The version control and transparency arguments seem perfect for donor trust and grant compliance—but getting buy-in is the hard part.

Bookkeepers in this community: anyone else using Beancount professionally? Let’s share war stories!

This is a fascinating discussion! As a CPA who works with both businesses and nonprofits, I need to jump in with some technical clarity on the nonprofit fund accounting requirements—because this is where plain text accounting gets really interesting.

FASB ASU 2016-14 Compliance

Fred, you’re absolutely right that nonprofits must track “restricted” vs “unrestricted” revenue. This isn’t just best practice—it’s required by FASB ASU 2016-14 (Financial Accounting Standards Board guidance for nonprofit financial statements).

The standard requires nonprofits to report net assets in two categories:

  1. Without donor restrictions (unrestricted)
  2. With donor restrictions (temporarily or permanently restricted)

Here’s the critical insight for Beancount users: the restriction tracking needs to happen at the asset level, not just the income level.

The Right Beancount Structure for Nonprofits

If I were setting up a nonprofit in Beancount, here’s how I’d structure it:

Assets (Balance Sheet)

Assets:Checking:Unrestricted
Assets:Checking:Restricted
Assets:Savings:OperatingReserve:Unrestricted
Assets:Savings:BoardDesignated:Unrestricted
Assets:Investments:Endowment:PermanentlyRestricted

Income (Statement of Activities)

Income:Grants:FoundationA:WithRestrictions
Income:Grants:FoundationB:WithoutRestrictions
Income:Donations:Individual:WithoutRestrictions
Income:Donations:Corporate:WithRestrictions
Income:EarnedRevenue:ProgramFees:WithoutRestrictions

The Release Transaction

When you spend restricted funds on their designated purpose, you record a “release from restriction” transaction:

2026-06-15 * "Youth program expenses - releasing restricted grant funds"
  Assets:Checking:Restricted                -25000.00 USD
  Assets:Checking:Unrestricted               25000.00 USD
  note: "Released FoundationA grant for Q2 youth program costs"

This shows donors and auditors that restricted funds were used properly.

Why This Structure Matters

Bob mentioned this earlier: Beancount’s superpower is that you can view the same data through multiple lenses.

With this structure, I can generate:

  1. Statement of Financial Position (Balance Sheet) showing restricted vs unrestricted net assets
  2. Statement of Activities (Income Statement) showing revenue by restriction type
  3. Donor reports filtered by specific grant or restriction
  4. IRS Form 990 schedules with proper fund classification

All from the same plain text ledger.

Answering Fred’s Questions

Q: How do you handle revenue that starts restricted but becomes unrestricted?

A: You DON’T automatically convert income. Instead:

  • Income stays categorized as it was received
  • When you SPEND the money on its intended purpose, you transfer ASSETS from restricted to unrestricted
  • This maintains the audit trail showing donor intent was honored

Q: What about multi-year pledges?

A: Don’t record income until cash is received OR you have an unconditional promise to give (legally enforceable). Use metadata to track:

2026-01-15 * "Year 1 of 3-year Foundation X pledge"
  Assets:Checking:Restricted                 50000.00 USD
  Income:Grants:FoundationX:WithRestrictions  -50000.00 USD
  pledge_total: "150000"
  pledge_year: "1 of 3"
  remaining: "100000"

The Nonprofit-Specific Challenge

What makes nonprofit accounting harder than personal finance (sorry Fred!):

  • Donor restrictions create legal obligations
  • Functional expense reporting (program vs admin vs fundraising) is required
  • Grant compliance often requires program-level financial reports
  • Audit requirements for organizations over certain revenue thresholds

Beancount CAN handle all of this—but you need to structure it carefully from day one.

My Challenge to This Community

I’d love to see a Beancount nonprofit starter template with:

  • Proper fund accounting structure (restricted vs unrestricted at asset and income levels)
  • Sample release-from-restriction transactions
  • Basic queries for generating Form 990 schedules
  • Metadata conventions for grant tracking

Anyone want to collaborate on building this? I think plain text accounting could be transformative for small nonprofits drowning in QuickBooks complexity.

The transparency and auditability of Beancount seems tailor-made for donor relations and grant compliance. We just need to document the patterns.

Alice, thank you for bringing the technical nonprofit accounting requirements into this conversation! As someone who prepares Form 990s for nonprofits during tax season, I want to add the tax compliance perspective to this revenue diversification discussion.

Form 990 Reporting Requirements

The IRS requires nonprofits to report revenue by source on Form 990, and the categories matter:

  • Part VIII, Line 1: Contributions, gifts, grants (broken down by type)
  • Line 2: Program service revenue (earned income)
  • Line 6: Special events revenue
  • Line 11: Other revenue
  • Schedule B: Individual contributors over $5,000 (must be tracked separately)

If your Beancount account structure doesn’t map cleanly to these Form 990 lines, you’ll spend hours manually categorizing transactions during tax season. Trust me—I’ve been there.

The Beancount Structure I Recommend for Tax Compliance

Here’s how I’d structure income accounts to make Form 990 preparation smooth:

Income:Contributions:Individuals:Under5000
Income:Contributions:Individuals:Over5000:DonorSmith
Income:Contributions:Individuals:Over5000:DonorJones
Income:Contributions:Foundations
Income:Contributions:Corporations
Income:ProgramServiceRevenue:Training
Income:ProgramServiceRevenue:Consulting
Income:SpecialEvents:AnnualGala:GrossRevenue
Income:SpecialEvents:AnnualGala:DirectExpenses
Income:Other:Interest
Income:Other:Dividends

Why structure it this way?

  1. Maps to Form 990 lines - Each top-level category corresponds to a line on the tax form
  2. Schedule B compliance - Individual donors over $5,000 tracked separately (required disclosure)
  3. Special events net revenue - Gross revenue and direct expenses tracked separately (IRS requirement)

The Unrelated Business Income Trap

Fred and Bob, here’s something neither of you mentioned: Unrelated Business Income Tax (UBIT).

If a nonprofit earns revenue from activities unrelated to its tax-exempt purpose, that income may be taxable—even for 501(c)(3) organizations.

Example: A youth nonprofit that runs a social enterprise selling coffee to raise funds. The coffee sales might trigger UBIT.

In Beancount, I’d track this separately:

Income:EarnedRevenue:UBIT:CoffeeSales
Income:EarnedRevenue:Related:TrainingFees

This makes it easy to calculate Form 990-T (Exempt Organization Business Income Tax Return) obligations.

Multi-Year Grant Tracking for Tax Purposes

Alice covered the accounting side of multi-year pledges. From a tax perspective, you need to track:

  • When was the pledge made? (affects donor’s deduction timing)
  • When is cash received? (affects nonprofit’s income recognition)
  • Is it conditional or unconditional? (affects revenue recognition)

I use Beancount metadata extensively:

2026-03-10 * "Year 2 of 3-year FoundationZ grant"
  Assets:Checking:Restricted                100000.00 USD
  Income:Grants:FoundationZ:WithRestrictions  -100000.00 USD
  grant_agreement_date: "2025-01-15"
  grant_period: "2026-01-01 to 2026-12-31"
  conditions: "Quarterly reporting required"
  schedule_b_required: "Yes - over $5000"

This metadata becomes invaluable when I’m preparing the return and the executive director can’t remember the grant terms from two years ago.

Revenue Diversification from a Tax Risk Perspective

Here’s an angle nobody’s mentioned: IRS public support test.

To maintain 501(c)(3) status, nonprofits generally need to pass the “public support test”—at least 1/3 of revenue must come from the general public (not a few large donors).

Organizations that fail this test may be reclassified as private foundations (much more restrictive rules).

Revenue diversification isn’t just smart financial strategy—it’s tax compliance insurance.

With Beancount queries, you can run the public support calculation:

SELECT 
  YEAR(date) as year,
  sum(position) as total_support
WHERE 
  account ~ 'Income:Contributions'
GROUP BY 
  year

Then manually calculate what percentage comes from “substantial contributors” vs general public. This is a query I run for clients annually to catch problems early.

Bob’s Question About Business Restrictions

Bob asked about tracking restricted funds for for-profit businesses. Yes! Similar patterns apply:

Retainers: I’d track as a liability until earned:

Assets:Checking:Operating          5000.00 USD
Liabilities:UnearnedRevenue:ClientX  -5000.00 USD

SBA grants with restrictions: Treat like nonprofit restricted funds:

Assets:Checking:Restricted          25000.00 USD
Income:Grants:SBA:PPP  -25000.00 USD
  restrictions: "Payroll and rent only"
  forgiveness_eligible: "Yes"

The Bottom Line

Plain text accounting is PERFECT for multi-stream revenue tracking IF you structure accounts with tax compliance in mind from day one.

Don’t wait until tax season to realize your account structure makes Form 990 preparation a nightmare. Ask me how I know. :sweat_smile:

I agree with Alice—a nonprofit Beancount starter template would be incredibly valuable. I’d add: make sure it includes metadata conventions for common tax compliance needs (Schedule B tracking, UBIT flagging, grant restrictions).

Anyone else here prepare 990s using Beancount-tracked data?