beancount for travel and investing purposes

127 views
Skip to first unread message

Fabian Braennstroem

unread,
Mar 20, 2025, 2:36:35 PM3/20/25
to Beancount
Hi all,

I am quite new to beancount (and in accounting in general) and are testing a few
minor things at the moment with version 3.

At the moment I am planing to use it for two topics. One is for travelling and
another one is for calculating tax relevant gains from
investing (with interarctive brokers), which needs to be converted to EUR
currency gain. For my understanding that is possible with beancount, but I missed up
to now a good example case for it. Maybe someone can point me to one? This would
be great!

As mentioned, in addition to these investing tasks, I would like to track my business trips and also count days abroad or days in a hotel.

For my understanding I am having different options to track this.
I saws this: https://groups.google.com/g/beancount/c/NGt2BRHR6LE
and understand, that I can use tags, meta or links for additional information.
It seems that meta is a good option.
Maybe I could even use a special NIGHT-currency also for tracking it.

But I am not sure yet, what the best way is to get e.g. the number of nights
which I stayed in a hotel in a certain time frame and what I paid for this.

E.g. I could state a stay of 3 night in these two ways:
```
2025-03-11 * "Hotel in Berlin (3 nights)"
  date: "2025-03-08"                   ; Booking date
  nights: 3                            ; Number of nights
  purpose: "Conference"
  Expenses:Travel:Accommodation:Hotel    300.00 EUR
  Assets:Bank:Checking                  -300.00 EUR

2025-03-08 * "Hotel in Berlin (3 nights)"
  firstNightDate: "2025-03-11"                   ; date of 1st night
  nights: 3                            ; Number of nights
  purpose: "Conference"
  Expenses:Travel:Accommodation:Hotel    300.00 EUR
  Assets:Bank:Checking                  -300.00 EUR

```

With this query:  
 
```
bean-query uow_test3.beancount "
SELECT SUM(position), entry.meta['nights'] as nights
WHERE account ~ '^Expenses:Travel'
GROUP BY nights
"
```


I get something like this:

```
SUM(positi  n
----------  -
600.00 EUR  3

```

I.e. I am summing the cost for all stays with 3 nights, but the number of
nights.

Do you have an advice how I can adjust my query for this?
Thank you in advance!
Best Regards
Fab

Patrick Ruckstuhl

unread,
Mar 21, 2025, 12:24:44 PM3/21/25
to bean...@googlegroups.com

Hi Fab,


welcome to your journey with beancount :)


First for your journey questions. I think if you need/want the days, having it as a special currency instead of just metadata might be useful.

This allows you to do calculations/aggregations on them, which I think you can't do with the metadata. I use here a separate expense account for the "NIGHTS", because I don't like to mix "Currencies", but you could keep it in the same one as you keep the monetary expenses.

I'm modeling the other side of the nights as Equity, personally that feels cleaner than putting in Assets/Liabilities.

I'm guessing this is just for your own interest, not for reimbursing, otherwise I would model it differently.


```
option "operating_currency" "EUR"

2025-01-01 open Expenses:Travel:Accommodation:Hotel EUR
2025-01-01 open Assets:Bank:Checking EUR
2025-01-01 open Expenses:Travel:Nights NIGHTS
2025-01-01 open Equity:Nights NIGHTS



2025-03-11 * "Hotel in Berlin (3 nights)"
  date: "2025-03-08"                   ; Booking date

  purpose: "Conference"
  Expenses:Travel:Accommodation:Hotel    300.00 EUR

  Expenses:Travel:Nights                      3 NIGHTS


  Assets:Bank:Checking                  -300.00 EUR

  Equity:Nights                              -3 NIGHTS



2025-03-08 * "Hotel in Berlin (3 nights)"
  firstNightDate: "2025-03-11"                   ; date of 1st night

  purpose: "Conference"
  Expenses:Travel:Accommodation:Hotel    300.00 EUR

  Expenses:Travel:Nights                      3 NIGHTS


  Assets:Bank:Checking                  -300.00 EUR

  Equity:Nights                              -3 NIGHTS

```

Without even doing any special queries, you'll already get a lot of information (e.g. in Fava)


and you can query that information like


```
SELECT sum(filter_currency(position, 'EUR')) as Cost, sum(filter_currency(position, 'NIGHTS')) as Nights, entry_meta('purpose') as Purpose
WHERE account ~ '^Expenses:Travel' GROUP BY entry_meta('purpose')
```


As for dealing with investments from IBKR, I'm doing this as well.

My use case is pretty simple and boring, mostly buy and hold. For this I have built two things which are useful for me

An importer which pulls, buys and dividends directly from IBKR

https://tariochbctools.readthedocs.io/en/latest/importers.html#interactivebrokers

A price import which pulls the price information for securities from IBKR

https://tariochbctools.readthedocs.io/en/latest/price_fetchers.html


For general documentation about investments, this part of the official beancount doc is a very good starting point

https://beancount.github.io/docs/trading_with_beancount.html


Regards,

Patrick

--
You received this message because you are subscribed to the Google Groups "Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beancount+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/beancount/fb28e70a-7ee3-4d56-9dcc-081de1ecc923n%40googlegroups.com.

Vasily M

unread,
Mar 22, 2025, 8:10:23 AM3/22/25
to Beancount
Hi Fabian,

I was interested in tracking trip expenses on a high level as well and recently solved this for myself, at least to the point I'm satisfied with.
The starting point was the awesome https://github.com/andreasgerstmayr/fava-dashboards plugin for Fava that already had "Travel" tab in examples but it wasn't clear to me how to use it without much friction. I ended up slightly altering it and finding some practices that make it straightforward.
It's all included in https://github.com/Evernight/lazy-beancount and I've also described various tips at the guide's section here: https://lazy-beancount.xyz/docs/stage4_improvements/overview/#tracking-trips-and-travel-expenses (of course, you don't have to use the whole package and can just reproduce the bits separately). Well, this point is currently just a single sentence but hopefully other tips and context make it more understandable. In any case, happy to expand on technical details.

1. Adding #trip-trip-id-maybe-also-date-05-24 and #travel tags make all transactions appear in the dashboard. This allows to view them in Fava views and indeed write BQL queries, etc. The Expenses breakdown dashboard tab then also becomes useful but I had to patch Fava (pull request pending) to make it work.

2. Usually trips happen over continuous period of time and most of transactions happening within this period can be automatically categorized into this trip. I use / wrote filter_map plugin to avoid manual tagging.

3. You also may be interested in https://github.com/Akuukis/beancount_interpolate plugin to use, for example, with transactions related to booking accommodation. For dashboards and other analytics you can virtually move transaction to a different date than a date of payment and spread the cost across number of days.

4. Indeed, metadata is a good mechanism for further customization. I guess the only point to add here is that you can easily plug queries into your customized dashboards for more visual representation.

Best regards,
Vasily

Fabian Braennstroem

unread,
Mar 22, 2025, 11:57:07 AM3/22/25
to Beancount
Hi Patrick,

thank you very much! This helps already and I will see, how I can use it in a best way.

Best Regards
Fabian

On Friday, March 21, 2025 at 5:24:44 PM UTC+1 Patrick Ruckstuhl wrote:

Fabian Braennstroem

unread,
Mar 22, 2025, 11:59:05 AM3/22/25
to Beancount
Hi Vasily,

thank you as well for your help and the pointer to the other tools! I will need a bit time to look at lazy-beancount, but it looks quite helpful.

Thank you!
Best Regards
Fabian
Reply all
Reply to author
Forward
0 new messages