Airspace is a logistics company that delivers shipments faster than humanly possible with the help of our cutting-edge technology. This ecosystem of software supports our customers and our operations team from the point of order creation and quoting, all the way through final delivery. Because logistics never sleeps, our amazing operations team is available around the clock to assist our customers and Airspace Commanders.
One of the many time-critical things we deliver is human organs, so one service failure is too many. To ensure the team is able to provide optimum customer service, we must be sufficiently staffed around the clock while each team member works a reasonable and consistent schedule.
This post will walk through how we balance the operations team supply against our customer demand, while optimizing the cost of operations and prioritizing our team members’ wellbeing.
Supply and demand balance
The problem of creating a perfect staffing schedule is not new. Companies need to keep enough staff on shift to help every single customer with minimal queuing, while minimizing the amount of overstaffing and excess resources. If we understaff, we increase our chances of failed shipments and unsatisfied customers. On the other hand, overstaffing is very expensive and leads to idle team members. The answer is to find the optimal equilibrium not just in terms of the overall team size, but also the perfect staffing at every hour of every day.
At Airspace we also strive to have all of our specialists employed full-time with shifts that allow for a great work-life balance. Having a well-rested and satisfied team is not only important from a human perspective, but also provides the specialists with more motivation to excel at their job and continue to work at Airspace long-term. Our operators have personal connections with many of the customers they interact with every day, and long-term team membership comes with both a greater overall customer experience and a personal badge of honor at Airspace.
A perfect supply-demand equilibrium means that our supply of operational specialists matches the demand for their work at every hour of the week.
As a growing startup, we still have a relatively small operations team, which means we do not have the flexibility that is required to use many of the open-source or enterprise scheduling solutions. In the beginning, we relied on a primitive demand calculator and a manual scheduling implementation. While it is possible to do a lot of semi-manual scheduling and move around shifts for a team of just a few specialists, this became unmanageable as we grew.
Quantifying the demand
So there we were, too big for a manual solution, too small for an enterprise solution, and adamant about getting the best schedules possible for our team members and overall success. Luckily, we are a tech company, and we love a good optimization challenge!
We began by reconsidering how our demand is calculated. All the data to know the demand was already there, we just needed to put it together. We started by assigning a value, in minutes, to each action a specialist could take. From data and experience, we know that, for example, checking in with an airline takes 3 minutes, and modifying an order’s pickup details takes 2 minutes. Based on these operational “touches” we can calculate the average specialist-hour demand for every 30-minute block throughout the week.
The two data sources - “touches and phone-minutes”, averaged over a week, smoothed using a Savitzky-Golay filter and summed to represent the overall demand representing the demand for the specialists’ time.
The next critical component in accurately measuring demand was switching Airspace’s phone system to Twilio. This update gave us amazing insight into how our specialists were using our phone system, which allowed us to track queue minutes and minutes spent on the phone for each 30-minute interval throughout the day. Our data engineering team made both datasets easily accessible in our Snowflake data warehouse. Combining the “touches” and the phone-minutes allowed us to get a robust approximation of our operational staffing demand.
After calculating the demand, we can optimize the operations team schedule to adequately supply specialists while minimizing overstaffing.
- Initially, we thought that to maximize the goodness of fit we need to use each 8.5-hour shift as an individual building block for the scheduler. Hence we approached it as a two-step optimization.
- Create a pool of shifts optimizing their fit to the demand combine shifts into workweeks for each specialist, optimizing the schedule consistency
However, even the best optimizations are inherently only able to approach, but not guaranteed to reach, the desired state. The two-step approach often left us with an insufficient number of shifts to fill a 5-day workweek, making us regroup and move shifts. An optimization that scheduled specialists at unrealistic shifts was unacceptable. Ultimately, we combined the two steps into one: optimize for the best fit to the demand, with a constraint of each staff member having a consistent workweek. The big step that allowed us to implement this approach was shifting from shifts starting all over the clock to fixed start times.
For clarity, consistency, transparency, and the ability to version control, we moved to a scheduling implementation in Python.
First, we define the scheduling constraints. A shift can start at 3 am, 6 am, 10 am, 2 pm 6 pm, or 10 pm. Each shift is 8 hours long with a 30 minute lunch break, so a specialist who starts at 10 am will end at 6:30 pm. The nights are covered by our more experienced specialists, as those tend to be trickier hours: fewer managers are available to help, and the orders are more difficult to dispatch. These night shifts are hardcoded at the start of the optimization, and the scheduler builds workweeks on top of them. An additional constraint is to ensure all workweeks have a weekend (i.e., two days off in a row) - this means we have 7 possible combinations of 5 working days of week. With 6 shift start times, there are 42 different options for workweeks. We think of them as “tetris pieces” which could be used to build up the supply.
Here are all the 42 possible “Tetris-pieces” - combinations or work-weeks that have shifts starting at fixed hours (3 am, 6 am, 10 am, 2 pm, 6 pm, or 10 pm) and comply with the ‘2-days-off’ constraint.
Now instead of adding individual shifts, we add a workweek that by definition has consistent start hours. We start with an empty schedule, add all the hardcoded shifts for the overnight specialists, and then fill it up with combinations of complying workweeks. At each step, we find the largest disparity between the currently covered hours and the demand. At Airspace, Tuesdays at around 10:30 am tend to have the highest operational demand. To cover it, the schedule picks the closest acceptable start-time, which is 10 am. We try every single “Tetris piece” that has the Tuesday 10 am start in it - in this case there are 5 pieces to try. We chose the one that creates the best fit for the demand, penalizing understaffing times more than overstaffing . Then we move onto the next biggest discrepancy. We keep iterating until every operations specialist has a schedule and there is nearly complete coverage over the entire demand.
This is the final fit of the scheduled supply to the demand. We prefer a slight oversupply of specialists during most hours. Occasional undersupply, like the one seen on Saturday night is easy to cover with a flex shift. While sharp peaks might seem concerning - they actually represent 30-minute schedule overlap, which is very helpful for the shift handover. These overlaps are achieved by carefully selecting the times of shift starts.
This new approach worked so well for Airspace! It was easy to implement in Python and resulted in consistent start times, while satisfying our scheduling constraints and covering the demand just as well as the initial two-step optimization approach we tried.
Now it was easy to build additional capabilities on top of the initial implementation. Here are some of the features that were built after the team started understanding the full capabilities of our new system:
- Find the best hours for flex shifts. If demand is not fully covered, it could be more efficient to add short stop-gap-shifts without the need to add additional specialists full-time. These short shifts could be covered by supervisors, specialists desiring to work overtime, or trained members of other teams.
- Schedule different customer verticals separately. We can cover the demand not just for the entire company, but separately for each vertical (examples are healthcare and freight), allowing each area of our business to be handled by a specialist with the most training in that area.
- In the future, we can consider switching between scheduling for 4 ten-hour and 5 eight-hour shifts. This way, the operations management could have a data-driven decision on what type of schedules work best.
- Customize the efficiency a specialist can deliver based on their work experience. A brand new member who is still in training might not yet work as quickly as a very experienced specialist, and we can add the experience level to the scheduler to account how much each contributes to the supply.
- Adjust future demand by the projected growth. Scheduling is something that is done proactively. Since we are a rapidly growing company, we have significant month-over-month growth and the current demand has to be adjusted to represent the expected demand in the future.
The scheduler was very positively received by both management and the operations team. Management is now able to create schedules that are a close fit to the demand and provide consistent, reasonable workweeks to the team (all in under half an hour!). This project allowed us to go from an inaccurate, cumbersome, manual, archaic system that resulted in poor fit and inconvenient schedules, to a much more transparent, efficient, and flexible way of scheduling that can be done in minutes. Overall, the schedule satisfaction among the team went from 20 percent prior to the new scheduler to a whopping 90 percent. We estimate that a better fit has 12 percent less undersupply and 17 percent less oversupply - proving that our optimization efforts paid off.
When compared side-to-side, the new schedules are vastly superior. Previously, a specialist could start their shift at noon, finish at 9 pm and be required to show up at 8 am the next day. With an hour long commute, they would have only 9 hours at home - definitely not a balanced life.
Graphs created by Ellina Lapina