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:FoodYou 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:FoodSimply 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.