I have been eagerly anticipating the introduction of budgeting to Iron Money for years. The original private beta had budgeting, and that was over three years ago. Ever since scrapping the private beta and not including budgeting in the first public beta, I knew that introducing budgeting would be one of my most important—and difficult—accomplishments. For years I’ve conceptualized how I think budgeting should work, and now it was time to finish designing how it would work and be integrated into Iron Money.
Starlight
Budgeting systems are very popular among consumers. I think people like to latch on to a system that they can follow, rather than just buy into an app or service and use the tools. Budgeting systems provide a little bit more structure and personality, and I wanted to make sure Iron Money not only allowed for other budgeting “systems,” but also had its own.
So, I defined the basic tenants of budgeting with Iron Money. As much as possible, I wanted it to be fairly hands-off; set it up, tweak it a little bit from month to month, but in general, don’t worry about it. I also think it’s really important to start designing products and services with voice in mind. If this were a voice-activated system, how would it work? If the budgeting system were a human, what would you ask it to do and how would you expect it to work?
I devised a fairly simple system: for each spending category, add an expected amount of spending per month/year. Iron Money will automatically distribute the requested money to each category from the user’s income. If the user doesn’t have enough cash on hand, credit could be used to cover necessary expenses.
That’s it. A simple list of budgets to check to see whether you have enough money to spend or not. Iron Money automatically handles distributing your income and saving up for future budgets. Everything you don’t budget for is counted against Available Funds. The simplicity of this system cannot be overemphasized.
Red
I typically prefer to design new features for iOS first. I find the simplicity required by iOS makes it easier to build the Mac and web apps correctly.
I took a look at the main budgets list. This list shows each budget and how much is available to spend—right now. This is arguably the most important view, especially in the iOS app—it answers the “can I afford to make a purchase right now?” question. In tandem with that question is “how long does this money need to last me,” which could be answered by a little progress bar under each budget; it subtly shows if you’re on track for the month or if it looks like you’re going to blow your budget. It’s tinted green if you’ve spent less than where you should, yellow if you’re over what you should’ve spent, and red if you’re over the budgeted amount.
I Almost Do
One issue I was really unsure about was prioritizing the budget. At first blush, the most simple answer is to not prioritize at all. I debated whether or not prioritization was absolutely necessary and came to the conclusion that some form of prioritization was needed. Iron Money’s budgeting system is based on the idea that there are some categories which must receive their money, and others for which it is optimal if they receive their full amount.
Thus, a binary prioritization scheme was born. Budgets would be separated by needs vs. wants, with needs always receiving their money (even if credit financing is required), while wants will get their money if they can (no credit financing allowed). This distinction provided a nice way of presenting this distinction in the interface; by telling Iron Money whether or not it was appropriate to borrow on credit to meet the budget, the entire budget would be prioritized. Everything after needs would simply be filled by date and percentage.
Percentage budgets are the only exception to this prioritization scheme. When income is made, any budgets with a percentage amount are immediately handled—whether or not they are a need or want. Then, as the time approaches for a “need” budget to be fulfilled, the need budget will steal from any percentage budgets that aren’t marked as need.
State of Grace
There are a number of things that I wanted to do that were cut.
First, I originally planned to have Savings based on each income category. The idea was that a budget could be tied to an income category so it would only pull money from that income category. However, there were a bunch of issues with this, so I had to pull it.
Second, I wanted Iron Money to have a reservation system for budgets. The idea (very similar to how Simple’s Goals feature works) was to have Iron Money set aside money for each of its budgets over time, so it could take money out of Savings and warn the user if they were getting close to not being able to fulfill a budget. This feature was a bit complicated and not as necessary (especially since the warning system could be built without having the reservation system), so it was pulled within the first couple of weeks of building budgeting. It saddens me that this was pulled, since I thought this was one of the primary awesome things about budgeting with Iron Money, but for the sake of simplicity, it was not going to happen in the first release.
Third, I’ve been on the fence as for whether or not a user should be able to set a budget for an “other” category. On one hand, since it’s a category, it should be allowed; on the other hand, “other” spending can be handled by the parent category, and the parent category can handle all other spending (even outside the “other” category). For now, I’ve stayed conservative and only allowed “spending” category to be used as a spending category for budgets.
Fourth, I originally planned for percentage budgets to exist. The idea is simple: when money is made, any budgets with a percentage amount immediately grab funds from the income. Again, simplicity (both in terms of implementation and user experience) won out and this was cut from the original release. This is something I’d really like to add in the future.
Treacherous
This wasn’t something that I had at all thought about before I started figuring out how Available Funds would work. Once I started looking at account types, I realized that Savings should only reflect liquid accounts, and thus it was born.
Everything Has Changed
It took me a couple months to implement budgeting: a few hundred man hours for what might seem like a relatively simple feature.
It was anything but.
A great example of the complexity of creating budgeting is in a simple feature built so that it would work correctly. As soon as a budget occurrence ends, funds are transferred out of the occurrence and to the next occurrence (for a rollover budget) or back to Available Funds. However, since transactions sometimes aren’t added for an occurrence until after it ends (e.g. a purchase at the end of the month that isn’t reconciled by the bank until the next month), Iron Money has to be able to modify the occurrence to reflect the correct amount spent, which also affects the amount that would move to a rollover budget or Available Funds. Depending on how far back the occurrence was, this could cascade and affect one or more occurrences.
To combat this “back from the future” issue, Iron Money monitors when Available Funds doesn’t have the amount required by the occurrence. If it doesn’t, it looks at transfers out from Available Funds and modifies them (by either making the transfer less or deleting the transfer completely).
This also works in unexpected ways with rollover budgets. When a budget has an overage and the overage transaction is deleted, the transfer from the future occurrence to the past occurrence (for the overage) is deleted and a new transfer from the past occurrence to the future occurrence (for the rollover) is created.
I Knew You Were Trouble
When a transaction is added (without splits), it either counts as part of Available Funds or an occurrence. Either way, either liquid funds or credit is used to cover the transaction. Iron Money must keep track of the liquid or credit split in order to reverse or edit it if a transaction is deleted or edited.
Credit/liquid splits are recorded on a per-transaction, per-split basis (because transactions and splits are kept track of separately, occurrence-wise). In-line with the budget occurrence info, the credit/liquid split info is kept: the amount applied as liquid, and the amount applied as credit.
In order to have this information for each transaction, the updater will go through each user’s transactions and figure out the correct allocation. This will be done by getting the accounts, subtracting each transaction from the account to get the starting balances, “adding” the accounts as available funds, then “adding” each transaction so that it’s counted correctly.
The Last Time
Less than a week before launch, I started working on handling income transactions. Yes, just six days before launch, I started working on the second “half” of the budgeting equation.
This proved to be a royal pain in the ass. When only liquid accounts are included in a budget, it’s easy enough: each transaction is liquid and only liquid funds can be affected. However, this completely changes with credit accounts: any income into a credit account with a positive balance can be seen as straight liquid income, but when the income is for an account with a negative balance, that’s actually a reduction of credit debt (and thus should affect the credit funds, not liquid funds); thus, it increases the credit available in Available Funds but not the liquid amount.
Begin Again
The litany of ways in which the budgeting system touches all parts of Iron Money continues to provide numerous issues to fix. Throughout the entire process, I thought of ways in which it might break and focused on testing the sensitive parts and fixing the bugs. I, without a doubt, have missed things that users will run into. However, as time goes on, I’ll continue to fix these issues and refine the system so that it approaches perfection.