I manage my money using plain-text accounting (specifically, hledger; though the choice of tool is unimportant), following a YNABish approach. The four YNAB rules are:
- Give every dollar a job: my money is split into named categories, I have no “general savings”.
- Embrace your true expenses: large expenses (like a rental deposit) are planned and allocated for in advance, as a regular monthly contribution.
- Roll with the punches: if things aren’t working out, I adjust the plan rather than lie to myself.
- Age your money: I save more of each regular expense (rent, travel, etc) than I spend in a given period, so I gradually build up a buffer.
Rather than importing transactions from my bank or something, I enter all data manually. This may sound tedious, but I feel that the awareness I get from doing so is worth it.
Why track my finances at all?
- Makes me more conscious of my spending.
- Lets me see how my spending has changed over time.
- Lets me plan for the future with some degree of confidence.
This memo is concerned with my mechanism for implementing this approach. It could serve as a starting point for your financial planning; but working out what your savings categories are and how to allocate your income to them requires introspection.
My hledger data files (the “journal files”) are shared with syncthing, so I can add transactions from any machine.
I have one journal for each calendar year:
current.journal, the journal for the current year.
$YEAR.journal, is the journal for a previous year.
I also have two files which all my journals include:
commodities, a list of all commodities (currencies, cryptocurrencies, funds) I deal with.
prices, end-of-day exchange rates for all of my commodities.
Chart of Accounts
Accounts are broken up into five broad categories:
assets: money I have or am owed.
equity: used to start off the ledger for the year.
expenses: money I have spent.
income: money I have received.
liabilities: money I owe.
assets is further subdivided into:
cash: easily liquidated assets.
investments: brokerage accounts.
pension: employer-managed pension funds.
receivable: money I am owed.
The set of accounts I use is fairly stable: sometimes I’ll add one, or one will cease to be useful, but that’s a rare event. Here are all the regular accounts, which are mostly self-explanatory:
Physical cash, in my wallet
… which was withdrawn from my bank account
… which was a gift
Physical cash, not in my wallet
Cash which can be withdrawn
Subaccounts for specific future expenses, like renewing my passport; money added when I am paid
My available overdraft
Subaccounts for money put aside for transactions which have not cleared yet
Savings; money added when I am paid
Subscription to Graze
Cash which can be withdrawn
Savings for Patreon subscriptions (charged in USD)
Savings for AWS, domain names, and web hosting (all charged in foreign currencies)
The deposit on my flat
See Balance Correction
See Balance Correction
To track cashback offers and similar
My American Express credit card
My student loan
My bank account overdraft
Subaccounts for people I owe money to
An account name is the path to it through the tree, separated by colons. For example,
expenses:utilities:electricity. Because typing these account names would be pretty tedious, I use some aliases in my journal file:
alias hand = assets:cash:petty:hand alias current = assets:cash:santander:current alias month = current:month alias saved = current:saved alias goal = current:goal
Many of these accounts do not correspond to any real-world bank or brokerage account, they are used to track the flow of money in more detail than if I just recorded which bank accounts things came from or went to.
Money (and other commodities) is only stored in leaf accounts.
I have two bank accounts, three investment accounts, and a credit card.
For bank accounts I use:
Santander, my main bank account. My pay goes here, almost all of my expenses come out of here.
Starling, my backup account. I keep a small amount of money in here to withdraw for if my Santander debit card is not working (Santander is Visa, Starling is Mastercard). I also use it for all my foreign currency transactions, as Starling doesn’t charge currency conversion fees.
For investment accounts I use:
Cavendish Online, who are as far as I can tell just a front-end to services provided by Fidelity (who do not themselves offer accounts directly), and who provide a reasonable selection of funds for my stocks & shares ISA.
Coinbase, who offer a few different cryptocurrencies. I have very little in crypto, because it’s so volatile.
Funding Circle, who provide my innovative finance ISA.
For a credit card I use an American Express cashback card. There is a small annual fee (£25), but by using it for all the transactions I can, the cashback more than covers that.
Most of the time I am dealing with American Express and Santander, only rarely do I need to touch the others.
A transaction has a date, a payee, and a list of postings:
2018-01-01 Payee account1 £amount1 account2 £amount2 ...
The amounts must sum to zero, which means that the transaction is balanced.
hledger allows transactions to be marked with a
! or a
*. The traditional meaning of these is “pending” and “cleared”.
! slightly differently. I use it for transactions which are just an artefact of the way I track my finances, which don’t involve any balance changes to a real-world account. For example, moving money between different types of savings:
2018-01-26 ! Allocation saved:travel £1.30 saved:monthly
* as normal, although I usually only consider cash transactions “cleared” after I check that the cash in my wallet matches what hledger thinks it should be.
Income is recorded as the pre-tax amount coming from
income:$source, and is split across
liabilities:*. All amounts are included.
2018-06-29 * Cabinet Office goal:tax £50.00 saved:clothing £13.00 saved:gift £20.00 saved:health £7.00 saved:household £15.00 saved:insurance £11.49 saved:invest £116.00 saved:monthly £385.71 saved:phone £13.00 saved:rent £1700.00 saved:tech £13.00 saved:travel £25.00 saved:utilities £100.00 saved:web £60.00 expenses:tax:income £788.00 expenses:tax:ni £385.39 liabilities:loan:slc £237.00 assets:pension:civilservice £227.08 income:job -£4166.67 assets:pension:civilservice £920.83 income:job -£920.83
Income may not necessarily be taxed:
2018-06-02 * Interest saved:monthly £4.00 income:interest
Investments are a transaction from
saved:invest to the appropriate investment account. All amounts are included, using the
@@ form to exactly specify the overall price. Trading fees go to
2017-12-18 * Coinbase assets:investments:coinbase 0.25 LTC @@ £60.17 expenses:fees:coinbase £2.50 saved:invest -£62.67
Transferring the cash to the investment account and then investing it may be two separate steps:
2018-06-01 * Cavendish assets:investments:cavendish £100.00 saved:invest 2018-06-01 * Cavendish assets:investments:cavendish 0.47 VANEA @@ £100.00 assets:investments:cavendish
A broker may charge a management fee by selling some of the assets:
2018-01-03 Cavendish assets:investments:cavendish -0.02 MCMEA @@ £0.03 expenses:fees:cavendish £0.03
Although it is best to keep some cash in the account, if possible, to avoid the assets from being whittled away.
Cash that can be withdrawn lives in
current:float. This is because it’s useful to have cash on hand without necessarily having decided up front what it’s for, but it’s also good to bound the amount of unallocated money I have.
2018-05-24 Withdraw hand:budgeted £20 current:float
Cash can also be withdrawn in a foreign currency, which will have an exchange rate and may impose an additional fee:
2018-05-11 Withdraw hand:budgeted 10000 JPY @@ £70.41 expenses:fees:currency £1.99 current:float
“£” is the only commodity I give a symbolic name.
Expenses (bank account)
There are three types of expenses: expenses from my bank account, expenses on my credit card, and cash expenses. The former are straightforward:
2018-01-01 Subway expenses:food £5.99 month:food
Foreign currency expenses are recorded like so:
2018-01-01 Linode expenses:web 20 USD @@ £15.31 expenses:fees:currency £1.25 saved:web
Sometimes I’ll add a transaction note, which comes after a vertical bar:
2018/06/04 * Steam | Cultist Simulator expenses:fun £13.49 month:other
Sometimes transactions take a long time to clear. For example, if you buy something out of stock on Amazon, they’ll charge you when it ships. This could even be months later. For such transactions, I want to remove the money from the relevant budget category immediately, but not from my assets until the charge actually occurs. The solution is a temporary account:
2018-06-09 ! Amazon | 203-1811543-7064312 current:pending:santander £14.99 month:fun
Later, when the money is taken from my bank account, I can add the transaction to
2018-07-31 Amazon | 203-1811543-7064312 expenses:books £14.99 current:pending:santander
If this is a transaction with a note, the same note goes on both to tie them together.
I prefer this approach to posting dates, as with posting dates the ledger does not balance between the two dates. By simply using an additional account, balance is maintained.
Cash expenses require an adjustment to the appropriate budget category, transferring money back to the float to represent that that money has been allocated and spent:
2018-01-06 * Morrisons expenses:food £2.43 hand:budgeted 2018-01-06 ! Bookkeeping month:food -£2.43 current:float
This could be done in one transaction, but I think it’s clearer with two. If I’m using cash I was gifted, the expense comes from
hand:unbudgeted and there’s no transaction updating
Foreign currency cash transactions require picking an appropriate exchange rate when removing the money from the budget category:
2018-05-08 * FamilyMart expenses:food 548 JPY hand:budgeted 2018-05-08 ! Bookkeeping month:food -£4.60 ; -548 JPY current:float
@@ posting isn’t used, because the bank is operating in GBP. The exchange rate is kind of arbitrary, but something reasonably close to the then-current exchange rate should be used.
Expenses (credit card)
I model expenses on my credit card much like cash expenses.
When I pay for something on my credit card I add a transaction from
liabilities to track the debt and remove the money from the budget category:
2018-07-27 * Morrisons expenses:food £3.50 liabilities:creditcard:amex 2018-07-27 ! Bookkeeping current:pending:amex £3.50 month:food
I pay off my credit card in full every month automatically via direct debit:
2018-08-02 * American Express liabilities:creditcard:amex £17.45 = £0 current:pending
I like to use balance assertions (the
= £0 bit) for a little extra error checking when I know exactly how much an account should have in it. After the direct debit comes out there should be no balance remaining on the card.
Reimbursements are much like income, but are generally untaxed. Income comes from some reimbursement account and is put in some savings account:
2018-01-04 * Pusher saved:deposit £186 assets:receivable:pusher
As with income, the reimbursement could be split over multiple savings accounts.
Predicting the Future
Predicting the future can be the downfall of an otherwise-sound financial plan. Always be pessimistic! Only include income which you are certain you will get (barring some extreme change in your life circumstances); but include any expenses you can think of, even if they are unlikely. If you can be pessimistic and still have some wiggle room in your plan, then you are probably in a good place.
By a “budget” I mean an allocation of current money to expense categories and new money to savings categories. I budget on a monthly basis.
Firstly, my monthly expenses:
~ every 1st day of month (assets:cash:starling:patreon) -£3.00 ; HPPodcraft (assets:cash:starling:web) -£45.00 ; Linode / OVH / Moniker (estimate) (saved:food) -£185.00 ; Monthly food (saved:invest) -£150.00 ; Cavendish direct debit (saved:rent) -£82.00 ; Council tax ~ every 15th day of month (saved:rent) -£1300.00 ; Haart ~ every 16th day of month (saved:insurance) -£11.49 ; Homelet ~ every 28th day of month (saved:graze) -£15.16 ; Graze (saved:phone) -£13.00 ; EE (saved:utilities) -£25.00 ; TalkTalk (saved:utilities) -£50.00 ; EDF Energy
Now, my monthly income:
~ every 30th day of month current:pending:starling £45.00 ; top up web current:pending:starling £3.00 ; top up patreon saved:discretionary £114.34 ;= £500.00 saved:food £200.00 ;= £1000.00 saved:gift £0.00 ;= £150.00 saved:graze £15.16 ;= £50.00 saved:health £0.00 ;= £50.00 saved:household £40.00 ;= £300.00 saved:insurance £11.49 ;= £50.00 saved:invest £150.00 saved:phone £13.00 ;= £50.00 saved:rent £1900.00 ;= £4200.00 saved:tea £15.00 ;= £30.00 saved:travel £15.00 ;= £50.00 saved:utilities £75.00 ;= £250.00 expenses:tax:income £807.60 expenses:tax:ni £387.48 liabilities:loan:slc £246.00 assets:pension:civilservice £232.76 income:job -£4270.83 assets:pension:civilservice £943.85 income:job -£943.85
The month-to-month allocation of cash to
saved:... categories will vary a little.
Notice how I’m only spending £1382 of
saved:rent a month, but I’m adding £1900 to it. This is to build up a buffer so I’m not living pay day to pay day. The goal is to have three months expenses in every category saved up; once I achieve that with rent, the excess money will be allocated elsewhere.
In its simplest form, forecasting is just applying your budget into the future. I plan for each calendar year, so I look ahead to the end of December to see that everything is working out.
However, expected future events can be added to the forecast too:
; Dentist ~ 2018-03-20 expenses:health £20.60 saved:health
It is essential that none of my savings accounts dip below zero, and ideally their balance should be increasing every month, due to saving extra. When I have enough of a buffer, I will remove this extra allocation (just maintaining the current balance) and put the extra money to some other use.
In my mind, it doesn’t really make sense to talk about budgeting and forecasting as separate entities. A budget only makes sense if it serves your future purposes, so it’s not as simple as looking at what you have vs. looking into the future. I try to think of it like this instead: budgeting is the allocation (which may involve planning ahead) whereas forecasting is looking at how your allocation (plus any other expected transactions) changes your financial situation over time.
In addition to simply recording transactions, there is some bookkeeping I do occasionally, to keep my records easy to process.
Once every so often
Every so often (every week or two) I check my various financial statements and reconcile transactions in the journal:
- For every transaction in the statement, find the corresponding journal transaction and mark it.
- If there are transactions missing from the journal, add and mark them.
- If there are transactions missing from the statement, the institution is being slow; reconcile as they come in over the next few days.
- If all transactions have cleared but the balance is not what is expected, either figure out what happened or add transactions to adjust (see Balance Correction).
- Check the balance in my wallet and mark all
- If the wallet balance is below the
handbalance, add a transaction to adjust (see Balance Correction).
- If the wallet balance is below the
End of Year
- Reconcile transactions.
- Rename the current journal file from “current.journal” to “$YEAR.journal”.
- Identify financial goals for the upcoming year.
- Create a new “current.journal” for the upcoming year with budget and forecast transactions.
- Initialise all accounts on the first of January by transferring from equity.
The budget created in (4) will depend on the goals identified in (3). Here’s an example of a (5) transaction setting up the starting balances:
2018-01-01 ! Start of year hand:budgeted £242.70 ; current:float £77.30 saved:gift £5.00 saved:household £100.00 saved:invest £5.00 saved:monthly £342.36 saved:moving £950.00 saved:rent £1038.00 saved:travel £100.00 saved:web £195.00 ; assets:investments:cavendish 2.54 VADEA @@ £800.00 assets:investments:cavendish 65.00 MCMEA @@ £99.77 assets:investments:cavendish 31.19 MCOUA @@ £50.00 assets:investments:cavendish 7.15 MHMIA @@ £50.00 assets:investments:coinbase 0.004 BTC @@ £51.91 assets:investments:coinbase 0.10 ETH @@ £62.04 assets:investments:coinbase 0.25 LTC @@ £60.17 assets:investments:coinbase 10.00 EUR @@ £9.11 ; assets:receivable:deposit £300.00 assets:receivable:pusher £186.00 assets:receivable:university £188.38 ; liabilities:overdraft:santander:current -£2000.00 liabilities:loan:slc -£28592.25 ; equity
This is the template for a new journal file:
include commodities include prices alias hand = assets:cash:petty:hand alias current = assets:cash:santander:current alias month = current:month alias saved = current:saved alias goal = current:goal * Forecast * Starting balances * Ledger ** January ** February ** March ** April ** May ** June ** July ** August ** September ** October ** November ** December
The reason for the
*-style headings is so that
orgstruct-mode can be used to collapse sections.
Sometimes I get things wrong. I will make a mistake recording a transaction, and a mistake reading that same transaction from my bank statement at the end of the month. Because it takes time for transactions to appear in my online banking, and even then they often appear out-of-order, just comparing my hledger end-of-month balances with what my bank thinks they are is not easy.
Tracking down the original error is usually far more trouble than it’s worth.
If I suspect I have made a mistake (or just want to verify that I haven’t), I avoid spending money from my bank account for at least one working week. A simple way to achieve this is to withdraw a bunch of money and just use cash for that week.
After a week, every uncleared transaction should really be in my online banking, so I can reconcile, and insert a balance adjustment transaction if I need to:
2017-03-01 * Balance adjustment expenses:adjustment £8.51 saved:monthly 2017-03-31 * Wallet adjustment expenses:adjustment £14.98 hand:budgeted 2017-04-30 * Balance adjustment saved:monthly £1.25 income:adjustment
I made 12 adjustment transactions in 2017 and 6 in 2018. Hopefully in 2019 I won’t need any.