Personal Finance in Monzo

18th March '19

During my time at university, I applied a forecasting approach to keeping track of my money. Previously, I used a spreadsheet for this, but with the availability of the Monzo API, I figured that I could automate a lot of this process.


Wario is my latest attempt at this, and so far, it has been the most consistent. It runs on Heroku and responds to Monzo webhook events, using their data to populate an Airtable base. The base is then configured as Zodiac was, enabling me to forecast my account balance.

This is by far the simplest and most effective solution yet, for a number of reasons. Less code means there's less to maintain, and there's a reduced attack surface to boot. Unfortunately, Monzo webhook events can't be cross-validated using some sort of key, so that's the only caveat I've seen so far. Over a month's usage, I've almost never had a desynchronization between the balance Monzo reports and the balance my Airtable base reports.


I began to learn React during my time at UKCloud, and thought that applying my knowledge to this project would let me exercise my skills and advance them in a way tutorials might not be able to.

The amount of filtering I had to do with the incoming transactions to group them by month and category proved heavy, so I figured a gateway API would be well suited to the task. I developed this in Ruby on Rails. This provided the values to the frontend in a way that required far less processing, and allowed me to build the UI around the values. Zodiac is now usable on request by any customer of Monzo - users must be added to the API client as 'collaborators'.

Zodiac allows Monzo customers to classify their transactions using fully custom categories, unlike the base app. This is done by adding metadata to the transaction on the Monzo API. These custom transactions are then used in the forecasting view.

The forecasting view shows the sum of transactions in each category for each month. Users can also set budgets, which Zodiac uses to look ahead and forecast how much money they might have if they spend to the limit. Budgets are also used to mark out months where a user might've spent too much in one month.

Zodiac was admittedly incredibly slow, and while the UX was nice, the time it took for the API to process requests made it unwieldy to use. There's a lot I could've done better with Zodiac, but as a first major React-centric project, I think it served its purpose well in pushing my skills further.


Bank was my very first shot at this. It was a full Rails app that was populated using webhook events. The caveat here was that I was in charge of the UI. I don't remember much what it was like to use Bank, but all I can say is that it left a lot to be desired, since it preceded any formal industry experience or training I had with Rails.

Copyright © 2016-2021 Simon Fish