What is everyone's experience on the v4 to v5 self-hosted migration?

I’ve been a happy InvoiceNinja v4 user now for 3 years. Version 4 has been rock solid, the speed of the web app is nice and quick, the v4 mobile app is snappy and does exactly what I need and pulls data consistently from the web app, and the invoice template I’ve got is beautiful and customized exactly the way I want it.

I’m running v4.5.50 and realize it’s the latest release of v4, that it really only gets updated now if there’s something else to be added to the migration tool, and that all development is being put into v5. This of course makes total sense in order to move forward; I get that.

I love this product, but I have to admit I’m concerned about moving something that works so incredibly reliably to something where I’ve seen numerous criticisms, particularly around performance and workflow. I also have no desire to use a desktop application; I want this to be a web application first and foremost.

Some of the questions going through my mind are:

  • Is the application migration reliable enough from v4 to v5 now that you’d recommend it in production?
  • Is the UI fast enough, and if not, should I be switching to React?
  • If React is what “saves v5”, will it eventually become the only Web UI available, phasing out Flutter completely?
  • I currently use the “Bold” invoice template in v4, with some customizations to the template (all performed within the InvoiceNinja /settings/customize_design page, not externally). Does this carry over to v5?
  • I currently don’t use the email functions of InvoiceNinja, and therefore, don’t have an email server configured in the application. According to the upgrade notes, it sends an email once the migration is complete. Is there another way to tell the migration has finished besides an email? If it can’t send an email, will the migration fail? Is the email setup a hard requirement?
  • Speaking of email settings, while using the v5 demo from InvoiceNinja’s servers, the System Settings page is totally gone, and that’s where I’d configure the email settings in v4. Is that intentionally missing?

So, with that being said, how has everyone’s experience been on v5, both in usability, and in self-hosted migrating from v4 to v5? After watching v5 for a couple years now, I’m trying to decide if it’s safe for me to take the plunge, or if I should keep waiting a little longer to have a stable product and an optimal experience. I realize that a lot of the time, these forums will only have the bad experiences because it’s filled with people trying to solve problems. I want to hear from people who are using v5 successfully after coming from v4.


When we initially released v5 (around two years ago) it was in a very early state of development which frustrated some people coming from v4, v5 is now much further along in development and has many more features than v4.

  • We believe the migration is now stable for production use, if you run into any problems we’ll of course help.
  • You can try the v5 demo here to check its speed: https://demo.invoiceninja.com
  • Our plan is to use React for web and Flutter for desktop and mobile, we aren’t planning on phasing out Flutter.
  • v5 uses HTML/CSS for the invoice designs so you’ll need to reapply any changes.
  • @david can you please advise?
  • In v5 you can configure the SMTP credential in the .env file.

Also worth noting Forbes (among others) have included the new v5 app as one of the best platforms available:

As @hillel says the migration should be mostly pain free, if there are additional changes you need with the designs please reach out, we are happy to help get you over to v5 and invoicing as pain free as possible so we are always very happy to help.

I would STRONGLY suggest you fully test your entire workflow using v5 and ensure that you prefer it over v4 (do this several times) … while the feature set may be more developed now, the interface itself is quite different in terms of usability (and also significantly slower if using WebUI).

I’ve got a company (self-hosted) working with 1x pool of agents under 2x separate entities… they are all very happy with v4 (and been using for many years now); we moved 1x of their entities to v5, and there are a lot of design choices in v5 that they were not happy with. As such, we kept their main company on v4 (they did not want to move), and left the 2nd entity on v5… in hopes that v5 would continue to improve, and see if v5 would grow on them as they became more experienced (it hasn’t). Today, they are simultaneously using v4 and v5, and will continue to do so until the day that v4 breaks/dies.

This is all just to say: test, test, test… and then test some more!

@theshniz have you tried the new React web app? It’s designed to be extremely similar to the v4 web app.

React Demo: Invoice Ninja

Yes I have, it is coming along, and significantly better than Flutter in terms of speed. While the interface is more similar to v4, it suffers from the same over-arching issues as Flutter in v5.

Biggest complaint = Live Preview of Invoices/Quotes/etc … this drives the agents bonkers, in that they are unable to print from it as they could in v4 (invoice numbers are not listed); and, small changes - such as changing the design from ‘pretty’ (for the customer) to ‘clean’ (for printing) does not cause the View PDF to actually re-generate during a save (and there is no way to manually force).

I haven’t tested React in a while, but other nuisances (from memory)…

1.) No way to ‘trust the device’ via 2-Factor (so users disable 2FA)
2.) Website of ‘www.whatever.com’ translates to https://subdomain.mydomain.com/clients/www.whatever.com (as opposed to https://www.whatever.com )
3.) Need to be able to hide the website field from the Customer Portal, as they use the link for in-house documentation on MediaWiki
4.) Email address copy to clipboard, instead of mailto:
5.) Purchase White Label is fine for the admin, but why pushing Unlock Pro to all users; also, the constant nagging to upgrade to latest version of Invoice Ninja (nice that updates are frequent, but no way to disable notifications)
6.) Formatting issues for Microsoft Outlook recipients, and I have to modify client.blade.php every time I upgrade them.

1 Like

Thanks for the detailed feedback! If you find any more issues please let us know.

cc @david @ben


Thanks for the feedback, I’ve added some of these items to the React backlog.

In regards to the Microsoft Outlook formatting, can you provide more information on this? I made some large changes around this that should have provided better support for the Outlook client. Certainly very interested to see what changes are being made to improve this.

Thanks very much @david and @hillel . I’ve submitted emails this evening to support. I’m on my 11th installation attempt of v5 and keep coming across an issue where all of my invoices I migrated over show up for a moment, and then the number drops to 277 invoices. I should have over 1000, but I’m consistently seeing only 277. They’re all in the database, so something seems to be tripping over something on the web side. I’ll wait for support.


Are the bulk of these invoices older than 3 years? The app only loads the first 3 years worth of data to improve load times. You can load all data in Settings > User Settings and enable all data for the time span.

Ah thanks @david , that did it! What was throwing me off was this was kicking in at different times, and I never changed it to a value other than the default of 3 before. Maybe it was dependent on when a certain job ran in the background or refresh of the page occurred.

I see the max is 10 years. Can an “all” option be added at the end?

Here’s a couple other things I’ve noticed in v5 so far:

  • From the Clients screen, to edit a client, I need to click the client, and then click the edit button. It would be great if on the 3 dots menu on each client, “Edit” was an option to avoid that extra click each time.
  • I have a client with 2 contacts. I put them in as separate contacts because they each have a different phone number. However, they both use the same email address (shared address between the two of them). In v4, this wasn’t a problem, but when I went to edit a different value for this same client in v5, I can’t save it because v5 doesn’t allow two contacts with the same email address (it imported with this just fine). I’m not entirely sure why, as it seems perfectly reasonable to me for a client to have two contacts with different phone numbers but the same email address (such as both responding to info@example.com, but having two different phone numbers), or vice versa; two contacts with different email addresses but the same 1-800 phone number. For now, I’ve had to remove one of the email address entries in order to save the other changes I’d made to the client.


  1. On the data table there is an edit icon next to the three dots. Maybe you’re using the list view? There’s a toggle at the bottom of the screen.
  2. @david thoughts on supporting this?

@hillel Ah, you’re right. That’s interesting. If I click Clients, and at the bottom click “Show List”, then click the 3 dots next to a client, I see Edit at the top of the list. If I then click “Show Table” at the bottom, then click the 3 dots next to a client, Edit is missing. This seems inconsistent, as every other option is there in both views except Edit; Edit should be there in both places I’d imagine.

Agreed, we’ll include the change in an upcoming release.

Awesome thanks! FYI @hillel , this isn’t limited to the Clients page. Just checked the Invoices, Payments, and Products page; they’re all the exact same. Edit is only there in one of the views.

Also @hillel and @david , I noticed that the table view isn’t responsive to the size of the window at all, at least not in Firefox. In v4, the list of Invoices, clients, etc. was fully responsive. In v5, it appears to be static width with a bunch of white space on the right side of the screen. If I switch to List view with the side details pane always showing, it’s responsive. Ideally, it would be great if both views were responsive. But maybe this is something that’s coming in the React app.

This is supported in the React app, it’s possible we’ll be able to support it in the future in the Flutter.

All good; I don’t mind waiting for the React app to become the main web app. I can work with this in the non responsive layout in the mean time, just wanted to mention it.

I looked into the issue above with ‘Edit’ being missing from the dropdown when in table mode. The reason is in table mode the app shows a dedicated edit button next to the 3 dots button.

@hillel Got it, I see that. I’m still convinced the Edit button could be in the 3 dots menu in both table and list view for consistency.

I use the table view. In table view, I also click the X on the right side details pane when viewing the invoice list so I can see the whole fixed width. In this view, I’ve instinctively clicked the dots next to the Invoice I want to edit multiple times and not had an edit button:

To get the edit button, I need to click the invoice, and then the sidebar appears, and then I can click Edit there, which works if the user has the side pane open.

I could understand that being a design decision, until I click List view. Here, we see that even though the details pane is permanently fixed to the right side, the Edit button also exists nicely in the menu bar. I’ve taken another screenshot here of the right side details pane 3 dot menu and overlayed it on top of my first screenshot. You can see that in the details pane, the dedicated Edit button exists, and the Edit option isn’t in the right click menu. But over on the main portion of the page, clicking the 3 dots on the left of each invoice (or payment, or quote, or client etc.) shows the Edit button. For this reason, I’m convinced that the same menu that’s in use on the left (containing the Edit button) could be used in both table and list view.