A Short Example of Using Ledger with Emacs Org-mode

It has been three months since I started to use ledger in couple with org-mode as my personal finance tracking system. I’m quite satisfied with it. Personally speeking, I think this combination is better than any non-free apps I could find from the mac app store.

As usual, reading manual is painful. Thus here I tried to give a very simple example demonstrating practically how to make use of the very basic functions of ledger within org-mode.


Step 1. Enable ledger support in org-mode


Ledger support in org-mode is provided by org-babel. To enable it, simply add the following code to the configuration file:

(setq-default
 org-babel-load-languages '((xxx . t)
                            (ledger . t)
                            ...
                            (yyy . t)))


Step 2. Create a file for the finance logs


So far I kept all my financial reports in one org file. Possibly after years of logging, the file gets clumsy, then it’s time to archive/refile or split it into separate files.


Step 3. Opening Balances


Well, I have to say the “opening balance” is one of the most complicated concepts for anyone who is new to the so-called “double entry accounting system”. I was so confused that the initial equity was negative! But let’s face it and move on.

Create a block describing the initialization of our accounting:

#+name: startup
#+BEGIN_SRC ledger :noweb yes
2016/07/01 * Opening Balance
    Assets:JP Bank                                      100000 JPY
    Assets:Cash                                          20000 JPY
    Assets:Itunes                                         5000 JPY
    Assets:Steam                                          1000 JPY
    Assets:中国银行                                        200 CNY
    Equity:Opening Balance
#+END_SRC

As shown in the above list, we can use different currencies.


Step 4. Add income


Great! It’s time to add some money to our account. Suppose we receive salary from the employer, which in my case is the university:

#+name: income
#+BEGIN_SRC ledger :noweb yes
2016/07/15 * Kyoto University
    Assets:JP Bank                                      200000 JPY
    Income:Salary
#+END_SRC

Again, the Income:Salary account is actually a pseudo account, in which the money value is always negative.


Step 5. Add expenses


Now let’s spend some money!

Similar to the above two code blocks, create a block for expenses:

#+name: expenses
#+BEGIN_SRC ledger :noweb yes
...
#+END_SRC

We can also have several blocks like this, and name them as “expenses-2016-07”, “expenses-May” or “expenses-11-11”.

Let’s buy something:

2016/07/03 * 生鮮館
    Expenses:Food                                         2500 JPY
    Assets:Cash
    
2016/07/05 * LAWSON
    Expenses:Food                                          580 JPY
    Expenses:Book                                         1200 JPY
    Assets:Cash

2016/07/12 * App Store
    Expenses:App                                           500 JPY
    Assets:Itunes

2016/07/15 * Steam Store
    Expenses:Game                                         2000 JPY
    Assets:Steam

Money transfer

We can track money transfer in the same block as expenses.

2016/07/20 * Money transfer (from bank to cash)
    Assets:Cash                                         120000 JPY
    Assets:JP Bank

This means we withdraw some cash from our bank account and put them into wallet.


Step 6. Statistics


Let’s have a look at our balance:

#+name: balance
#+BEGIN_SRC ledger :cmdline bal :noweb yes
<<startup>>
<<income>>
<<expenses>>
#+END_SRC

Those in the <<>> brackets are exactly the names of blocks we defined before.

To ask Emacs to calculate the balance, simply press C-c C-c, or , , (in Spacemacs) on the “#+name: balance” line.

#+RESULTS: balance
#+begin_example
           200 CNY
        319220 JPY  Assets
        135720 JPY    Cash
          4500 JPY    Itunes
        180000 JPY    JP Bank
         -1000 JPY    Steam
           200 CNY    中国银行
          -200 CNY
       -126000 JPY  Equity:Opening Balance
          6780 JPY  Expenses
           500 JPY    App
          1200 JPY    Book
          3080 JPY    Food
          2000 JPY    Game
       -200000 JPY  Income:Salary
  ----------------
                 0
#+end_example


Tips


Keybindings

  • From source code blocks in org-mode, C-c , leads you to a temp ledger-mode buffer.
  • In the temp ledger-mode buffer, ledger-mode keybindings are available.
    • M-m m a (Spacemacs) to add new record
    • SPC j = (Spacemacs) to tune indentation
    • , c (Spacemacs) to submit the modification and return to org-mode buffer

About currency exchange and credit cards

Here I discuss about these two things together because in my case I use my credit card for online shopping (usually in US dollar) and repay the loans in Chinese Yuan. Luckily the conversion from US dollar to Chinese Yuan was automatically done by the bank of by credit card. Here is an example:

2016/07/03 * Online Shopping
    Expenses:Game                                         3900 JPY
    Expenses:App                                          4184 JPY
    Liabilities:Credit Card

2016/06/25 * Currency exchange
    Liabilities:Credit Card                               3900 JPY @ 0.00991 USD
    Liabilities:Credit Card                               4184 JPY @ 0.00991 USD
    Liabilities:Credit Card

2016/06/25 * Repayment
    Liabilities:Credit Card                              80.11 USD @ 6.6866 CNY
    Assets:中国银行

In the above example, I first bought some games and apps online using the credit card (see the first record). Then the loans were exchanged from JPY into USD and CNY, provided the exchange rates. In the final step I payed back the money using my Chinese bank account.



comments powered by Disqus