I’ve been fascinated by the classic cash envelope budgeting method, but let’s be honest—carrying physical cash envelopes in 2026 feels impractical. Most merchants prefer digital payments, it’s inconvenient, and there are security concerns with carrying cash around.
So I’ve been building a virtual envelope system in Beancount that gives me all the psychological benefits of the envelope method without the cash downsides.
The Concept
The traditional envelope method works by physically dividing cash into labeled envelopes (groceries, dining out, entertainment, etc.). When an envelope is empty, you stop spending in that category. Simple, visual, and effective.
In Beancount, I’m recreating this with virtual “envelope” accounts that represent budgeted amounts rather than actual bank balances.
My Implementation
1. Envelope Account Structure
; Virtual envelope accounts (not real bank accounts)
2026-01-01 open Assets:Envelopes:Groceries
2026-01-01 open Assets:Envelopes:DiningOut
2026-01-01 open Assets:Envelopes:Entertainment
2026-01-01 open Assets:Envelopes:Clothing
2026-01-01 open Assets:Envelopes:PersonalCare
2026-01-01 open Assets:Envelopes:Gifts
; Funding source for envelopes
2026-01-01 open Equity:Budget:Allocation
2. Monthly Envelope Funding (“Stuffing”)
On payday, I “stuff” my virtual envelopes:
2026-02-01 * "Budget" "February envelope stuffing"
Equity:Budget:Allocation -1,200.00 USD
Assets:Envelopes:Groceries 400.00 USD
Assets:Envelopes:DiningOut 150.00 USD
Assets:Envelopes:Entertainment 100.00 USD
Assets:Envelopes:Clothing 150.00 USD
Assets:Envelopes:PersonalCare 50.00 USD
Assets:Envelopes:Gifts 100.00 USD
Assets:Envelopes:Buffer 250.00 USD ; emergency overflow
3. Spending Draws from Envelopes
Each purchase draws from both my real account AND the virtual envelope:
2026-02-05 * "Whole Foods" "Weekly groceries"
Expenses:Food:Groceries 127.43 USD
Assets:Checking -127.43 USD
; Envelope tracking
Assets:Envelopes:Groceries -127.43 USD
Equity:Budget:Spent 127.43 USD
4. Checking Envelope Balances
The magic query that shows me what’s left in each envelope:
SELECT account, sum(position) as remaining
WHERE account ~ "Assets:Envelopes"
ORDER BY remaining
My Questions
-
Is this approach too complex? I’m essentially double-booking every discretionary transaction. Is there a simpler way?
-
Rollover handling? What do you do when an envelope has money left at month-end? Roll it over, or sweep it to savings?
-
Overspending alerts? Has anyone built a plugin that warns when an envelope goes negative?
-
Alternative approaches? I’ve seen people use tags instead of separate accounts. Which approach scales better?
I love the psychological constraint of “this envelope is empty, stop spending,” but I want to make sure my Beancount implementation is sustainable long-term.