Personal Finance Management Software

Recently (August, 2010), I’ve been developing a Personal Finance Manager package for managing our household budget, checkbook, credit cards, etc.

This has actually evolved into a nice little package. It uses JQuery, DataTables, AJAX, Data Access Objects, PHP and MySQL. It runs under the Apache web server, which is nice because you can run it on a web server and both you and your wife or husband can post transactions, reconcile bank statements and run reports.

Since it is a web-based application, you do need a web server to run it. So it’s not for the faint of heart.

I’ve actually been able to re-use this package as a generic web application development framework as well.

The project uses phpdaogen to generate the Data Access Objects from the MySQL schema. Phpdaogen is a project I developed specifically for use in my Personal Finance Manager application, because I didn’t like the licenses for any of the other DAO packages I found. Phpdaogen also includes a PreparedStatement implementation for MySQL under PHP without using mysqli (which is buggy and tends to crash).

The package requires the json PECL module to be installed. Under Red Hat/Fedora/CentOS, this requires that you install the php-json package.

One really cool thing about the package is that all form submissions and page updates are done through AJAX, so there is no need for page reloads. This makes the application very snappy and responsive.

The Personal Finance Manager package is licensed under the BSD license, so you can basically use or adapt it for free, even for commercial use.

You can download it here: Personal Finance Manager

I’m available for consultation, customization and training at a reasonable rate. Use the “Contact Us” form to send me an inquiry.

44 thoughts on “Personal Finance Management Software”

    1. Feel free! I released the whole thing under BSD license, so you can do pretty much anything you want with it that the license allows, as long as you give attribution and don’t claim that you wrote it.

  1. Hello, can you please send me the latest version of your package by email because for some reason I cannot download it.

    Could you, please tell me what would be your rate for support issues?
    Please, write to me to the above mentioned mail.


    1. Yes, it does. With the latest version from the SourceForge project page you can import your bank statement in CSV format, for reconciliation purposes. Currently it supports the CSV format provided by Wells Fargo. It will automatically match up the transactions in the CSV statement, highlighting any mismatches or multiple matches. You can then correct the problems, click the Reconcile button, and it will reconcile your bank statement.

  2. Looks really great. Can you assign categories to transactions? I don’t see it in the screenshots. I’ll have to download it and give it a whirl.

    1. Yes. The categories are called “Income/Expense”. So you can get reports of your incomes and expenses by categorizing your transactions using the Income/Expense categories.

  3. Hi,

    I create new user in myPHP Admin
    User: pfm
    Password: 123pFm321

    And now, I got the login page! But after type “admin” on all username and password, I got below massage. Please help…

    Fatal error: Uncaught exception ‘Exception’ with message ‘MySQL Error 1146 Table ‘pfm.pfmUser’ doesn’t exist page: /pfmgr/html/index.php’ in /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/MySQLConnection.class.php:105 Stack trace: #0 /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php(294): MySQLConnection->executeQuery(Object(PreparedStatement)) #1 /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php(132): PfmUserDAOAbstract->findWithPreparedStatement(Object(PreparedStatement)) #2 /mnt/disk1/HTTPX/htdocs/pfmgr/html/include/requireLogin.include.php(78): PfmUserDAOAbstract->findByUserName(‘admin’) #3 /mnt/disk1/HTTPX/htdocs/pfmgr/html/index.php(7): include(‘/mnt/disk1/HTTP…’) #4 {main} thrown in /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/MySQLConnection.class.php on line 105

    1. You’ll have to follow the instructions in INSTALL.txt in order to get it running. There really are no shortcuts.

      If you read my previous post, there’s a database schema management system built into the JAX Framework on which pfmgr is built.

  4. Is it possible to get an exported empty mysql database (.sql) so that I can setup and try this software. I am a windows user running a wamp server. Thanks

    1. First, you’d need to run the “create database” and “grant” commands found in ddl/initdb under the mysql case.

      After that, you’d have to run this command to get the initial SQL required to get the database built out: php phpdaogen/ddltosql.php ddl/*.ddl.yaml

      However, be aware that you would be DEFEATING the automatic schema update mechanism of the JAX Framework (pfmgr is written on top of an old version of JAX Framework) [ ]. So when you update pfmgr in the future, your database schema will be out of date and incompatible with the new version. The ddl/updateSchema script is provided in order to bring the database schema into line with the schema files in the current version of pfmgr.

      Honestly, I don’t recommend going this route. With freely available desktop virtualization solutions like VirtualBox and VMWare, plus freely available Linux server distros like CentOS and Ubuntu Server, there’s no excuse for using WAMP, XAMPP or other substandard LAMP environments which don’t have proper Linux shell and PHP command-line functionality. Just download VirtualBox and CentOS and set up a CentOS virtual server that runs in a window on your desktop. Then install pfmgr into the CentOS virtual server using the instructions in INSTALL.txt. Done.

  5. I just installed the software on my web server. and I used the phpadmin to create database and user. I’m getting the same error what scorch was getting. I really dont know where and how to run the initdb command to run the database commands. I’m hosting my website on a server that allows php and sql extensions. Please help. I can’t use the default schema as my webserver will put a prefix on every database name i create.

    1. If you don’t have shell access to your server, there’s not much you can do. Nor would you want to, because it would defeat the automatic schema updates when you upgrade to a newer release of the PFMgr project.

      The JAX framework on which the PFMgr was built, was designed to manage the database schema for you, including automatic updates to the database schema as new releases of the project come out. But in order to do this, it requires that you have Linux command-line access in order to run the initdb script at the initial installation, and the updateSchema script when upgrading to a newer version of the PFMgr project.

      Some future version of the JAX framework may provide a web-based way to do the schema creation and updates (I’m also the author and maintainer of the JAX framework). Maybe something along the lines of how WordPress and other CMS systems do it. But for now, it’s strictly Linux command line.

      One thing you can do, which works quite well actually, is to set up a CentOS Linux instance running inside VirtualBox on your desktop. Then just run the PFMgr package inside that.

  6. Can you design a web based finance software that is multi user with role base access?? I need something that is web based? I’m willing to pay for the effort and time.

    1. The pfmgr project is already web-based and multi-user with role-based access. Feel free to try it out. It only runs on Linux though, so if you’re a Windows fan, I’d recommend installing a Linux VM under VirtualBox or VMWare.

  7. hello
    can you add simple inventory tracking ?
    also can you add simple invoice so we can sell goods and services
    the script has muli user access so it is ready to be simple smart accounting software

    best regards
    Natural Honey

    1. Thanks for your question.

      Actually, the Personal Finance Manager project is only intended to be a checkbook reconciliation and spending tracking package. Inventory Control, Purchasing, Sales and Invoicing, Accounts Receivable, Accounts Payable, General Ledger would be part of a larger Enterprise Resource Management (ERP) package.

      I’ve been developing ERP software professionally since 1987. I do have a new ERP package which is built on the same framework, but it is proprietary and requires a monthly support contract. If you’re interested, contact me at hostmaster at roncemer dot com, and I’ll show you a demo. If you would like to become a customer, the package should be available for new customers within about three months. We are beta testing it at some sites now.

  8. Hi Ron,
    I’m not able to make your app working!
    I’m using a virtualbox debian installation. Followed instruction in INSTALL.txt, but I get following error when I try to create new users:

    [Fri Jun 06 17:06:41 2014] [error] [client] PHP Notice: Undefined property: stdClass::$keepMeLoggedInUniqueId in /home/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php on line 35, referer:
    [Fri Jun 06 17:06:41 2014] [error] [client] PHP Notice: Undefined property: stdClass::$keepMeLoggedInExpires in /home/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php on line 36, referer:
    [Fri Jun 06 17:06:41 2014] [error] [client] PHP Fatal error: Uncaught exception ‘Exception’ with message ‘MySQL Error 1048 Column ‘keepMeLoggedInUniqueId’ cannot be null page: /pfmgr/user.php’ in /home/pfmgr/html/classes/dao/MySQLConnection.class.php:60\nStack trace:\n#0 /home/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php(39): MySQLConnection->executeUpdate(Object(PreparedStatement))\n#1 /home/pfmgr/html/user.php(261): PfmUserDAOAbstract->insert(Object(stdClass))\n#2 {main}\n thrown in /home/pfmgr/html/classes/dao/MySQLConnection.class.php on line 60, referer:

    Can you help me with this?

  9. Hi Ron

    I have installed PFM and all seems to be working fine except for adding a new user. It seems to be crashing in user.php. Is there an easy way to debug?

    Many thanks

    1. Tail Apache’s error log, and send me the error message. This project was written on top of an old version of JAX Framework, and there have been a lot of changes to JAX Framework since it was developed. If I get some free time in the future, I may go ahead and re-write the pfmgr project on top of the latest JAX Framework. But I don’t have a lot of free time on my hands at present.

      1. Hi Ron, I am planning on doing some bug fixes, a couple of added features, and extend/improve the reporting.
        Would it be better to start with an updated JAX framework first?
        Have you started updating PFM to the new framework yet?
        Any idea how much work is involved in updating PFM to the new framework? Perhaps I can have a go at that.
        I am a user on Sourceforge and GitHub so would be happy to give back my mods and fixes.
        You have my email address so feel free to email me.
        Cheers, Graham

        1. Hi, Graham.

          I have not done any work on re-doing the PFM project in the latest JAX framework. I’ve been super-busy for the past few years with my ProfitEagle ERP project and my day job, both of which use the JAX framework. I stopped using PFM a few years ago when we were spending most of our time in Southeast Asia.

          I would love to see someone take up the project and do a version 2.0 which is built 100% on top of the latest JAX framework, taking advantage of the code generators, help system, and other features of the framework. I’d also like to see the camelCase table and column names be replaced with all-lowercase names, with underscores separating the words in the column names. The camelCase identifiers were a show-stopper when it came to porting to postgresql and other database engines which don’t preserve the case in identifiers. And I didn’t realize this until after PFM was completed.

          JAX Framework grew out of PFM, and now PFM itself has gotten left behind.

          So…If you’d like to take over PFM, port it to the latest JAX framework, and convert the SQL identifiers to all lowercase, I’d love to have the help with it. I just don’t have time to play around with it lately. Send me a message on GitHub, and I’ll add you as a project admin.


          1. Perhaps it would be best for you to load PFM onto github first so I can use the issue system to request access. PFM is on Sourceforge only at the moment (I could not see it in your repo list).

          2. Hi Graham,

            I’ve created a new pfmgr2 project under GitHub, and added you as a collaborator.

            I took the base JAX Framework project, added in the schema for the old pfmgr tables, changing the camelCase names to all lowercase with underscores between words in the column names.

            I also generated initial search/CRUD code-generator YAML files for these tables, so you’ll have a good starting point.

            As far as I can remember, all you need to do to get pfmgr2 working, is to bring in any custom logic which was coded in the original pfmgr, adapting the table and column names to match what they are in pfmgr2.

            Under posting type CRUD, you’ll need to provide a way to assign each posting type to multiple account types. There’s already a many-many relation table for that. Just look at the old project to see how I did it, and you can either replicate that, or use the new jax-grid which uses AngularJS to implement an editable table for creating one-many relations.

            Under postings, you’ll need to be able to assign income/expense amounts for the disbursements for each posting, with the total of the disbursements matching the amount of the posting.

            For the most part, the project will just consist of bringing in code from the old project, and changing the old names to match the new.

            Good luck, and keep me posted. My email address: ron at roncemer dot com.


    1. This is a Linux application. I’d recommend running it on a Linux box, or if needed, you can create a Linux VM instance under VirtualBox.

  10. Hi,
    Looking at config/database.ini.sample, it looks like it is possible to use Postgresql database instead of Mysql. But when I run ddl/regenDAO, I get the following error message :
    “PHP Fatal error: Class ‘mysqli’ not found in /opt/pfmgr/phpdaogen/MySQLiConnection.class.php on line 34”
    Do you have any idea what to do ?

    Thanks for your help

    1. PostgreSQL support is completely untested. The probability of it working flawlessly is near zero.

      Sounds as if you’re configured to use the mysqli PHP extension. In that case, you need to make sure that either the mysqli or mysqlnd PHP extension is installed. Once you have that, you should be in good shape.

  11. Finally, I found the error : I changed the password for user pfm in file /config/database.ini after running the ddl/initdb, thus the password in file /html/classes/ConnectionFactory.class.php was wrongly set.
    Now I will start to use the application.

  12. Hi!
    I have a problem. I installed and configured (I hope) already, but when I would like to access in a browser it has a blank white screen. A page source is empty.
    What do you think? thanks for your answer!

    1. I recommend checking the apache error log. Something like /var/log/httpd/error_log (RHEL) or /var/log/apache2/error.log (Debian/Ubuntu). Usually when that happens, it’s due to one of the required PEAR or PECL modules not being installed.

  13. Hey! Like the application, however I’m having some trouble getting it to function on my server, I have followed all instructions included but I’m getting the following errors:

    Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] PHP Warning: mysqli::mysqli(): (28000/1045): Access denied for user ‘pfm’@’localhost’ (using password: YES) in /home/********/public_html/finance/html/classes/dao/MySQLiConnection.class.php on line 34
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] PHP Fatal error: Uncaught exception ‘Exception’ with message ‘Database connection failed; errno 1045 – Access denied for user ‘pfm’@’localhost’ (using password: YES)’ in /home/********/public_html/finance/html/classes/dao/MySQLiConnection.class.php:38
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] Stack trace:
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #0 /home/********/public_html/finance/html/classes/ConnectionFactory.class.php(15): MySQLiConnection->MySQLiConnection(‘localhost’, ‘pfm’, ‘123pFm321’, ‘pfm’)
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #1 /home/********/public_html/finance/html/include/requireLogin.include.php(47): ConnectionFactory::getConnection()
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #2 /home/********/public_html/finance/html/index.php(7): include(‘/home/fluffyfil…’)
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #3 {main}
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] thrown in /home/********/public_html/finance/html/classes/dao/MySQLiConnection.class.php on line 38

    It appears to be seeing the default database login details, even though I’ve updated the .ini file & run the initdb & regenDAO commands.

    Any tips?

    Thanks 🙂

    1. Make sure you copy database.ini.sample to database.ini, and edit database.ini, not database.ini.sample. Also, if you’re on a hosted MySQL instance, you may not have all of the permissions you need. If that’s the case, I’d recommend checking with the hosting company.

  14. Hi,
    This tool is really great. I installed it on my server (Ubuntu 10.04) and I can now access my personal finance from any internet point.
    I just have one problem with the reports :
    I have 4 accounts and when I run the 2 reports (Posting details or Income/Expenses) and select all the accounts, it does not work.
    When I select only the first account, it works well.
    When I select only the second, the third or the fourth account, it does not work either.
    Do you know how to solve this issue ?
    Thanks for your support

  15. Hi,
    I am working through the install instructions on my vps and have come to the following error when entering in: ddl/regenDAO

    PHP Fatal error: Class ‘mysqli’ not found in /pfmgr/phpdaogen/MYSQLiConnection.class.php on line 34

    I’m using centos, any suggestions?


  16. Have a nice day,
    installed pfmgr to debian works fine, the only issue had to do with mysql . Mysql saves greek characters as chinese, even thought pfmgr shows them as they are greek. So when I export pfm database for backup greek letters cannot be seen. I while search about it.

    Thank you

    1. You’ll want to make sure the tables are using one of the case-insensitive utf8 character encodings. Probalbly either utf8_general_ci or utf8_unicode_ci.

Leave a Reply

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