My Common Beancount Accounts and Some Practical Tips

An overview of the Beancount account structure I use and a few practical tips for keeping it maintainable.

AI Translation

Original Chinese

Beancount is a plain text accounting tool built around the concept of double-entry bookkeepingDouble-entry bookkeeping records both sides of every transaction and allows assertions to verify that your books remain balanced. It significantly reduces the chance of missing or incorrect entries, though I won’t go into the details here. If you’re interested, it’s well worth exploring further..

This article briefly introduces the account structure I use in my own ledger, finally fulfilling one of the goals I mentioned in my previous article.

The Core Idea

The fundamental principle behind account design is simple: track the information you actually care about.

For example, you may want to know how much you spend on food each month, or how much goes toward housing and utilities. The ideal account structure depends entirely on what insights you want to obtain.

Once you know your goals, designing your accounts becomes much easier.

Granularity is also important. Unless you have a genuine need, there’s usually no reason to split food into breakfast, lunch, dinner, snacks, and late-night meals. A single Expenses:Food account is more than sufficient.

Overly detailed accounts only increase maintenance costsA few years ago, I categorized everything into extremely fine-grained accounts, including separate accounts for breakfast, lunch, and dinner. It turned importing transactions into a painful process because I constantly had to determine exactly what each purchase represented. I mistakenly believed that more detail would always be useful someday, but in practice I almost never benefited from it..

By design, Beancount organizes accounts into five top-level categories: Equity, Income, Expenses, Assets and Liabilities.

The following sections explain how I organize each of them.

Equity

The primary purpose of Equity accounts is to initialize your books when you first start keeping records.

When you begin using Beancount, you almost certainly already own assets such as bank accounts or cash balances. Equity accounts provide a way to establish those opening balances.

My setup is very simple:

Account Description
Equity:Opening-Balances Used to initialize account balances
Equity:BadDebts Used for tiny unreconciled differences. If I’m off by one yuan and don’t feel like hunting it down, I simply post it here.

Income

Income represents assets flowing into your possession, whether from salaries, gifts, interest, or other sources.

I use five accounts:

Account Description
Income:Gifts Gifts received, including cash gifts or red envelopes
Income:Salary Salary and wages
Income:Interest Bank interest and similar earnings
Income:Sale Selling second-hand items or other personal sales
Income:Other Anything that doesn’t fit elsewhere

Expenses

Expenses represent money flowing out.

Account Description
Expenses:Food Everyday meals and drinks
Expenses:Transport Public transit, flights, trains, shared bikes, fuel, and similar transportation costs
Expenses:Housing Rent and home purchasesYou could reasonably classify buying a house as an asset instead, but personally I prefer to treat it as an expense.
Expenses:Utilities Electricity, gas, heating, water, phone bills, and other utilities
Expenses:Software Software subscriptions, streaming services, cloud storage, and similar digital services
Expenses:Personal Clothing, haircuts, cosmetics, and other personal spending
Expenses:Shopping Household goods, toiletries, appliances, electronics, and general purchases
Expenses:Entertainment Theme parks, movies, and toysI classify toys as entertainment rather than shopping because I view them primarily as recreational purchases.
Expenses:Health Medical treatment, dental care, surgery, glasses, medications, and other healthcare costs
Expenses:Education Books, courses, tuition, and other learning-related expenses
Expenses:Travel HotelsWhile writing this section, I realized that this account may not actually be necessary. Travel expenses can often be represented by categories like Entertainment, Shopping, Housing, or Transport instead, so I may remove it in the future.
Expenses:Insurance Insurance premiums of all kinds
Expenses:Tax Income tax and social insurance contributionsPersonally, I also consider mandatory social insurance contributions to be a form of taxation.
Expenses:Penalty Traffic tickets and other fines
Expenses:Fees Various service charges, including transaction feesSpecial mention goes to WeChat’s withdrawal fee. Charging 0.1% for withdrawing your own money still feels excessive to me.
Expenses:Gifts Gifts given to others
Expenses:Pet Expenses related to my pets
Expenses:Other A fallback category for everything else

Assets

Assets represent your bank accounts, cash, and other holdings.

I recommend keeping the hierarchy relatively shallow.

For example, instead of using something like Assets:DebitCard:BOC:1234, Assets:DebitCard:BOC or simply Assets:BOC is usually sufficient.

Shorter account names are easier to type and easier to maintain.

Liabilities

Liabilities include credit cards, consumer loans, mortgages, and similar obligations.

As with Assets, I recommend avoiding deeply nested account structures. Keeping them within one or two levels significantly reduces complexity.

What If I Want More Detail?

You’ll notice that most of my accounts have only a single level of categorization.

The reason is simple: reduce complexity.

The more complicated your account hierarchy becomes, the harder it is to maintain. Simpler accounts make classification easier and reduce the number of transactions that leave you wondering where they belong.

But what if you still want more detail?

For example, suppose you want to know whether a meal was breakfast, lunch, or dinner, or who received a particular gift.

Instead of creating more accounts, use Beancount’s metadata:

2026-06-01 * "Funny Garden Spicy Hot Pot"
  type: "dinner"
  Liabilities:CBS                     -18000.00 CNY
  Expenses:Food

You can later search or query transactions by the type metadata. This approach keeps your account structure simple while preserving richer information.

Earlier I mentioned that Travel may not be necessary. So how do you indicate that a transaction occurred during a trip?

Use Beancount tags:

2026-06-01 * "Funny Garden Spicy Hot Pot" #2026-travel
  type: "dinner"
  Liabilities:CBS                     -18000.00 CNY
  Expenses:Food

Simply attach a tag such as #2026-travel to the transaction.

Conclusion

Ultimately, the guiding principle behind account design is straightforward:

Create broad, general-purpose accounts that match your actual needs instead of endlessly subdividing everything into increasingly specific categories.

For any system that requires long-term commitment, maintainability should come first. A ledger that is easy to keep is far more valuable than one that is theoretically perfect but too complicated to sustain.