Optimal Delivery Scheduling: API vs Web App

Optimal delivery scheduling. Image by PublicDomainPictures from Pixabay

Implementing optimized delivery schedules is a cheap, effective way to lower costs and improve efficiency, from the warehouse to the customer.

Using a high quality delivery route planner not only drives down operating costs, it also provides a host of hidden benefits that can save a lot of planning and logistics manpower.

While humans are typically quite adept at balancing vehicle capacity limitations (i.e. you can't deliver more than a vehicle can carry) with optimal routes (i.e. the lowest cost routes for each vehicle in the fleet), modern logistics, delivery and supply companies have simply outstripped our ability to efficiently plan deliveries.

Route optimization software is readily available to plan efficient routes, but it's a little harder to find delivery scheduling software that does both - optimize delivery routes while optimizing vehicle packing in line with the fleet's capacity constraints.

Let's take a quick peek at the benefits of optimizing delivery schedules before discussing two common ways to integrate it into your existing business.

Benefits of Optimized Delivery Schedules

Over and above the obvious benefit of lowering the amount of distance travelled per vehicle as well as the amount of time spent on the road, optimizing the way your business plans deliveries has a bunch of upstream and downstream benefits.

1. Reduce Planning Hours

Planning a delivery schedule for anything but the smallest company is quite a headache. Highly paid employees can spend hours turning a set of deliveries, like this:

 Cost based route optimization problem

into an optimized delivery schedule:

Optimized vehicle routing solution

Those highly paid hours can be compressed into under a minute (with far superior results) using a vehicle routing system that caters for deliveries and pickups.

2. Improve Warehouse Efficiency

After spending seconds (instead of hours) optimizing a delivery schedule, the routes of each vehicle in the fleet has been determined, along with an ordered list of the deliveries (or pickups) they must fulfil. This can be shared with the depot/warehouse manager with the click of a button in the form of a packing manifest.

3. Improve Customer Service

Customers and clients will thank you for having the ability to know with certainty (barring force majeur events) where and when each vehicle in your fleet will be at any time during the delivery schedule period. Instead of communicating something vague, like "your parcel will arrive on Tuesday", you can say "we'll be there at 3:30pm on Monday".

4. Utilize Your Fleet More Efficiently

Optergon was approached by a large delivery company to help them decide the most efficient way to expand their fleet in order to meet the growing demands on their business. As it turns out, using optimized delivery routes meant that the existing fleet was not only sufficient, it was too large. They were able to put expensive expansion plans on hold, lower existing costs and still have plenty of room for growth.

5. Understand Business Limitations

Looking at a delivery planning problem like the one we saw above:

 Cost based route optimization problem

has a hidden problem for human planners (using basic route optimization software).

How do you know if it is even possible to fulfil all the orders with the resources at your disposal?

It may take hours of planning to come to the conclusion that it is not possible to make all the deliveries in one go. This exercise is expensive (paid labor) and potentially incorrect.

By contrast, an optimized delivery schedule can do a better job of delegating vehicles more efficiently in a fraction of the time. This gives you the ability to react to potential shortfalls quickly, ensuring better performance and service.

6. Instant ROI (Return On Investment)

Delivery planning systems tend to be billed on a per vehicle per month basis. This means that your business benefits from an entire month of drastically improved efficiency before making payment.

A quick mental exercise can demonstrate this quite well. Think about how much your average driver is paid per hour. Since pricing for a good system starts at around $10 per vehicle per hour, it's easy to work out how much a delivery planning system must save (in terms of driver time on the road) to make the exercise profitable. That's not even counting the reduction in fuel costs, wear and tear, insurance, and so on.

It only requires savings in the order of a fraction of a percent to make route optimization & delivery planning integration instantly financially viable.

Implementing Optimized Delivery Scheduling

Given the complexity associated with route optimizations and delivery scheduling, it may come as a surprise that it only takes a few minutes to get up and running. You have two options:

  1. Delivery Planning Web App
  2. Delivery Panning API

Each comes with its own set of pros and cons. In general, integrating with an API takes a bit longer and requires some development skills. The advantage is that optimized routes and delivery schedules can then be integrated directly into existing systems. This is far more flexible and powerful because you are in charge of how optimized delivery schedules are presented and distributed to all role-players.

By contrast, using a Web app has the great advantage of being super quick and easy to get started. Web apps will offer a range of features designed to help share results within your organization but this will never be as seamless as your own integration. If seamless integration is not a vital factor, using Web based delivery planning might be the way to go.

Get a whole month of free delivery planning and route optimization for a fleet of 5 vehicles and up to 100 locations per day by creating a free Optergon account.

Check out a quick tour of how an online delivery planning system works. Essentially, all you need to do is add vehicles, configured to match your real world fleet, plus delivery locations, including any capacities and constraints, to a delivery schedule before clicking Optimize. Simple as that.

Delivery Planning API

With only the minimum of API development skills required, it is possible to build cutting-edge route optimization and delivery scheduling goodness directly into your business.

To keep things short and sweet, here's a sample JSON API request for a simple schedule with a single vehicle and five locations from Optergon's route optimization API:

{
  "job":{
    "Reference":"XXXXXX",
    "JobOptimizationType":"Cost",
    "JobMode":"MinimizeVehicles",
    "MultiTrip":true,
    "CreatedDate":"\/Date(1610015158000+0000)\/",
    "Vehicles":[
      {
        "Reference":"ODC-P1",
        "Name":"Our Delivery Company Pickup I",
        "TimeWindows":[
          {
            "Identifier":"35a77f76-5f1f-4a4a-82bd-xxxxxxxxxxx",
            "Range":450000,
            "FixedCost":0,
            "TimeCost":10,
            "DistanceCost":1,
            "StartLocationReference":"Depot",
            "EndLocationReference":"Depot",
            "TimeDilation":0,
            "WorkingTime":{
              "StartTime":"\/Date(1606294800000+0000)\/",
              "EndTime":"\/Date(1606323600000+0000)\/"
            },
            "Attributes":null,
            "Capacities":null,
            "VehicleBreaks":null
          }
        ]
      }
    ],
    "Locations":[
      {
        "Reference":"Depot",
        "Name":"Our Depot, Our City",
        "ServiceDuration":0,
        "IsDepot":true,
        "IsRefuel":false,
        "IsRequired":true,
        "TurnAroundTime":1800,
        "TurnAroundCost":0,
        "Constraints":null,
        "PickupDropOffs":null,
        "TimeWindows":[
          {
            "StartTime":"\/Date(1606294800000+0000)\/",
            "EndTime":"\/Date(1609002000000+0000)\/"
          }
        ],
        "Position":{
          "Latitude":xx.xxxxx,
          "Longitude":-x.xxxxx
        },
        "ScheduleDateTimeCheckString":""
      },{
        
        "Reference":"Delivery I",
        "Name":"32 Delivery Rd",
        "ServiceDuration":500,
        "IsDepot":false,
        "IsRefuel":false,
        "IsRequired":true,
        "TurnAroundTime":0,
        "TurnAroundCost":0,
        "Constraints":null,
        "PickupDropOffs":null,
        "TimeWindows":[
          {
            "StartTime":"\/Date(1606294800000+0000)\/",
            "EndTime":"\/Date(1609002000000+0000)\/"
          }
        ],
        "Position":{
          "Latitude":xx.xxxxx,
          "Longitude":-x.xxxxx
        },
        "ScheduleDateTimeCheckString":""
      },{
        
        "Reference":"Delivery II",
        "Name":"2 Drop-Off Ave",
        "ServiceDuration":500,
        "IsDepot":false,
        "IsRefuel":false,
        "IsRequired":true,
        "TurnAroundTime":0,
        "TurnAroundCost":0,
        "Constraints":null,
        "PickupDropOffs":null,
        "TimeWindows":[
          {
            "StartTime":"\/Date(1606294800000+0000)\/",
            "EndTime":"\/Date(1609002000000+0000)\/"
          }
        ],
        "Position":{
          "Latitude":xx.xxxxx,
          "Longitude":-x.xxxxx
        },
        "ScheduleDateTimeCheckString":""
      },{
        
        "Reference":"Delivery III",
        "Name":"51 Package Place",
        "ServiceDuration":500,
        "IsDepot":false,
        "IsRefuel":false,
        "IsRequired":true,
        "TurnAroundTime":0,
        "TurnAroundCost":0,
        "Constraints":null,
        "PickupDropOffs":null,
        "TimeWindows":[
          {
            "StartTime":"\/Date(1606294800000+0000)\/",
            "EndTime":"\/Date(1609002000000+0000)\/"
          }
        ],
        "Position":{
          "Latitude":xx.xxxxx,
          "Longitude":-x.xxxxx
        },
        "ScheduleDateTimeCheckString":""
      },{
        
        "Reference":"Delivery IV",
        "Name":"123 Parcel St",
        "ServiceDuration":500,
        "IsDepot":false,
        "IsRefuel":false,
        "IsRequired":true,
        "TurnAroundTime":0,
        "TurnAroundCost":0,
        "Constraints":null,
        "PickupDropOffs":null,
        "TimeWindows":[
          {
            "StartTime":"\/Date(1606294800000+0000)\/",
            "EndTime":"\/Date(1609002000000+0000)\/"
          }
        ],
        "Position":{
          "Latitude":xx.xxxxx,
          "Longitude":-x.xxxxx
        },
        "ScheduleDateTimeCheckString":""
      }
    ]
  },
  "token":{
    "UserGuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX",
    "Signature":"XXXXXXXXXXXXXXXXXXXXXXXXXX="
  }
}

JSON skills aside, all this API request does is:

  • Specify a few configuration parameters
  • Provide a list of vehicles (along with their associated costs, attributes, capacities and operating times)
  • Provide a list of locations (along with their co-ordinates, delivery time constraints, pickup/dropoffs, and other requirements)
  • Provide security credentials

The API JSON response is very similar (and effectively hides the complexity associated with tackling massive delivery planning problems):

{
  "ErrorCode":"0",
  "Message":"ok",
  "Result":{
    "Comment":"",
    "Confidence":0,
    "Cost":34.18,
    "CreatedDate":"\/Date(1610015166203+0000)\/",
    "Distance":20640,
    "Error":"",
    "Execution":0,
    "JobReference":"XXXXXX",
    "ResultCode":1,
    "SolutionId":XXXXXX,
    "Time":4875,
    "Units":1,
    "UnreachedLocations":null,
    "UnusedDepots":null,
    "UnusedVehicles":null,
    "Vehicles":[
      {
        "Comment":"",
        "Cost":34.18,
        "Distance":20640,
        "DrivingTime":4875,
        "DurationTime":2000,
        "Error":"",
        "Name":"Our Delivery Company Pickup I",
        "SolutionUnitStatusId":1,
        "Stops":[
          {
            "ArrivalTime":"\/Date(1606294800000+0000)\/",
            "Comment":"",
            "DepartureTime":"\/Date(1606294800000+0000)\/",
            "DrivingDistance":0,
            "DrivingDistanceSum":0,
            "DrivingTime":0,
            "DrivingTimeSum":0,
            "Duration":0,
            "DurationSum":0,
            "Error":"",
            "Index":0,
            "IsDepot":true,
            "LocationReference":"Depot",
            "Name":"Our Depot, Our City",
            "Position":{
              "Latitude":xx.xxxxx,
              "Longitude":-x.xxxxx
            },
            "ScheduledEnd":"\/Date(1606294800000+0000)\/",
            "ScheduledStart":"\/Date(1606294800000+0000)\/",
            "WaitTime":0,
            "WaitTimeSum":0
          },{
            "ArrivalTime":"\/Date(1606294970000+0000)\/",
            "Comment":"",
            "DepartureTime":"\/Date(1606295470000+0000)\/",
            "DrivingDistance":757,
            "DrivingDistanceSum":757,
            "DrivingTime":170,
            "DrivingTimeSum":170,
            "Duration":500,
            "DurationSum":500,
            "Error":"",
            "Index":1,
            "IsDepot":false,
            "LocationReference":"Delivery III",
            "Name":"51 Package Place",
            "Position":{
              "Latitude":xx.xxxxx,
              "Longitude":-x.xxxxx
            },
            "ScheduledEnd":"\/Date(1606295470000+0000)\/",
            "ScheduledStart":"\/Date(1606294970000+0000)\/",
            "WaitTime":0,
            "WaitTimeSum":0
          },{
            "ArrivalTime":"\/Date(1606295566000+0000)\/",
            "Comment":"",
            "DepartureTime":"\/Date(1606296066000+0000)\/",
            "DrivingDistance":337,
            "DrivingDistanceSum":1094,
            "DrivingTime":96,
            "DrivingTimeSum":266,
            "Duration":500,
            "DurationSum":1000,
            "Error":"",
            "Index":2,
            "IsDepot":false,
            "LocationReference":"Delivery IV",
            "Name":"123 Parcel St",
            "Position":{
              "Latitude":xx.xxxxxx,
              "Longitude":-x.xxxxx
            },
            "ScheduledEnd":"\/Date(1606296066000+0000)\/",
            "ScheduledStart":"\/Date(1606295566000+0000)\/",
            "WaitTime":0,
            "WaitTimeSum":0
          },{
            "ArrivalTime":"\/Date(1606296776000+0000)\/",
            "Comment":"",
            "DepartureTime":"\/Date(1606297276000+0000)\/",
            "DrivingDistance":5460,
            "DrivingDistanceSum":6554,
            "DrivingTime":710,
            "DrivingTimeSum":976,
            "Duration":500,
            "DurationSum":1500,
            "Error":"",
            "Index":3,
            "IsDepot":false,
            "LocationReference":"Delivery I",
            "Name":"32 Delivery Rd",
            "Position":{
              "Latitude":xx.xxxxx,
              "Longitude":-x.xxxxx
            },
            "ScheduledEnd":"\/Date(1606297276000+0000)\/",
            "ScheduledStart":"\/Date(1606296776000+0000)\/",
            "WaitTime":0,
            "WaitTimeSum":0
          },{
            "ArrivalTime":"\/Date(1606298471000+0000)\/",
            "Comment":"",
            "DepartureTime":"\/Date(1606298971000+0000)\/",
            "DrivingDistance":9396,
            "DrivingDistanceSum":15950,
            "DrivingTime":1195,
            "DrivingTimeSum":2171,
            "Duration":500,
            "DurationSum":2000,
            "Error":"",
            "Index":4,
            "IsDepot":false,
            "LocationReference":"Delivery II",
            "Name":"2 Drop-Off Ave",
            "Position":{
              "Latitude":xx.xxxxxx,
              "Longitude":-x.xxxxx
            },
            "ScheduledEnd":"\/Date(1606298971000+0000)\/",
            "ScheduledStart":"\/Date(1606298471000+0000)\/",
            "WaitTime":0,
            "WaitTimeSum":0
          },{
            "ArrivalTime":"\/Date(1606299675000+0000)\/",
            "Comment":"",
            "DepartureTime":"\/Date(1606299675000+0000)\/",
            "DrivingDistance":4690,
            "DrivingDistanceSum":20640,
            "DrivingTime":704,
            "DrivingTimeSum":2875,
            "Duration":0,
            "DurationSum":2000,
            "Error":"",
            "Index":5,
            "IsDepot":true,
            "LocationReference":"Depot",
            "Name":"Our Depot, Our City",
            "Position":{
              "Latitude":xx.xxxxx,
              "Longitude":-x.xxxxx
            },
            "ScheduledEnd":"\/Date(1606299675000+0000)\/",
            "ScheduledStart":"\/Date(1606299675000+0000)\/",
            "WaitTime":0,
            "WaitTimeSum":0
          }
        ],
        "TimeWindow":{
          "EndTime":"\/Date(1606323600000+0000)\/",
          "Identifier":"56cf7e2f-2dc1-418e-9c6a-180d849a75fa",
          "StartTime":"\/Date(1606294800000+0000)\/"
        },
        "VehicleReference":"ODC-P1",
        "WaitTime":0
      }
    ]
  },
  "Status":"ok"
}

This solution has taken an unordered list of locations and converted them into an array of vehicles, each with an optimized delivery plan that obeys the constraints specified in the request.

Specifically, it:

  • Provides information about the overall solution (i.e. was it possible within the given parameters, how much it cost, etc)
  • Lists each utilized vehicle along with an indexed list of locations and associated costs (i.e. time/labor & distance/fuel)

It's not too hard to take this JSON and convert it into a powerful, data-driven interface that can be distributed and shared to everyone who needs the information - from drivers waiting for their routes to warehouse managers waiting to pack the vehicles to accounts, operations, and anyone else who needs to understand parts or all of your daily operations.

Route Optimization API

Integrate powerful route optimization and delivery planning features directly into your business.

Get Started