30 April 2026

Why I Wrote Tiller2QIF

Topics: Everything Else
Tags: finance
When you have a lot of accounts, getting the data into personal finance software like GnuCash has been a time consuming process. No Longer.

I’ve used finance software for decades to keep track of my finances, I switched from Quicken to GnuCash in 2013.

Every time I try to leave GnuCash, I’ve come back. For the price, free, GnuCash I’ve concluded is the best that’s out there. There are plenty of FOSS programs available to challenge it, but the reality is that a lot of detail goes into a good accounting program, and that means a big project or one with significant sponsorship to match the capability of a solid mature program like GnuCash. As an older program, developed in a period when a lot of people in the FOSS community might have wanted to get away from Quicken, it has limitations. For developers looking to extend functionality, the plugin and api architecture are incomplete, difficult, and never fully documented, making it extremely difficult to do anything without really diving in to the old C and Scheme codebase.

When looking at alternatives, GnuCash isn’t a Check Book Manager, it’s a double entry accounting program that can balance your checkbook or run a small business just as well as Quickbooks can. Most of the alternatives are Check Book Managers: simpler programs without the robustness of a double entry backend. There is an overhead and learning curve to GnuCash, but ultimately it is solid and does it’s job really well.

For getting data the FOSS alternatives generally suffer the same limitation, to get data in you need to download ofx/qfx files, qif files, or import csv files. When you have a lot of accounts this is time consuming, not only during your monthly reconciliation, when you might be logging into your accounts to get your statements anyway, but every time you want an up to date picture of your finances.

There are two established services that will aggregate transactions from financial institutions, Yodlee and Plaid. Neither sells retail subscriptions directly. Even if they did, it wouldn’t be easy to write a plugin for GnuCash to use them.

A year and a half ago I switched from GnuCash to MoneyDance, because they integrate with Plaid and for a reasonable license and subscription fee you can get your transactions at the click of a button. MoneyDance is written in Java and works across platforms, it is only a Check Manager. During an overlap period and for about 6 months beyond I used and ultimately found it a lot less robust the GnuCash. I made lots of mistakes accepting downloaded transactions so I started exporting QIF files and using GnuCash to reconcile accounts, and then MoneyDance was just a download tool. During the reconciliation process I still had to log into my accounts, because MoneyDance does not provide the online balances.

Other people I know use Tiller. Tiller uses Yodlee to bring your accounts into Google Sheets or Excel. Of the three paths for getting data into GnuCash, CSV is the weakest implementation by far, and it would require breaking the export down by account and suppressing duplicates. If you don’t reconcile your accounts, what Tiller gives you is good enough. You get tabs with your balances across all accounts, analysis of your spending, and all of your transactions. I also found the setup of online accounts a little more polished than MoneyDance. In MoneyDance, accounts that frequently requested 2FA authorization were unusable; I can click refresh in Tiller and enter the 2FA code without having to relink the account. Right off the bat, Tiller was a better downloader, more useful in reconciliation, and a more reliable at-a-glance tool.

While Tiller gives good and accessible data, its data categories might not match yours, and it might not always get a category right, so you still want a manual reconciliation process — which I don’t ever see being possible in Tiller, beyond just editing entries in your spreadsheet. A Check Book Manager like KMyMoney or HomeBank is better at this; an accounting program like GnuCash is even better.

Tiller, while affordable ($100 a year in 2026), is more expensive than MoneyDance. As there is no monthly option, I had a 30-day trial to decide if I was keeping it, and spent a weekend writing this utility. While the QIF import interface in GnuCash isn’t as slick as the OFX/QFX import, it allows all accounts to be imported in one action, whereas OFX/QFX must be split to a file per account — ten imports for ten accounts.

I started by looking at an existing tiller-sheets-export utility written in Python. After spending two hours reaching the conclusion that the only viable way to install it was a Docker image, I rejected it as a starting point and put automating downloads off as a later project. Since the Google Sheet already has a tab with my account balances, opening the sheet is a quick, zero-effort way to get that, and just a few extra clicks to download the transactions tab as CSV.

Once getting the CSV was going to be either manual or a separate later project, I needed to choose which language it would be in: Perl, Python, or Ruby. The QIF format, while not pretty, is extremely simple — generating it doesn’t even need a library. For a utility that, once stable, I wouldn’t want to spend a lot of maintenance time on, says Perl. Not having to worry about local::lib, bundles, and venv, Perl and Python were going to be best for getting all dependencies from available OS packages. For regexes for data transformations, Perl’s superiority here outweighed a little extra effort on preventing mojibake (AI plowed through generating a mojibake stress test).

I considered writing a more generic CSV2QIF tool, however, fields would need to be mapped over to the database’s fields. I chose not to worry about that, it should be a small task to rewrite the csv to a compatible format. If someone has another format and writes a converter, I’d be happy to consider adding a flag to run their remapping before Ingest.

The result is Finance::Tiller2QIF on CPAN. For a tour of what it does and why I think it’s a useful tool, see the companion post on features of Tiller2QIF.