Skip to content

Accounting Concepts

A practical introduction to double-entry bookkeeping for plain-text accounting.

What is Double-Entry Bookkeeping?

Double-entry bookkeeping is a system where every transaction affects at least two accounts. Money never appears or disappears - it always moves from one place to another.

When you buy coffee:

  • Your cash decreases (Assets go down)
  • Your expenses increase (Expenses go up)
beancount
2024-01-15 * "Coffee Shop"
  Expenses:Food:Coffee    4.50 USD   ; Expense increases
  Assets:Cash            -4.50 USD   ; Asset decreases

The key rule: Every transaction must balance to zero.

The Five Account Types

All accounts fall into five categories:

TypeWhat it tracksNormal balance
AssetsWhat you ownPositive
LiabilitiesWhat you oweNegative
EquityNet worth adjustmentsNegative
IncomeMoney coming inNegative
ExpensesMoney going outPositive

Assets

Things you own that have value.

Assets:Bank:Checking      ; Your bank balance
Assets:Cash               ; Physical cash
Assets:Brokerage          ; Investment accounts
Assets:House              ; Property value
Assets:Receivables:John   ; Money owed to you

Rule: When you gain an asset, the balance increases (positive).

Liabilities

Debts and obligations you owe.

Liabilities:CreditCard    ; Credit card balance
Liabilities:Mortgage      ; Home loan
Liabilities:Loans:Auto    ; Car loan

Rule: When you owe more, the balance becomes more negative.

Equity

Adjustments to your net worth, typically for:

  • Opening balances when starting to track
  • Rounding differences
  • Retained earnings
Equity:Opening-Balances   ; Starting balances
Equity:Retained-Earnings  ; Accumulated profits

Income

Money you earn (flows in).

Income:Salary             ; Paycheck
Income:Interest           ; Bank interest
Income:Dividends          ; Investment dividends
Income:CapitalGains       ; Profits from selling investments

Rule: Income is negative in the ledger (counterintuitive but correct).

Expenses

Money you spend (flows out).

Expenses:Food             ; Groceries, restaurants
Expenses:Housing:Rent     ; Monthly rent
Expenses:Transport        ; Gas, transit, car maintenance
Expenses:Taxes:Federal    ; Tax payments

Rule: Expenses are positive in the ledger.

The Accounting Equation

The fundamental equation of accounting:

Assets = Liabilities + Equity

Or rearranged:

Assets - Liabilities - Equity = 0

In beancount terms (including Income and Expenses):

Assets + Expenses + Liabilities + Income + Equity = 0

This is why every transaction must sum to zero.

Why Income is Negative

This confuses many beginners. Here's the logic:

When you earn money, two things happen:

  1. Your bank account (Asset) increases: +$1000
  2. Something must decrease to balance: -$1000

That "something" is Income. Income being negative means "money flowed in."

beancount
2024-01-15 * "Employer" "Salary"
  Assets:Bank:Checking   1000.00 USD   ; +1000 (your bank grows)
  Income:Salary         -1000.00 USD   ; -1000 (balances to zero)

Think of negative income as "a reduction in what the world owes you."

Expenses are Positive

When you spend money:

beancount
2024-01-15 * "Grocery Store"
  Expenses:Food          50.00 USD   ; +50 (expense recorded)
  Assets:Bank:Checking  -50.00 USD   ; -50 (your bank shrinks)

Positive expense = value consumed.

Common Transactions Explained

Buying Something with Cash

beancount
2024-01-15 * "Bookstore"
  Expenses:Books        25.00 USD    ; Expense increases (+)
  Assets:Cash          -25.00 USD    ; Asset decreases (-)

Net change: +25 + (-25) = 0

Buying Something with Credit Card

beancount
2024-01-15 * "Restaurant"
  Expenses:Food         45.00 USD    ; Expense increases (+)
  Liabilities:CreditCard -45.00 USD  ; Liability increases (more negative)

Your credit card balance (a liability) becomes more negative because you owe more.

Receiving Income

beancount
2024-01-15 * "Employer" "Paycheck"
  Assets:Bank:Checking  3000.00 USD  ; Asset increases (+)
  Income:Salary        -3000.00 USD  ; Income (negative)

Paying Off Credit Card

beancount
2024-02-01 * "Credit Card Payment"
  Liabilities:CreditCard  500.00 USD  ; Liability decreases (less negative)
  Assets:Bank:Checking   -500.00 USD  ; Asset decreases (-)

Transferring Between Accounts

beancount
2024-01-15 * "Transfer to Savings"
  Assets:Bank:Savings    1000.00 USD  ; One asset increases
  Assets:Bank:Checking  -1000.00 USD  ; Another decreases

This is just money moving - no income or expense involved.

Net Worth

Your net worth is:

Net Worth = Assets - Liabilities

Or equivalently:

Net Worth = -(Income + Expenses + Equity)

Query your net worth:

sql
SELECT sum(cost(position))
WHERE account ~ "Assets" OR account ~ "Liabilities"

Profit and Loss

Your profit (or loss) for a period is:

Profit = Income + Expenses

Remember: Income is negative, so if you earned more than you spent, the sum is negative (profit). If you spent more, it's positive (loss).

Query this year's profit:

sql
SELECT sum(cost(position))
WHERE (account ~ "Income" OR account ~ "Expenses")
  AND year(date) = 2024

Period Reporting

Balance Sheet

Shows your financial position at a point in time:

  • Assets: What you own
  • Liabilities: What you owe
  • Net Worth: The difference
bash
rledger report balsheet ledger.beancount

Income Statement

Shows financial activity over a period:

  • Income: Money earned
  • Expenses: Money spent
  • Net Income: The difference
bash
rledger report income ledger.beancount

Account Hierarchy

Organize accounts hierarchically:

Assets
├── Bank
│   ├── Checking
│   └── Savings
├── Brokerage
│   ├── AAPL
│   └── VTI
└── Cash

Expenses
├── Food
│   ├── Groceries
│   └── Restaurants
├── Housing
│   ├── Rent
│   └── Utilities
└── Transport
    ├── Gas
    └── Maintenance

Benefits:

  • Query at any level: account ~ "Expenses:Food" matches all food expenses
  • Reports can roll up to parent categories
  • Keeps related transactions together

Tips for Beginners

1. Start Simple

Begin with just a few accounts:

beancount
2024-01-01 open Assets:Bank:Checking
2024-01-01 open Expenses:Everything
2024-01-01 open Income:Everything

Add detail as you learn what you want to track.

2. Don't Worry About Perfection

You can always recategorize later. The important thing is capturing transactions.

3. Let One Posting Auto-Calculate

Only one posting per currency can omit the amount:

beancount
2024-01-15 * "Coffee"
  Expenses:Food   4.50 USD
  Assets:Cash              ; Automatically: -4.50 USD

4. Verify with Balance Assertions

Add periodic checks:

beancount
2024-01-31 balance Assets:Bank:Checking  1234.56 USD

If wrong, rustledger will tell you.

5. Use Tags for Analysis

Tag transactions for later querying:

beancount
2024-01-15 * "Dinner" #vacation #food
  Expenses:Food   45.00 USD
  Assets:Cash

See Also