Preparing my tax returns 82% easier using Beancount

82% of all statistics are made up.

I've written multiple blog posts about Beancount over the past few years. It's one of those pieces of software that I can't stop talking about and that has made a huge positive impact on my private life. In this blog post, I'll describe one specific use case where I find a Beancount-driven finance tracking workflow particularly handy: preparing my tax returns in Germany.

Disclaimer: the usual disclaimers about money-related content apply. This is neither legal advice, nor financial advice. Actually, this is not even advice. Everything in this post (and on this website) should be considered entertainment. Make sure you have popcorn while reading this post. 🍿

Filing tax returns in Germany

Filing tax returns can be a slog. You normally look back on an entire year, log in to your bank accounts (of which there may be a few), get a list of your financial transactions for that year, check which of those transactions are relevant for your tax returns, so on and so forth. You also often have to look for invoices or receipts that the tax office may ask for if they need further clarification.

Being organized with your finances definitely comes in handy, but even then the whole thing can be painful. I know people who allocate a weekend in the future when they would "finally do their tax returns" and become increasingly more nervous as that weekend approaches.

Tagging expensable transactions using Beancount

I've been maintaining my personal finances in Beancount over the past 10 years. This also means that at any given point in time, I have the full picture of all my bank transactions across a few different accounts. When I say full picture, I really mean The Full Picture, basically down to the last cent.

This makes finding tax relevant transactions super easy. For instance, in Germany (at least where I live) the tax office allows expensing some costs of an internet connection under some conditions. So when I import the internet costs into my Beancount ledger, the second posting within that transaction is appropriately named to make later retrieval intuitive.

Here's what such a transaction looks like:

2026-05-22 * "Telekom Deutschland GmbH" "Kundennummer 123 Rechnung 456"
  Assets:DKB:EC  -35.00 EUR
  Expenses:Internet:Telekom

Over a given year there will be 12 of these in my ledger. This means, when preparing the tax returns the next year, I can sum up the amounts in all those 12 transactions to know exactly how much I can expense.

Attaching documents to expensable transactions

Often, you're expected to attach invoices or receipts as proof that the transaction you're trying to expense actually did happen. You may end up collecting these invoices or receipts in a separate folder on your disk (and probably inventing a naming convention along the way to keep all those files organized).

Beancount provides a better way. Just attach the file to the transaction!

For instance, consider the Expenses:Internet:Telekom transaction from the previous section. Assuming that your Beancount ledger and all associated data lives under ~/work/finances, the first thing to do is instruct Beancount that all the document files live in ~/work/finances/documents using an option directive.

option "documents" "documents/"

Now, it's possible to just put the invoice from internet provider in a directory (under ~/work/finances/documents/) that resembles the account hierarchy in the account name, which in this case would mean ~/work/finances/documents/Expenses/Internet/Telekom/2026-05-22.pdf.

With this structure in place, when viewing the transaction using Fava, the document you attached to it will show up right next to the transaction! Copy, paste, and you're done!


After filing several returns this way, tagging transactions and attaching documents in Beancount are the two features that have made the biggest dent in the process for me. And while your mileage may vary, I've noticed I'm not spending days logging into bank portals and digging through bank statements anymore. Is this exactly 82% easier? Probably not, but it's definitely a massive improvement over what I had earlier.