One complex scenario that can cause accounting headaches is when you need to track money movements across a group of accounts that are divided between different parties, and need to be reported on both jointly and separately (for example, members of a household, or partners in a small business). Ideally, tricky things like joint accounts and inter-party transfers would be reported clearly and correctly.
Naturally, there’s a way to make this work in Ledger, but it requires a bit of setup!
(This post is part of a series describing how I use the Ledger accounting system. For an introduction to Ledger and this series, or to see all the entries, have a look at the first post).
The first difficult bit comes up when there are transfers between parties: they need to be reported as expenses or income when looking at each set of books individually, but they should just be counted as internal transfers when reporting on the group jointly (that is, the group as a whole has neither lost nor gained money). Consider for example a group of students living in shared rental housing: They might all pay a share of rent to one of them, who is then responsible for paying the full rent to their landlord. Those internal payments should count as rent payments when looking at each person’s accounts, but just as transfers between asset accounts when looking at the entire household, with only the final full payment counting as a rent expense.
The second tricky case is joint (shared ownership) accounts: Both parties need to have them in their books, but they shouldn’t be double counted when looking at all accounts in aggregate.
Demonstration Setup
To model these scenarios, let’s say we’re tracking accounts belonging to
two people, Alice and Bob, and create a couple of test journals for them.
First, an account for Alice, in alice-chequing.journal
:
A Assets:The Bank:Alice's Chequing
2018-11-01 Alice's Employer
Income:Salary $-1,000.00
2018-11-02 Tim Hortons
Expenses:Food:Restaurants $30.00
2018-11-03 Bob
Expenses:Household common expenses $200.00
2018-11-04 Bob
Expenses:Transfer to Bob $100.00
And a “main” journal for Alice, from which all her accounts would be
included (there isn’t much to do here right now given she only has one
account), which we’ll put in alice.journal
:
include alice-chequing.journal
And let’s set up an account for Bob, in bob-chequing.journal
:
A Assets:The Bank:Bob's Chequing
2018-11-01 Bob's Employer
Income:Salary $-500.00
2018-11-03 Transfer from Alice
Expenses:Household common expenses $-200.00
2018-11-04 Transfer from Alice
Income:Transfer from Alice $-100.00
2018-11-05 Landlord
Expenses:Household common expenses $400.00
…and Bob’s main file, bob.journal
:
include bob-chequing.journal
Transfers Between Parties
At this point, it’s still easy enough to report on these accounts individually:
$ ledger bal --file alice.journal
$670.00 Assets:The Bank:Alice's Chequing
$330.00 Expenses
$30.00 Food:Restaurants
$200.00 Household common expenses
$100.00 Transfer to Bob
$-1,000.00 Income:Salary
--------------------
0
$ ledger bal --file bob.journal
$400.00 Assets:The Bank:Bob's Chequing
$200.00 Expenses:Household common expenses
$-600.00 Income
$-500.00 Salary
$-100.00 Transfer from Alice
--------------------
0
Now, so far, the only thing we had to keep in mind was that there may be
two different kinds of transfers between Alice and Bob: ones that are
specifically for paying a share of a common expense, and general ones that
just represent money moving between accounts without being earmarked for a
specific purpose. These two kinds of payments have to be tracked separately.
Note that Alice made two transfers to Bob, under two different
“Expenses
” categories. Likewise, when Bob received them, they
were tracked differently there too. The earmarked transfer was counted as a
credit against an expense, while the regular movement was counted as
income.
Let’s try reporting on them jointly. To do so, we’ll create a new journal
that aggregates the two accounts, in joint.journal
:
include alice-chequing.journal
include bob-chequing.journal
…but trying to run a report on it breaks down on the non-earmarked transfers between Alice and Bob:
$ ledger bal --file joint.journal
$1,070.00 Assets:The Bank
$670.00 Alice's Chequing
$400.00 Bob's Chequing
$530.00 Expenses
$30.00 Food:Restaurants
$400.00 Household common expenses
$100.00 Transfer to Bob
$-1,600.00 Income
$-1,500.00 Salary
$-100.00 Transfer from Alice
--------------------
0
The Expenses
and Income
are incorrect, because
they’re counting “internal” transfers that should just move money between
different Assets
accounts.
To fix this, we’ll have to make use of Ledger’s
“alias” feature, which allows us to “rename” accounts on the fly.
We’ll use this to make the two copies of the transaction “cancel out” when
read in twice, so it doesn’t show up at all. Let’s modify our
joint.journal
file so it reads as follows:
alias Expenses:Transfer to Bob=Income:Transfer from Alice
include alice-chequing.journal
include bob-chequing.journal
Now, we can see that Alice and Bob’s Assets
are still reported
correctly — like they were when counted individually — and their
Expenses
don’t include transfers between them and are not being
double-counted:
$ ledger bal --file joint.journal
$1,070.00 Assets:The Bank
$670.00 Alice's Chequing
$400.00 Bob's Chequing
$430.00 Expenses
$30.00 Food:Restaurants
$400.00 Household common expenses
$-1,500.00 Income:Salary
--------------------
0
Joint Accounts
The next wrinkle to consider is joint (i.e. shared-ownership) accounts. These should be included in reports for both Alice and Bob, but need to only be counted once when reporting on their combined finances.
To demonstrate, let’s create a joint bank account journal, in
alice-and-bob-savings.journal
:
A Assets:The Bank:Joint Savings
2018-11-02 Transfer from Alice
Assets:The Bank:Alice's Chequing $-100.00
2018-11-02 Transfer from Bob
Assets:The Bank:Bob's Chequing $-100.00
And then we’ll add “include alice-and-bob-savings.journal
” to
all of alice.journal
, bob.journal
, and
joint.journal
. What happens now?
$ ledger bal --file alice.journal
$670.00 Assets:The Bank
$570.00 Alice's Chequing
$-100.00 Bob's Chequing
$200.00 Joint Savings
$330.00 Expenses
$30.00 Food:Restaurants
$200.00 Household common expenses
$100.00 Transfer to Bob
$-1,000.00 Income:Salary
--------------------
0
$ ledger bal --file bob.journal
$400.00 Assets:The Bank
$-100.00 Alice's Chequing
$300.00 Bob's Chequing
$200.00 Joint Savings
$200.00 Expenses:Household common expenses
$-600.00 Income
$-500.00 Salary
$-100.00 Transfer from Alice
--------------------
0
$ ledger bal --file joint.journal
$1,070.00 Assets:The Bank
$570.00 Alice's Chequing
$300.00 Bob's Chequing
$200.00 Joint Savings
$430.00 Expenses
$30.00 Food:Restaurants
$400.00 Household common expenses
$-1,500.00 Income:Salary
--------------------
0
The joint report looks good, but the two individual ones now have a
misleading entry for the other party’s chequing account, with an incorrect
negative balance. Fortunately, we can use the same pattern as before to fix
this! Let’s change alice.journal
to:
include alice-chequing.journal
alias Assets:The Bank:Bob's Chequing=Income:Transfer from Bob
include alice-and-bob-savings.journal
And, similarly, let’s add “alias Assets:The Bank:Alice's
Chequing=Income:Transfer from Alice
” to bob.journal
. Then
our individual reports become:
$ ledger bal --file alice.journal
$770.00 Assets:The Bank
$570.00 Alice's Chequing
$200.00 Joint Savings
$330.00 Expenses
$30.00 Food:Restaurants
$200.00 Household common expenses
$100.00 Transfer to Bob
$-1,100.00 Income
$-1,000.00 Salary
$-100.00 Transfer from Bob
--------------------
0
$ ledger bal --file bob.journal
$500.00 Assets:The Bank
$300.00 Bob's Chequing
$200.00 Joint Savings
$200.00 Expenses:Household common expenses
$-700.00 Income
$-500.00 Salary
$-200.00 Transfer from Alice
--------------------
0
Much more accurate! And because we didn’t touch joint.journal
,
that report is unaffected and still looks good.
A Caveat About Names
One thing we had to do in order to keep the accounts distinguishable when
reporting on them jointly, was to have Alice and Bob give their chequing
accounts different names. What if they had both wanted to name them “My
Chequing”? We could have tried to work around it with more aliases, which
should have been fine, except for one thing: at this time, a bug(?)
or limitation in Ledger means that aliases only apply to accounts explicitly
named in transaction entries, not to ones implicitly inserted thanks
to the “A Default:Account:Name
” declaration at the top of the
file.
This means that we have a choice: either every party has to give their accounts different names, or they can share names, but every transaction has to be fully specified; i.e. like this:
2018-11-01 Alice's Employer
Income:Salary $-1,000.00
Assets:The Bank:Alice's Chequing
2018-11-02 Tim Hortons
Expenses:Food:Restaurants $30.00
Assets:The Bank:Alice's Chequing
…instead of like this:
A Assets:The Bank:Alice's Chequing
2018-11-01 Alice's Employer
Income:Salary $-1,000.00
2018-11-02 Tim Hortons
Expenses:Food:Restaurants $30.00
Either approach works just fine, and comes down to personal preference. It’s a minor annoyance and limitation, but ideally one that shouldn’t exist.
Summary
To set up joint and individual reporting for a group of accounts, we have to create three (or more) “main” journal entry points: one for joint reporting, and one for each party. They all have to include the relevant accounts for their reports (you can’t take the shortcut of having the joint main file include each of the individual main files, or you’ll get double-counting).
No special handling is needed for transfers between parties that are earmarked for a specific purpose. Carefully defined different sets of aliases in each of the three main files let us correctly handle transfers between parties and joint accounts. More complex scenarios can take advantage of the fact that aliases only apply to files read in after the alias was defined, so careful ordering of multiple aliases can sort out almost any configuration of accounts and parties.
With all that in place, Ledger is very capable of handling multi-party accounting with joint and separate reports.