Open Source Billing Software

Like it says on the tin, I’m an IT consultant. One of the things I need to do my job is a decent invoicing system – and, importantly, one that’s internet-friendly – I need to be able to access it from anywhere via the internet, and I need to be able to email invoices. Because of the very agile nature of a small IT consulting business, I absolutely need the ability to write one-off invoices “on the fly” as well, without depending on inventory or long look-up tables of specific parts or services.

That said, I do also offer monthly and annual service and/or hosting agreements to customers, which I have been (actually, my lovely bookkeeper has been) banging out manually each month/year/whatever until now. And some parts and services change infrequently enough that it would be nice to just pick those from a list – particularly if I can override the default pricing set if I need to. So it would be a giant plus for my invoicing application to gracefully handle recurring billing and pre-configured line items as well as one-offs.

There are quite a lot of subscription services which do this kind of thing as a hosted service, but being who I am, I much prefer to host it myself – and if at all possible, I prefer an open source solution as well. Unfortunately, while there are quite a lot of them to choose from, they’re all pretty flawed in one way or another. Listed below are the results of my search, with the one I eventually settled on listed last.

Argentum – unsuitable for me, because of how much labor you need to go through in order to create an invoice – you need to create a client, create a project for that client, then create a ticket for that project for that client… which you can then add to an “invoice” which has no details within it; it’s just a collection of “tickets” which have been marked complete. I’m sure this works for some business models, but it doesn’t work for mine.

Billwerx – unsuitable for me, because it has no support whatsoever for on-the-fly invoice items. Any item invoiced must be selected from a table of possible invoice items with preset prices; neither prices nor descriptions can be set or overridden invividually on particular invoices.

Agilebill – this is a formerly commercial and rather large product which has been open sourced. Support remaining is dubious at best, and it was too large and complicated to suit what I needed. If a large community (including developers!) ever coalesces around this as an open source project, it might look better… though still probably not so great for me, as it’s not really “agile” enough for what I do.

BambooInvoice – Usable; in fact I used it for two years. If what you want is the ability to write an invoice on-the-fly, with whatever price you feel like setting for each line item, then generate (and email) PDF invoices, and enter payments later, this will work. However, it’s got problems – it’s open source, but sort of grudgingly (the author has griped numerous times about people forking the code), it uses a “framework” that I’ve only seen one other place (CodeIgniter), the release schedule is glacial at best, and it’s missing a lot of features. The problems that finally made me get up and leave were lack of support for reports based on payments rather than invoice amounts (I actually shelled into my server to run raw SQL queries from the mysql client each year to give totals to my CPA!) and the fact that the only view you have of the invoices only shows the last [x] invoices (I forget the number – 60?) with no way to skip back further. So if an invoice disappears off the screen, you have no way of getting to it – it’s still in the database, but you can’t find it in the program. I manually changed that number to 9999, which worked well enough for me NOW with only a few hundred invoices in the db, but obviously that “solution” won’t last forever. Also, Bamboo is missing an option for recurring billing, which sucks hard if you do a lot of that. Bamboo is usable, and it looks fantastic, but there are just too many itches like this.

MyClientBase – See BambooInvoice. This program basically IS BambooInvoice, complete with the dependency on CodeIgniter, and complete with the long laundry list of essential missing features – in fact, the author is a former BambooInvoice user, who decided to roll his own competitor; the dependence on CodeIgniter makes me think it’s probably a fork to some degree or another (redacted – see comments). The missing features list is somewhat different than BambooInvoice, but it’s of a similar length. I skipped over this one pretty quickly because it was just more of the same – looks quite usable, and it’s more attractive than most of the others on this list, but it’s just missing too many basic features. It’s also missing an option for recurring billing. If you’re willing to consider BambooInvoice, you should probably also consider MyClientBase. Otherwise, keep looking.

P-Books – demo is radically broken, which made me not look for long. At all.

CitrusDB – unsuitable for me, because it has no real provision for off-the-cuff invoices. CitrusDB is a popular product, and if all you do is offer hosting or other monthly services, it will probably work well for you. But if you need the ability to sit down and bang out a single invoice for an arbitrary thing you just did or sold, it’s not going to work for you.

Black Sheep Invoices – line items are too ludicrously simple. If you ever need several lines to describe one item in an invoice (for example, running down the parts in a computer, or the exact services performed in a 10 hour block of service), this just isn’t going to work for you, because the input form does not support carriage returns and only shows 30 characters or so at a time. Show stopper for me; I didn’t look any further.

SimpleInvoices – This is what I am migrating to from BambooInvoice.
The pros: supports both off-the-cuff line items AND out-of-a-table line items, as well as allowing you to override the price on any given line item. Has reporting based on both invoice amount AND payment amount, as well as reports grouping on invoice age, individual clients, etc etc. Plain-jane PHP: no weird “framework” that it depends on that you 1. need to learn if you want to modify it and 2. have to worry about as a dependency, should that “framework” fall off the face of the earth. Supports recurring payments!

The cons: the author clearly doesn’t know much about databases; all tables are MyISAM with *no indexes at all*, resulting in very slow performance unless you fix that yourself. All the reports, invoices, etc look EXTREMELY basic to the point of “did somebody make this on a typewriter?” and the web interface is quirky enough that you will have to hunt for things fairly hard for your first hour or so using it. The author’s site is also pretty quirky and hard-to-navigate, making it more difficult than necessary to find support for bugs / report bugs / etc.

The mitigating factors: Since the code is so very simple, it’s MUCH easier to find and fix bugs yourself than would be the case for any of the above applications (it took me a ridiculously long time just to find where the variable defining the number of invoices shown on the front page was in BambooInvoice, for example). The performance issues can be solved VERY easily simply by adding a few indexes to the database tables (and, optionally, converting them to InnoDB). For that matter, the code is simple and straightforward-enough that future updates to PHP itself are much less likely to break things, making you that much less reliant on support from the author in the future.

Published by

Jim Salter

Mercenary sysadmin, open source advocate, and frotzer of the jim-jam.

7 thoughts on “Open Source Billing Software”

  1. Thanks for giving MyClientBase a shot, and I’m sorry it didn’t work out for what you were looking for. Just wanted to say that MCB is *not* a fork of bamboo. Neither code nor logic from bamboo whatsoever was used in MCB – both of which are what frustrated me with bamboo which is why I wrote MCB ground-up. Keep an eye on the project though – it is actively developed and will continue to grow. Hopefully some of those missing features you were looking for will see their way in soon!

  2. Thanks for the comment, Jesse… and “fork” question redacted. No offense intended… and, Bamboo being GPL – however “grudgingly” – no misdeed alleged! =)

  3. Man! That’s some great info you put up here. I’m using Simple Invoices and its damn slow when you get to have a 1000 invoices or payments. I’ve also made a few tweaks but got stuck with the myisam to innodb engine altering.

    I tried changing the initial page to displayed(which is reading all invoices) and failed. I’m also trying to pick up the variable for Account Total, Paid and Owing.
    Any help you can lend will be appreciated.

  4. @PM: I’d suggest that you DON’T convert from myISAM to InnoDB, as that will make any future upgrades much, much more difficult. What you really need to do is two things: one, install php-APC – on Debian or Ubuntu Linux, this is done by apt-get install php5-apc – and then add several indexes to the database, like this:

    If you’re using phpmyadmin, click your database, then click the si_invoices table from the left pane, then click the Structure tab at the top, then click “Go” next to “Create an index on [ 1 ] columns”. Then type “date” in “Index Name”, set “Index type:” to “INDEX”, and set “Field” to “date [datetime]”. (Leave the Size at its default value). Click save. Now go do the same steps for the other columns I listed in each of their tables.

    You won’t need to restart mysql or anything; once you’ve added the indexes the effect will be pretty much immediate.

    If you’d prefer to run SQL commands directly in the mysql console, enter the console and:

    USE yourdatabasename;
    CREATE INDEX date ON si_invoice (date) USING BTREE;
    CREATE INDEX customer_id ON si_invoice (customer_id) USING BTREE;
    CREATE INDEX biller_id ON si_invoice (biller_id) USING BTREE;
    CREATE INDEX total ON si_invoice_items (total) USING BTREE;

    Note that if you already have any of these indexes present for one reason or another, you’ll get a (harmless) error notifying you of that fact.

    See http://www.simpleinvoices.org/forum/discussion/1304//#Item_47 for more details. (If it isn’t obvious, I’m “jrssystemsnet” on the simpleinvoices forum.)

  5. BillWerx is what we use, even with it being a “dead” project. As far as adjusting decriptions & pricing, that is true once it is inserted into the invoice you have to recreate the item to adjust the price, but not description.

    If only it had recurring, it would be perfect for our use.

    Good information!

  6. Thank you for the good review!
    Two years later it’s still quite useful and save a lot of time.

    SimpleInvoice is exactly I looking for.

  7. I am the Author of Billwerx – Billwerx v3 does support on the fly items.
    see billwerx.com

Leave a Reply

Your email address will not be published. Required fields are marked *