Accountant here: Recommend using Beancount with version control on your data so that you can take snapshots at various points in time.
The notion behind "accountants don't user erasers" is that like a blockchain, you're creating a trail of evidence. If all of the data is mutable all of the time, its evidentiary value is low (for example, the IRS gives more weight to "contemporary" evidence than to records constructed or altered after-the-fact).
Another reason to freeze, snapshot, or close your books is to not lose the support and detail behind any financial statements you've produced. Imagine getting a business loan based on your Balance Sheet and Income Statement but later being unable to reconstruct how those were produced.
Generally, accounting systems use a system of cumulative, immutable journal entries. If a mistake is made, then a reversing or adjusting entry is made.¹
There is merit to text based bookkeeping, but don't create a world that is so free form and mutable that it loses it meaning and connection with the real world.
I really enjoy using Beancount + Git for managing the accounting book for my own startup company, but I found it a bit tedious to add entries periodically. I wonder why nobody build a service make it like GitHub but for Beancount and automate lots of stuff. I then decided to make a service for it a while back. Shameless self-promoting here, yesterday I just launched the service in very early stage of open beta:
Basically the idea is, as a software engineer, I believe accounting book can be automated like how we build software. There are many interesting workflow we can bring into the system, such as
- Pull request review
- Commit sign off (pgp signature)
- CI for generating reports
and many other interesting aspects. Also just like software, I believe many of the orgs can benefit from open sourcing their financial data, like no-profits or government. So I am thinking making open source accounting book free repository for the product just like GitHub did previously. Anyway, I just found this thread happen to appear on hacker news so just want to share the stuff I am building. Feedbacks are welcome.
I've considered building something like this as well! I think something cool would be to integrate "predictions" or modeling with this. For example, for people with consistent salaries, this can be used to model financial goals, etc. Thoughts are welcome!
Yeah, so for BeanHub, when you push a commit, the system will capture the accounting book into SQL database. Taking from there, I can imagine there are many data prediction model can be applied to the ingested data. I am also thinking to support "CI job" feature (run a task when you push a new commit), not for building software but for your accounting book. So even if it's not supported by the system officially, it's still possible to build your prediction model.
“Bean counting” has long been an insulting term for what finance professionals and accountants do. Often it’s been used to tar CFOs as transaction processors — a role largely relegated to the back office. What’s more, people like to use the phrase to ratchet up the pedestrian aspects of finance by tagging practitioners as “mere” bean counters or “little more than” bean counters or “simply” bean counters. Such clichés get tossed around a lot.
I'm the solo software developer in my company. I share an office with an industrial automation engineer. Our office is called the nerd office. We embrace the disparaging term.
I switched to beancount after trying several other things (mint, spreadsheets, gnucash), and I like it quite a bit. It's choice to be very strict about things held at cost (like units of stock) is a great differentiation.
It's VERY hard to accidentally miss capital gains, or get cost basis wrong on something, or have something not balance. Much harder than even ledger-cli, let alone the other alternatives. It feels at times like working with a static type system versus a dynamic type system.
And the burden associated with this is not anything more than other tools. Importers have been great. I have 68 asset subaccounts between my spouse and I (if you do double-entry accounting you'll know this isn't actually that many), and I spend about 1-2 hours a month balancing the books, doing reporting, etc.
Finally, it's quite easy to get your transactions into a pandas datatable or similar, allowing you to utilize your programming/datascience skills to do things that just aren't available in other tools. Mint offers nothing here, spreadsheets can do some of it (but the downsides of accuracy), and gnucash requires learning some niche scheme stuff; it feels very "tacked on".
Bear in mind that using SQL in GnuCash may result in data loss:
> Note this feature is considered experimental. It works for most of the common use cases but some corner cases have been reported to result in data loss. [1]
What importers do you mean? Are these importers you've written yourself, or existing importers you were able to reuse? What format are these importers pulling from (PDF statements, CSV, OFX, etc)?
All of my high-volume (in terms of number of transactions) accounts are easily importable. There are a few that don't have great import functionality, but I only have 1-2 transactions on them a month so haven't felt the toil pain to better automate them. 1-2 hours a month of balancing is not worth optimizing down to 0.5-1 hour to me.
OFX is the closest to being universal, although often it is well hidden.
CSV feeds are often surprisingly useless for programmatic / feed use, they're often littered with stupid textual headers and footers and lack important columns - they're designed to be opened in excel and looked at by a human, not parsed and ingested.
There's also the heterogeneity of transactions. Looking at the csv export I've got from my bank, there are three "reference" columns and they play different roles depending on how I'm paying:
- debit card: merchant name + date, card number, blank
- alternative card-based payment system: constant (account number?), merchant, constant
- alternative app-based payment system: constant, merchant, user custom reference
And a data sanitation issue: one of the merchant names has a comma in it, and it's not escaped or quoted in the csv so that record is corrupted.
I've been using beancount for 3+ years and totally agree, the flexibility of it is the real USP.
I've never used any import tools though, I just enter the transactions manually maybe once or twice a week. It's been fine - especially using beancount-mode for emacs, although admittedly it's just my accounts, it might not scale so well for a family.
I really prefer having complete control of my financial data this way, and reports can be as custom as you'd like. Better than something like Mint in my opinion.
I hate mint but use a different budgeting system. I'm not sure you can compare an accounting system with a budgeting system - they serve different purposes. I'd love to build a full budgeting system on top of one of these text accounting systems some day.
This is not true, you can edit single entries from journals or even the whole file from the "Editor" section (it uses Codemirror). Then click "Save" and your changes will be updated on the file in real time.
With no background in accounting, I was impressed with the Beancount documentation. Very well written and a great way to learn accounting. I am looking for a solution to track my investments but I find it a bit overwhelming to get started with Beancount from scratch. Is there a tool to convert brokerage data into Beancount data from scratch?
> I was impressed with the Beancount documentation.
Me too, one of main reasons for choosing it.
> Is there a tool to convert brokerage data into Beancount data from scratch?
Problem is they are all different. But other people share what they have come up with. Maybe check the mailing list, also search for Red's Importers. If those do not work for you 'out of the box', you might need to hack something together. But you can get help on the mailing list.
I initially thought that it had to be either/or and when I switched to beancount I was sorely missing then simple balance reports from ledger.
What I’ve been doing lately is just generating ledger-formatted ledger on the fly for this that I used ledger before, while still benefiting from the strict beancount format, balance assertions and such that ledger doesn’t have
oh nice, thanks for sharing, I wasn't aware of that :-)
It seems though that the assertions are attached to transactions. The way I use balance assertions on beancount is that, say, payday after balancing everything I'd enter
> 2022-01-30 balance Assets:Bank 500.00 USD
and that will ensure that whatever happens, even if I need to go back in time to clear transactions, the amount needs to be that one, and that balance is usually straight from my current bank balance.
So, it seems slightly different use case that ledger's balance assertion
I've been using ledger for 10+ years. I guess I should try beancount, but ledger works for me. I've never had to calculate capital gains or any other taxes myself, though.
Ledger's simple model makes a lot more sense to me (ie. everything is just a commodity), but it sounds like beancount is set up to deal with a lot of the extra bullshit that exists in the legal system.
Its heavily inspired by both ledger and beancount but my biggest issue with them is that text files arnt great for double entry bookkeeping. Having a relational database is the better option which is what GoDBLedger has.
After a certain point a business cant keep track of its transactions in text files because there are simply too many of them, so these systems really only scale to personal finance levels (few hundred transactions maybe thousand transactions).
In addition building plugins that can import your whole text file into a sql system so you can query them is redundant. Just have it in a relational database to start with.
You’re spot-on about this. Even for my personal finance, I have to apply classification rules at import time and I can’t bulk edit transactions to reclassify them after the fact. As a result I am looking for a replacement, although a requirement for me is some sort of fava equivalent.
> I can’t bulk edit transactions to reclassify them after the fact.
If you store your transactions in a plaintext format, why don't you use CLI tools? I just renamed a bunch of accounts using sed for instance, in a hledger journal.
Transactions with a specific regex payee need to be reclassified into a specific expense account. Yes, I could write a sed script to do this. No, I will not write a sed script to do this.
I have also written a ledger using sqlite and go. It is not open source (yet) because somewhere in the git history may be traces of personal details. But at some point I think I will open it.
The way it works now is that I generate a directory structure from my bank account transactions. In each directory I put a text file thay describes my accounting transactions. The program parses this and inserts it into the database. From there it can generate reports.
I actually love ledger, and GoDBLedger can read in ledger files for this reason. I hate to throw negative feedback at other open source systems because the ultimate goal is to automate the financial process and we are really all working together to achieve that.
Problem: all kind of tools support different kind of databases. For a ledger I would, of course, use PostgreSQL - understandung your README.md right this is not supported, instead just MySQL and Sqlite.
C´mon, you do not like textfiles but you do NOT support PostgreSQL?
Using plain text as the storage medium is not a bug, it's a feature.
Anyway, Martin is working on v3 which is moving the core of the parser into a complied language, in order to make it even faster when parsing large datasets.
Switched to beancount from ledger a few months ago and I’m really enjoying the strict syntax of beancount. The cool thing though is that I really didn’t lose any of my reporting flows that I had with (h)ledger… I just made scripts that convert the beancount journal on the fly, run whatever I was used to with hledger, and then delete the temporary file.
I feel like I’m getting the best of both worlds :)
I started anew, just because after having using ledger I wanted to change some accounts, categories, and generally change the way I was doing things before.
But I don't see why I'd be an issue to convert ledger to beancount.
I just recently started using Beancount for tracking my personal finances and I really like it so far. I've written some custom importers to parse CSVs from various financial institutions and auto-categorize some of the expenses, income, etc. based on regex matching on the transaction description from the CSV.
I'm able to auto-categorize many of the transactions this way but there will always be some to which I need to manually apply categories. For example, entering "Expenses:Restaurants" for a restaurant I've never been to and thus don't have a corresponding matching rule. I also occasionally add new matching rules and then re-run the importer to generate a new ledger with the new auto-categorizations.
Once I edit the ledger file though I can't rerun the importer or else I'll lose my manually entered labels. Do I just add those one-off entries to the matching rules? Or is there a better way to handle this? Would be curious to hear how others are approaching auto-labeling expenses, etc.
Out of curiosity: has anybody used this to do business accounting?
I am intrigued by these ultra simple setups. However, most accountants -- the people who will ultimately help you once your business is sufficiently complex -- will use Quickbooks or some other established software.
I've done this with gnucash, which isn't exactly the same but similarly unusual to them.
What I found was that unless you are using the same back end, most of them were going to re-enter everything anyways as they want to double check. So it was more important to have the accounts & conventions they expected, rather than the actual software.
In my case, the data entry cost was about < 10% of my bill, so moving to the same software as them wouldn't be a big saving.
I've not used beancounter, so I'm not sure how much (if any) work would be needed to get the same support I had in gnucash. Mostly the complexities of invoicing and taxes in multiple countries and currencies, payroll, etc. One big issue potentially is you'll need to be able to produce proper financial statements for your jurisdiction (at least, countries I'm used to). Not sure if/how that is supported out of the box so might be some work.
I started using Ledger for my small consulting business in Switzerland. Here, the internal accounting structure is quite flexible as long as you can output the balance sheets in the required format. My fiduciary asks for PDFs to verify the (legal) accounting norms anyway.
I'm not sure I understand what you ask about rollup, but so far I haven't found a case I couldn't fit within Ledger. For VAT, I have a flat VAT rate that only applies to my turnover so it was simple to automate (reduce turnover by x% and put that amount into Owed VAT).
> has anybody used this to do business accounting?
Keep in mind that these projects were born for personal accounting that use the cash-basis approach. Business are more complex and require an accrual approach, simplyfying we can say that they recognize revenues in a period only when these are certain, and recognize expenses related to these revenues in the same period, even if the expense occurs before or after the revenue.
You don't need to perform these steps for personal finance, you just "follow the money".
I'm enjoying plain text accounting for personal use but I struggle to see it applied in business use cases.
On one hand you can tailor your bean-counting with fancy scripts that achieve exactly what you need. On the other hand you would need to spend probably lots of time writing and maintaining those scripts. Doesn't seem worth the hassle for the vast majority IMO.
I use this. I set up Fava served over my home network so my wife can look at the budget. There is an android app called Cone that lets you add entries. I sync between phone and PC with Syncthing. It all works really well.
But I only use that for cash or other things where I don't get a receipt. For the 99% I do get a receipt, I take a photo of said receipt. Then I deal with it later at my desktop or laptop where I have a real keyboard.
I actually wrote some helper script that works on top of Dired (in Emacs) to gather things like Payee and accounts using a completing-read (narrowing) style interface. This reduces friction A LOT, which I think is one of the keys to success in any chore.
Been a beancount user since 2018, great piece of software. Gets even better if combine it with auxilliary tools like Fava for visualisation and "beancount-mode" for emacs.
Does anyone know if there's a good app I can use for plaintext accounting on my phone? I'd love to be able to use syncthing to sync the ledger on my PC and phone. It'd really help me stop collecting receipts so I can bulk put them in when I get home.
I am not editing a structured text file on my phone while out and about.
Especially due to the error-prone-ness and slowness of using mobile screen keyboards, you need guided/assisted data entry; a number pad only when you need to enter numbers or dates. A "use today's date if blank" field, selectors for accounts and tags, etc.
Yeah any text editor would be fine which is what's great about PTA but editing text on a phone isn't great. That app looks like it might be what I'm looking for so I'll have a look at that thanks
I do this. I use Cone on Android. It works great but only as an entry method. You can't edit old entries, and it doesn't run anything over the files. It just adds entries and that's it.
I couple it with Syncthing, and Fava running on a different computer served over the local network.
I would like a phone app to run on the beancount file, but the only apps that purport to do this have <1k downloads and no ratings, so I'm not going to trust them with my financial data
Personally, I have a Matrix bot written which takes a simple format like "$5 Honey Groceries" and batches them up into inputs for my ledger. That way I can tap in a new transaction on the go but still have it all recorded at home
Any married people have advice on how to track finances? I used bean count or ledger when i was single, but the manual system kind of breaks down when you have a family .
YNAB (https://www.youneedabudget.com/) was the trick for us-- while I am totally comfortable with these kind of tools or even just a spreadsheet, the app and functionality from YNAB made it accessible to my significant other. We also like the "envelope" method for budgeting, so this made it a natural fit. I recommend everyone at least try it if they're not budgeting already.
(If this is what you meant by family finances-- as others have pointed out, there's a difference between budgeting and accounting. YNAB has met all of my family's needs in the financial realm.)
I keep track of my expenses by CC and cash account, by the month. I don't care that I spent $5 on a coffee. I do care that for the month of January I stayed within my $X amount, and that for the year I'm on track for my savings goal(s), retirement, etc.
So I keep 2 spreadsheets, 1 is monthly, to ensure the bills get paid and the 2nd is my NW that tracks my retirement and savings goals.
This is what I do as well. Everytime I've looked into the whole personal finances thing, it just turns into a lot of setup work to not usefully change anything about my life, and a significant amount of ongoing work to... Also not change anything.
I think there IS a useful reason to count the pennies, if you are one that needs help staying within self-imposed spending limits. But even tracking it doesn't solve the actual problem, which is behavioural, it might help enough to be useful.
I enabled notifications on all our cards and bank accounts so whenever a transaction happens I get an email.
From there I just use gmail filters to put all of those in a folder and then wrote a script to download, parse and enter those transactions on my ledger with “Expenses:FIXME”
Once a week or so (when I have around 10-20 transactions) I import them and go through them, asking my SO if there’s any transactions I don’t know of.
Alternatively I also just make one transactions to put in an account that is fully my SO’s and one that is mine (mostly for both of our hobbies) and those I don’t track, except for the monthly deposit to those
I use hledger-flow [1]. It's an opinionated way of importing csvs into the hledger format. Works really well for me, just export the csvs, write a mapping and you are good to go.
It supports preprocessing the csvs if you need to clean the data or compute some new fields which is really powerful. Once you are up and running it only needs some minor updates each month to map unidentifiable transactions I can do this in under an hour these days.
Once you add parallelism to your transaction processing, all manner of untoward things can happen. For example, two parent processes may attempt to execute the same transaction to acquire the same resources at the same time, having failed to exchange messages to ensure their internal household state is fully synchronized. And sometimes child processes will fail to acquire permissions but silently commit transactions anyway!
This week my toddler spent $60 on a 11x14 inch canvas print of himself getting a bottle of ketchup out of the fridge. $20 was for priority shipping to ship it to our former address in a different city.
I thought the photos app was a fairly innocuous form of screen time, not realizing that it was so easy to make a purchase! No password confirmation or anything.
Fortunately support made a one-time exception and refunded the payment even though it was well past the cancellation window.
I still removed all the payment methods and addresses from our Google Pay account because I couldn't figure out any other way to guarantee that this doesn't happen again.
Frictionless payment flows do not mix well with toddlers.
I understand that concurrent edits to the ledger will become problematic. If this really is a requirement, a distributed ledger solution (cloud based tool) may be needed
Though is the root issue just communication? At some point transactions need:
1. Recorded
2. Categorized (optional, but desirable)
3. Reconciled (This can only happen as often as bank statements are issued)
With multiple spenders, communication (to answer the question "what is this transaction for?!?!") is paramount and fits naturally at the reconciliation step or more frequently if desired.
The workflow described is synchronous, centralized and simple
The entire thread was about accounting, then a sub-thread on family accounting, then you pop in to just say 'I do my accounting solo, as does my wife" which may be on-topic, but just not relevant.
But the intention of your parent was "when funds start to co-mingle or you get more complicated accounts" and saying "Don't co-mingle" doesn't help answer the question for those who do co-mingle and asked for help in this thread.
I went through the same thing. I used to use hledger. Now I use lunchmoney so my wife can use the tool. TBH I'm thinking about going back to hledger. Don't get me wrong lunchmoney is amazing but it's not as well suited to me. My wife has little interest in looking at the budget so there is not much point.
It really depends what your arrangement is. Is everything shared between you? Then you need to track all accounts. You should look into automating ingest of your accounts data. Most banks/credit cards etc. should allow some kind of statement export. If not, consider switching provider.
I would advise not to worry about petty cash. Don't get pedantic. Worry about the big things. Just make a cash account for petty cash.
If you don't share accounts then just track your stuff and set up reimbursement account(s) for your family. You'll only know the net amount you need to transfer between yourselves to square up at the end of the month or whatever you agree to do.
Me and my wife have been using EveryDollar. It's simple and pulls in transactions, which is good because I despise finance (despite being reasonably thrifty) and I'm also lazy.
I'm married and do envelope budgeting with Beancount. We share a bank account, and it's my job to update the budget every day. I manually enter all transactions, except for monthly expenses that are scripted to come out automatically. My wife just wants to look at the reports. I keep it up to date.
It's not perfect but it's the best system I've tried, including YNAB, because I get paid biweekly and YNAB forces you to budget monthly.
For my family I use ledger and a bunch of little programs I've written over the years to import data and generate reports. I've tried every other tool and system over the decades, and nothing beats PTA (and ledger, in my case).
@dang It would be nice if, like the "(2018)" or whatever put after older entries, we could put "(GPLv2)", "(MIT)", etc. after links to github.com (they have an API to get license information).
My company and I have been using Beancount since 2017 for all financial records. My company has about 60 employees and there are three individuals working in/on the financials regularly. Beancount (plaintext accounting) was the only solution that worked for us. We have many hundreds of thousands of transactions. We do both cash basis accounting (personal) and accrual accounting (company). We use Sublime Text with the Beancount plugin along with Git for version control.
In the beginning we--like virtually anyone else doing accounting--used QuickBooks. As we grew QuickBooks was less and less of a solution because of the issues we had with multi-user collaboration along with historical/rollback change tracking, e.g. knowing who made what change where and when. In other words, we started to outgrow QB. Further, there were lots of accounting needs we had where QB continued to fall short and get in the way.
We started to look around at various proprietary and open-source systems which were either locally installed or cloud hosted. Local installations came with problems surrounding collaboration and OS compatibility (Mac/Linux/Windows users) while cloud-hosted ones had issues around durability or longevity of the underlying company and sub-par data entry latency.
Further, we had additional needs including strong tracking of cost basis, alternate currencies, the concept of "lots" (FIFO/LIFO/cost averaging) of stock sales, short/long capital gain/loss, along with cost of goods sold, among other things. Finally, we wanted to get away from all paper records entirely meaning that any paper receipts would be scanned and tracked alongside the corresponding transaction which helped with collaboration because it made researching a transaction easier. (The receipt tracking we did via a customer document meta tag along with an associated ID attached to that tag residing in each transaction.)
As a software development company, we aren't afraid of a little bit of code and so the idea of a simple, plaintext accounting system with version control really appealed to us. The strongest contender that fit the model of our specific requirements was Beancount among all of the ledger-based derivatives. We've been very pleased with our results.
For our taxes, we do an HTML export of the financials using "bean-bake" and our CPA can navigate our financials without trouble. We use Fava (a Beancount web GUI) for various reports.
One place where Beancount really shines is the ability to edit multiple transactions at a time. Because it's just simple text files, you can easily use the "multiple cursors" option to make bulk edits or you can do simple search/replace. Because of Git-based checkpoints, there's no worry that we're going to break someone else while experimenting with an idea of how to express a given concept or the meaning of a set of transactions in the financial records.
That said, one place where Beancount still needs some polish is on the reporting side. Even with Fava, getting reports has never been as easy as QB. It often takes a little bit of Beancount SQL (SQL-like) querying to get the data you want. For getting loans and other things where paper-based reports are required this can require a bit of extra time.
Another weak point (at first) was for transaction import. This was soon overcome as we wrote some code that uses OFXTools to bring in all the credit card and banking transactions and to write them to the appropriate text files and then we go back through and categorize.
One last thing to mention is that, while the core business logic for Beancount is sound and far more capable than any other accounting program we have experienced, I can see how the choice of Python (or more specifically parsing of large text files with Python) can start to be problematic in terms of performance and delay. We're seeing the slowdown a little but it's not terribly inconvenient and doesn't interrupt the workflow. It's more akin to the compile time for a small application, e.g. 2+ seconds. I could see file-based checksum/caching into an internal binary/proprietary format helping quite a bit--kind of like those annoying little python .pyc files that show up when you execute Python.
The notion behind "accountants don't user erasers" is that like a blockchain, you're creating a trail of evidence. If all of the data is mutable all of the time, its evidentiary value is low (for example, the IRS gives more weight to "contemporary" evidence than to records constructed or altered after-the-fact).
Another reason to freeze, snapshot, or close your books is to not lose the support and detail behind any financial statements you've produced. Imagine getting a business loan based on your Balance Sheet and Income Statement but later being unable to reconstruct how those were produced.
Generally, accounting systems use a system of cumulative, immutable journal entries. If a mistake is made, then a reversing or adjusting entry is made.¹
There is merit to text based bookkeeping, but don't create a world that is so free form and mutable that it loses it meaning and connection with the real world.
¹ https://en.wikipedia.org/wiki/Adjusting_entries