By the end of our first project to migrate invoice reminders, we felt accomplished and optimistic about the future of the Wave Invoicing migration. We had real users working with an important part of our new system, and the migration engine we’d built to get them there had done its job well.

But, as with most early victories, the most difficult times were yet to come. We have many stories we could tell about our journey, but in this post we’ll describe the parts we thought would be most valuable to others attempting something similar.

Incremental Problems

As described previously, we decided…

In the last post, we introduced the extensibility problem we faced with our original Wave Invoicing system in 2018 and how difficult it was to improve it.

Our biggest obstacle was our fear of the unknown. It is extremely difficult to reason about the issues you might cause by making even a simple change to a legacy system. When faced with the prospect of rebuilding it from the ground up, this problem is much scarier.

We believed that the best way to build confidence in our ability to succeed was to approach the problem in small but challenging steps.


There is a special kind of pain that comes from working on a legacy system.

At Wave, we have many production systems that are critical to managing millions of small businesses. Some of these systems are only months old, while others date back to 2011. We’re always evolving and updating our apps to meet the needs of customers, engineers, and supporting staff.

We generally want to approach these changes in small, incremental steps. Delivering software incrementally reduces delivery risk–it makes it less likely that we’ll make mistakes that go undetected, or that we’ll build something that nobody likes. …

In the first part of this series, we looked at what continuous delivery is and why it matters. Now let’s look at how we transitioned to a continuous delivery process at Wave. Here are the different aspects we are going to cover:

  • How Wave’s delivery process has changed over time.
  • How the deployment process works at a high-level, then what the technical details are.
  • Database migrations, deployments that spans multiple systems and libraries.
  • Where we are going next.

How we made the transformation

About 6 years ago, Wave did not follow a continuous delivery (CD) process. Deployments to production occurred every 3 weeks and required…

We write software to provide a great service to our users. Product discovery, estimation of development time, development work, and testing are all part of the software development lifecycle. This article is going to focus on the final phase of software development: delivery (sometimes called deployment). In this first article of a two-part series, we are going to look specifically at continuous delivery (CD), how it differs from the traditional delivery model and who in the industry uses it. …

Emmanuel Ballerini

Senior software engineer @WaveHQ

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store