Orders, ERP Integration, and Automation

The interface between an automated manufacturing cell and the rest of the factory has a large impact on performance and efficiency. Automation can reduce labor costs, add flexibility, and improve quality, and these are all good things. But a large benefit of automation is that despite variations in demand, the bottleneck can be controlled to always be machines and not the input or output of the system. This allows the cell to run with consistently high efficiency every day no matter the part mix, and as an additional benefit allows other steps of the manufacturing process and factory to work smoother because of the versatility of the cell boundary. A cell which automatically responds to variations in demand can have a huge impact on cost-per-piece.

Integrating the cell with the rest of the factory is challenging. Part demand must be kept lean to prevent traffic jams and inefficiency but not too lean to starve the machines for work. Completed parts must be tracked to know when to finalize workorders. Inspections, rework, and scrapped parts require techniques to ensure the correct final demand is produced. Incoming orders and due dates must be examined to ensure parts are started soon enough to finish on time. Any hiccups in these processes can cause the automated manufacturing cell to lose efficiency; the goal is that the bottleneck is always the machines, not one of these input or output actions.

When part demand varies by a large amount day-to-day, the best method to interface the automated system to the rest of the factory is via orders. An order consists of a due date, priority, and demand for parts, and can either be customer orders or just internally generated build schedules. The automated manufacturing cell consumes the orders to decide what to produce and then collects the completed parts into orders and places them into a basket or container to be sent out to the factory. This is the primary situation in which automation thrives, because the automation can automatically adapt to the varying demand represented by the order mix.


Orders provide an versatile interface between the cell and the rest of the factory. Orders have due dates, can vary part quantities, present different part mixes day-by-day, and help organize the machined parts to ease assembly or downstream consumers. Orders can eliminate batching, implement lean techniques, and help quicken quality iterations. On the other hand, daily orders can be challenging to implement on the factory floor, because the order data can become out of sync with the realities of the machines. Perhaps a part is scrapped or sent off to a long inspection, or no material is available so a different part is run on the machine without updating the data. Also, an automated system might run a dozen orders at once which is difficult for humans to track. Using build-to-order techniques in the factory requires an order technique flexible enough to cope with these situations (and more).

How should orders interact with the cell controller and the machines? The automation must make as much as it can as quickly as possible using all available machines and flexibility. Thus, the manufacturing process should internally be focused on parts and not orders, because individual parts are flexible while orders are rigid leaving unused capacity. The simplest technique to allow the cell controller to focus on parts and not orders is to just give the entire backlog of orders to the cell all at once as part demand, but this leads to batching, traffic jams, and difficulty controlling the bottleneck. Instead, we have had great success using a technique based on bookings, daily part schedules, and workorders. This initially appears more complicated and does require slightly more engineering, but the end result is a simpler design since it better captures the reality of the manufacturing process. Automation and software eliminates the day-to-day complexity of this technique.


A booking is an order that concerns itself only with the demand for the cell, therefore limits itself only to the input boundary between the cell and the rest of the factory. A booking consists of:

  • Unique Identifier
  • Due Date
  • Priority
  • Part Name(s) and Demand Quantity
  • Raw Material/Casting Type
  • Quantity of Available Raw Material/Casting
  • A flag if the booking has been scheduled or not

Typically, bookings are initially created from customer orders, internally generated build schedules, or kanban cards, but bookings can be created from other places (see some examples below).

Part Scheduling and Jobs

Once a day, the bookings are examined and a daily schedule is sent to the cell controller. The schedule consists of a collection of jobs, where each job consists of a part name, a quantity to produce, and a flexibility specification (which machines, pallets, etc. to use). The jobs control the operation of the cell itself and are basis for the decisions on pallet movements and machine cycles.

The daily schedule will include enough parts to ensure the machines stay busy, and this might mean only a portion of a booking fits into the schedule. Rather than track partially completed bookings, the system instead keeps a list of parts and quantities that have been scheduled without a booking. The next day's schedule will see these part quantities and realize that to complete the booking only the remaining parts must be scheduled. See below for some specific examples.


A workorder is an order that concerns itself only with the output of the cell, therefore limits itself only to the output boundary between the cell and the rest of the factory. A workorder consists of:

  • Unique Identifier
  • Due Date
  • Priority
  • Part Name(s) and Fill Quantity
  • A flag if the workorder has been filled or not
  • A list of serials of parts assigned to this workorder
  • The machine and labor operation time consumed by the parts in this workorder (can be used to accurately calculate cost of the workorder).

Typically, workorders are initially created from customer orders, internally generated build schedules, or kanban cards, and initially match one-to-one with bookings. But depending on the situations encountered during the manufacturing process, the workorders can be adjusted to match how the cell groups and reports completed parts (see some examples below).

Benefits of splitting into bookings, part jobs, and workorders

Whenever the data about the cell becomes out of sync with reality, problems appear. The manufacturing process itself is part focused, so a daily schedule of part jobs and not orders allows the cell to efficiently use all available machine capacity. The collection of unscheduled bookings represents the demand for the system, while the unfilled workorders represent the output of the cell. By separating bookings and workorders, they can be manipulated independently to adjust the data to match the shop floor reality. The split into bookings, part jobs, and workorders uses the appropriate data in the appropriate place to obtain all the benefits without any of the downsides.

Splitting the process into bookings, jobs, and workorders is simple with computer assistance. On a given day, the daily jobs can contain dozens of part types with build quantities depending not on order quantity but available capacity. Completed parts can be destined for many orders simultaneously. Despite this seeming complexity, tracking this is just counting parts. For example, if there is a booking for 50 parts, the daily schedule today made 30, so tomorrow's schedule should include 20. The ERP system can maintain these counts, allowing many orders to be tracked at once. Exposing and making visible these counts in the ERP helps maintain confidence in the system's operation. (Occasionally, a stakeholder requests that the orders appear as separate jobs in the cell controller for comfort in tracking, but as stated above this is detrimental to efficiency. By exposing the part counting in the ERP, the same comfort can be obtained.)


The ERP system should manage the collection of bookings, workorders, and scheduled parts without bookings. (The appendix below contains some specific table suggestions.) The ERP system should then expose the following operations, all of which are made easier by the separation of bookings, workorders, and jobs.

Receive new orders

When a new order is received, the ERP should create a new booking and a new workorder. They can be identical: have the same ID, same due date, same priority, and same part quantities. This represents the fact that you want the system to produce these parts (the booking) and collect and report the parts together (the workorder). The ERP system might also send off a message to ensure the required amount of raw material/castings are obtained.

Daily Schedule Tracking

Once a day, the unscheduled bookings and the scheduled parts without bookings are loaded from the ERP. OrderLink then subtracts the already scheduled parts without bookings from the unscheduled bookings to determine the total unscheduled demand. OrderLink then creates a schedule of part jobs for the day, and sends the jobs to the cell controller. OrderLink then reports to the ERP system which bookings to mark as scheduled and the new table of scheduled parts without bookings.

Here is an example. At the beginning of the day, the following data is currently in the ERP:

  • BookingID = SSS, Part = ABC123, Quantity = 20

  • BookingID = TTT, Part = ABC123, Quantity = 15

  • BookingID = UUU, Part = DEF456, Quantity = 60

  • Part = ABC123, Scheduled Part Qty Without Bookings = 5

  • Part = DEF456, Scheduled Part Qty Without Bookings = 35

OrderLink loads this data from the ERP, and then calculates the demand for part ABC123 as 20 + 15 - 5 = 30. (The 20 and 15 come from the unscheduled bookings, while the 5 comes from the scheduled parts without bookings. The 5 scheduled parts without bookings indicates that on a previous day, 5 parts were scheduled but no booking was marked, thus the 5 is subtracted from the booking demand.) The demand for part DEF456 is calculated as 60 - 35 = 25. OrderLink also takes into account due dates, but for this example just assume all the due dates are the same. OrderLink then calculates how much work can be done today; say OrderLink calculates that all 25 DEF456 parts can be produced but only 18 ABC123 parts can be produced. OrderLink will create jobs for 25 DEF123 parts and 18 ABC123 parts and send these to the cell controller.

The 25 newly scheduled DEF123 parts plus the 35 previously scheduled parts mean that 60 total DEF456 parts have been scheduled so the UUU booking can be marked as scheduled. The 18 newly scheduled ABC123 parts plus the 5 previously scheduled parts total only 23 scheduled ABC123 parts. This is enough to mark the SSS booking as scheduled and leaves 3 scheduled ABC123 parts without a booking. The TTT booking can't be marked as scheduled yet and is left unscheduled, and the 3 ABC123 parts are set in the scheduled parts without bookings table. OrderLink performs these calculations and sends to the ERP system the following data:

  • ScheduleId (a unique string to identify the schedule).
  • Time the schedule was created.
  • Expected hours to complete the schedule, typically 24 hours, unless the schedule is created midway through the day.
  • List of booking ids to mark as scheduled, in this case SSS and UUU.
  • Job quantities sent to the cell controller, in this case 25 of DEF123 and 18 of ABC123.
  • The new collection of scheduled parts without bookings, in this case 3 parts of type ABC123.

The ERP system should mark the given booking ids as scheduled and replace completely scheduled parts without bookings table (OrderLink always recalculates the entire scheduled parts without bookings data). Everything else is optional and does not need to be stored for the cell to operate correctly, although the data might be useful for reports and later analysis.

Filling Workorders

As parts are produced by the cell, they are assigned a unique serial barcode. There are two methods to assign completed parts to workorders, and either (or both) can be used:

  • When a completed part is unloaded at the load station, the unfilled workorder with the soonest due date is assigned by the operator. Once a workorder has been assigned enough serials, it is marked as filled in the ERP.

  • Once a day or once every couple of days, a supervisor or manager uses OrderLink to assign completed parts to workorders. OrderLink contains a screen which shows the recent completed parts with their serial and allows each to be assigned to a workorder. Each workorder can then be marked as filled, which OrderLink then reports to the ERP.

A combination of both techniques can also be used; tentative workorders can be assigned at the load station and a supervisor or manager can periodically review and fill the workorders using OrderLink. For correct operation, the only thing required by the ERP to be able to mark a workorder as filled. For each filled workorder, OrderLink reports additional data which can be used by the ERP to generate a cost report.

Cost Report

For each filled workorder, OrderLink sends to the ERP the following data:

  • Workorder Id.
  • Filled time.
  • List of part serials assigned to this workorder.
  • Accumulated elapsed time of labor. This is the amount of time a pallet spends at the load station, accumulated over all parts assigned to this workorder.
  • Accumulated expected time of labor. This is the sum of the expected time of load/unload operation over all parts. The expected time comes from the model and is set as part of the engineering study.
  • Accumulated elapsed time of machining. This is the amount of time a pallet spends at the machine, accumulated over all parts assigned to this workorder.
  • Accumulated program cycle time of machining. This is the sum of the cycle times for all machine cycles for all parts assigned to the order. The cycle time is loaded from the model and is set as part of the engineering study.

The accumulated times can be used to report cost for the workorder, for example the labor time can be multiplied by the wage rate to obtain the labor cost of the workorder. Note that the elapsed and expected labor time can differ if a load/unload cycle takes longer than normal or the operators are on break when the pallet initially arrives at the load station. Thus the labor cost should be calculated from the expected labor time and not the elapsed labor time. Similarly for machines, a breakdown or other pause in the program will cause the elapsed machining time to increase above the expected cycle time so typically the accumulated cycle times should be used for costing.

The difference between elapsed and expected time for labor and machines should be statistically analyzed. An occasional workorder with larger elapsed than expected labor time isn't cause for concern, but if the elapsed time is consistently larger over many workorders there is an issue that should be investigated.

Update existing orders

In the ideal world, once an order appears it is frozen. One of the advantages of bookings and workorders it that we can optimally respond when orders change, allowing us to look further into the future orders when creating a schedule, which in turn allows better machine utilization since parts can be found to always keep all the machines busy.

Consider the following example. Initially there is an order XYZ for 20 parts of type ABC123. The ERP therefore creates a booking XYZ for 20 ABC123 parts and a workorder XYZ for 20 ABC123 parts. Now consider that the order XYZ is updated to 30 parts.

  • If the XYZ booking has not yet been scheduled and the XYZ workorder is not yet filled, the ERP can edit the booking and workorder to have 30 parts.

  • If the XYZ booking has been scheduled already, any edits won't do anything since only unscheduled bookings are examined when creating the daily schedule. Instead, the ERP creates a new booking with the difference in quantity, so creates a booking XYZ-extra for 10 ABC123 parts and the original XYZ booking is left unchanged. This will cause the system to eventually produce a total of 30 parts, consisting of the original 20 from the scheduled XYZ booking plus the 10 from the new XYZ-extra booking.

  • Since workorders are separate from bookings, the ERP can update the XYZ workorder to the new quantity of 30 ABC123 parts irrespective of changes to the bookings. Thus the 30 parts produced by the combination of the XYZ and XYZ-extra bookings can all be filled into the single XYZ workorder.

Amazingly, outside of this one-time editing of the bookings and workorders at the time of the order change, there is no special logic or customized control throughout the manufacturing process. The jobs and cell controller machine parts oblivious to the order change, the scheduling in OrderLink just views the unscheduled bookings uncaring where they came from, and the outbound parts are filled into workorders the same as normal.

Replacement Bookings

Consider that a part fails inspection or is otherwise scrapped completely. In this situation, the ERP should have a screen or form to allow the operator to enter a new booking for a single part. (The workorders are left unchanged.) Eventually, the booking will be scheduled and the part will be produced. The "extra" part can then be assigned to an existing workorder. Note again no customized tracking logic throughout the machining is needed; just adding a new booking causes the usual order flow to correctly handle this situation.

Quantity Fix-up

Hopefully it never happens, but occasionally an extra part is produced or a part is lost. In this case, the count of parts in the ERP can become mismatched to reality. If this happens even semi-frequently, it should be investigated since something is going wrong. Having said that, because bookings and workorders are separated, if it does happen it is easy to fix. The ERP should have the ability to edit the bookings, scheduled parts without bookings, and workorders.

For example, say an extra ABC123 part is at the outbound which is unaccounted for. In this case, a supervisor or a manager can edit a booking to reduce the demand by one (note this has no effect on filling workorders). Alternatively, the extra part can be added to the scheduled parts without bookings table, since the quantities in this table are subtracted from the unscheduled bookings to calculate incoming demand.

Re-machined parts

When a part needs to be re-machined because of an interrupted program or other problem, there are two options. If the re-machining is quick, nothing needs to be done; the part can be re-machined and sent back to the cell to be filled into a workorder. Otherwise, a replacement booking can be created to request a new part so that the existing workorders are filled promptly. Once the re-machined part arrives back at the cell, there is now an extra part. This can be handled by adding the extra part into the scheduled parts without bookings table. The next time OrderLink examines the unscheduled bookings, it subtracts the scheduled parts without bookings to determine the demand, so one fewer part will be scheduled to account for the extra part.

Changing order due dates/rush orders

Since schedules are created to fill up the machines, parts from bookings with future due dates can get scheduled because there is available capacity. Consider the situation that a new order with a sooner due date arrives, or an existing order has its due date increased. If the new order is for an important client, you are going to use the completed parts sitting at the outbound of the cell; if the original booking is still a week or two away, the parts for that booking can be manufactured again. The separation of orders into bookings and workorders handles this situation perfectly.

Here is an example. Consider an order with ID XYZ for 20 parts of type ABC123, with due date 3 weeks in the future. This creates a booking XYZ for 20 ABC123 parts, and a workorder XYZ for 20 ABC123 parts. Because some capacity is available, the booking XYZ is scheduled and machined. Now consider that an order JKL for 15 parts of type ABC123 arrives, with a due date in 2 days. This order creates a booking JKL for 15 parts and a workorder JKL for 15 parts, resulting in the following situation:

  • A scheduled booking XYZ for 20 ABC123 parts
  • An unscheduled booking JKL for 15 ABC123 parts
  • An unfilled workorder XYZ for 20 ABC123 parts
  • An unfilled workorder JKL for 15 ABC123 parts
  • 20 manufactured ABC123 parts

Since JKL is due soon, 15 of the 20 already manufactured parts are sent out and the JKL workorder is marked as filled, resulting in the following situation:

  • A scheduled booking XYZ for 20 ABC123 parts
  • An unscheduled booking JKL for 15 ABC123 parts
  • An unfilled workorder XYZ for 20 ABC123 parts
  • An filled workorder JKL for 15 ABC123 parts
  • 5 manufactured ABC123 parts

This situation is straightforward enough to manage for operators and supervisors with standalone machines. Indeed, likely there is some basket or kanban card for XYZ and when only 5 parts are in the XYZ basket the operator knows to run 15 more ABC123 parts. When automation is introduced (and therefore data in the ERP and cell controller), the situation becomes quite complex. If orders had been used throughout the manufacturing process, manual editing of the order data would be required (for example, to mark XYZ as partially unscheduled since we "stole" some parts from it). This is especially challenging if operations and order management are managed by different people.

But with bookings, part jobs, and workorders, no data editing and no customized logic is required! Since there is an unscheduled booking JKL for 15 parts, in the near future there will be a job created to machine 15 ABC123 parts. But since the job is for 15 ABC123 parts with no mention of any order, when the job finishes there will be 20 manufactured ABC123 parts which can be filled into the XYZ workorder.

This scenario can be generalized to any situation where parts are filled "out-of-order". In fact, because bookings and workorders are separated, filling "out-of-order" doesn't really make sense. Parts are scheduled based on the total demand of the bookings, the cell controller machines part jobs, and the completed parts are filled into workorders. A better way to think of the previous example is that the bookings represent a total demand of 35 parts and the workorders represent a total consumption of 35 parts. Just because 20 parts were scheduled due to a booking doesn't mean they all must be filled into the corresponding workorder.

Backing Out Jobs

If a machine goes down or some other problem occurs, then the daily jobs will not be completed on time. If it is a short hiccup and only a small amount of work can't be completed, the jobs can be left inside the cell controller to finish in the first couple of hours of the next day. On the other hand, if there is a significant backlog of work, the jobs should be removed from the cell controller to allow the new day to start fresh and recompute flexibility to keep all machines busy.

When backing out of jobs, OrderLink instructs the ERP to create a new booking for the backed out parts. While it might be possible to find a scheduled booking and change it back to unscheduled, it is likely that the remaining job quantities in the cell controller do not match the demand quantity of a booking. By creating a new booking for the backed out job quantities, OrderLink will reschedule these parts in a future schedule. Since the workorders are left unchanged, they will be filled once all the parts are produced.

For example, say that a booking and workorder XYZ exists for 20 ABC123 parts. The booking is scheduled and a job for 20 ABC123 parts is sent to the cell controller. For whatever reason, only 8 parts are produced during the day. At the beginning of the next day, OrderLink can be configured to back out of the 12 non-produced parts in the job. OrderLink will remove the job from the cell controller and add a new booking for 12 ABC123 parts. OrderLink then proceeds to schedule the unfilled bookings including the new replacement booking. Eventually, 12 more ABC123 parts will be produced and the 20 total parts and can be filled into the XYZ workorder which has been unchanged the entire time.


Automation is controlled by data, and accurate data is vital to the overall productivity of the cell. In order to allow the cell to adapt to varying demand and integrate with the rest of the factory, the data which controls the cell is split into pieces. First, the input boundary is represented by a collection of unscheduled bookings which specify the total part demand and due dates. Next, the day-to-day operation of the cell itself is controlled by part-focused jobs inside the cell controller. Finally, the output of the cell is collected and tracked into workorders. Each of the bookings, jobs, and workorders can be manipulated independently from each other, which allows the data to adapt to a huge range of situations. Indeed, tasks such as order changes, scrap parts, re-machining, failed inspections, machine downtime, and more can be accommodated simply by editing the bookings or workorders and without any special customized logic or tracking inside the automation and the cell itself. The result is that the automation and the machines run smoothly at high efficiency.

Appendix: ERP Tables

The ERP system should manage the bookings, workorders, and scheduled parts in the following tables:

Bookings Tables

The bookings table should have the following columns:

  • BookingId: string (primary key)
  • DueDate: date
  • Priority: int (larger numbers are higher priority)
  • Scheduled: boolean

The bookings parts table should have the following columns:

  • BookingId: string
  • PartName: string
  • Quantity: int
  • Casting: string

The primary key is (BookingId,PartName). The main query is to load all unscheduled bookings with due date sooner than some specified date, so there should be an index on (Scheduled, DueDate).

Scheduled Parts Without Bookings Table

The scheduled parts without bookings table should have two columns:

  • PartName: string (primary key)
  • Quantity: int

No indexes are needed.

Workorders Tables

The workorders table should have the following columns:

  • WorkorderId: string
  • DueDate: date
  • Priority: int (larger numbers are higher priority)
  • Filled: boolean

The workorders parts table should have the following columns:

  • WorkorderId: string
  • PartName: string
  • Quantity: int

The primary key on (WorkorderId, PartName).

There are two main queries: load all unfilled workorders with due date sooner than some specified date, and load all unfilled workorders for a specific part name. Thus there should be an index on (Filled,DueDate) and and another on (Filled,PartName).

Results tables

The above tables are all that is needed for correct operation. For scheduled bookings and filled workorders, additional result data such as serials, labor, and machining time are available (see above for the specifics). This data can be stored in the ERP for analysis and reporting in whatever format and tables make the most sense.

Have more questions?

Contact Us