Back to ChroniclesManufacturing

    ERP Ship Date Is a Schedule, Not a Fact

    The ERP ship date re-baselines as schedules slip. Grading automation or CSRs against it grades the planner. Use in-hands date and order type instead.

    MP
    Michael Pam
    CTO & Founder
    September 26, 202610 min read
    ERP Ship Date Is a Schedule, Not a Fact

    TL;DR

    • ERP ship date is a computed output, not a customer commitment
    • Grade orders against in-hands date and order type instead
    • Escalation rules based on ship date fire on scheduler noise
    • In-hands date fields decay because nothing forces capturing them
    • Urgency is knowable at PO intake, before scheduling even begins

    An order is late. Someone pulls up the ERP, looks at the ship date field, sees it's blown past, and starts escalating. A CSR gets a note to call the customer. Maybe automation fires off an apology email. Maybe a manager asks why the floor missed the date.

    Here's the problem: nobody checked what the customer actually asked for. They checked a field the scheduling system generated, and they graded the order against it as if it were a commitment.

    That's the tempting move, and it's wrong often enough that it's worth writing down why.

    The move that feels right

    Escalating on ERP ship date feels correct because the field looks like a fact. It's a date, in a date field, sitting next to the order number. It has the same shape as "order total" or "customer name," fields that are extracted straight off a source document and don't change unless someone made a mistake entering them.

    But the ship date isn't extracted from anything. It's computed. It comes out of a scheduling engine that's looking at capacity, queue position, material availability and whatever else the ERP's algorithm weighs, and it spits out a date that represents "given everything I know right now, here's when this should ship." That's a planning output, not a record of intent.

    The moment any input changes, capacity gets reallocated, a machine goes down, a rush order jumps the queue, the ship date recalculates. It's supposed to. That's the entire point of a scheduling system: it re-baselines as reality changes. A ship date that never moved would mean the scheduler stopped doing its job.

    We watched this pattern directly on order-to-release automation work for an operations-heavy client. The ERP's estimated ship date almost never matched what the customer actually asked for, and there was no directional bias in the mismatch, no consistent pattern of running early or running late. That absence of bias is itself informative. If the field were an extraction error, you'd expect it to skew one direction, maybe the system always rounds up, or always reads the wrong date field on the source document. Random variance in both directions is what you get when two different things are being measured: a request and a plan.

    Which fields are facts, and which are outputs

    The distinction that matters here isn't complicated once you name it, but almost nobody names it before the escalation happens.

    Facts are things that were true at the moment the order was placed and don't change afterward. The customer's requested date. The order type. The line items. These were captured once, from a real request, at a real point in time.

    Outputs are things the system computes based on current conditions and recomputes when conditions change. Ship date is one. So is anything downstream of a scheduling or capacity model: estimated completion, projected queue position, forecasted labor hours.

    Grading an output as if it were a fact means you're not measuring the order. You're measuring the scheduler, and by extension, whoever built or tuned it. If the ship date slips, that's not evidence the order is in trouble. It's evidence the plan changed, which is exactly what a plan is supposed to do when the world doesn't cooperate with it.

    This distinction matters even more once automation enters the picture. If you build an automated escalation rule that fires when "today > ship date," you've built a rule that fires whenever the scheduler updates its own estimate, which can happen for reasons that have nothing to do with customer risk. A machine coming back online early can move the ship date up. A parts shortage can move it back. Neither event says anything about whether the customer's actual delivery commitment is at risk. The rule ends up escalating noise and missing signal, which is worse than doing nothing, because it burns the team's attention on false positives until they start ignoring the escalation channel entirely.

    We've written about this failure mode in a different context: Human-in-the-Loop Is Not a Safeguard makes the case that a human sitting in front of a bad signal doesn't fix the signal, it just adds latency to the same wrong answer. Same principle here. Automating an escalation off the wrong field doesn't make the escalation more trustworthy. It makes it faster and more confident, which is worse.

    What the customer actually told you

    If ship date isn't the fact you're grading against, what is?

    Two fields, and they were sitting in the ERP the whole time.

    In-hands date. This is when the customer said they need the product physically in their possession. It's the closest thing to ground truth about the actual commitment, because it's the one number that came directly from the person who's going to be upset if it's missed. Nobody asks "what ship date do you want," not really, they ask "when do you need this," and the answer to that question is the in-hands date.

    Order type. This field is doing more work than it gets credit for. Order type encodes the service level, rush, standard, whatever tiers exist in a given operation, and that tier is itself a commitment. A rush order and a standard order might carry the same in-hands date, but they imply different tolerances for how the shop should prioritize queue position, expedite fees, and which exceptions get escalated immediately versus batched into a daily review. Order type tells you not just when the customer needs it, but how much slack exists in getting there.

    Ship date, by contrast, tells you what the scheduler currently believes given today's constraints. Useful for capacity planning. Useless for customer risk assessment, because it doesn't carry the customer's actual tolerance, it carries the shop's current best guess about its own throughput.

    On the same engagement, we found the in-hands date missing on a large share of open orders, and some of the ones that were present had already passed by the time anyone looked. That's not a data entry failure so much as a process gap: the field that actually matters for customer risk wasn't being captured or maintained with the same discipline as the field that merely looks operational. Order type, on the other hand, was present on essentially every order. It's a field the system needs to route work correctly, so it gets populated reliably. In-hands date is a field that matters for judgment calls a person or an automation makes later, and judgment-call fields decay if nobody's grading against them.

    That's the actual lesson buried in this pattern: fields that drive routing stay populated. Fields that only matter for downstream escalation rot, because nothing forces anyone to fill them in at intake. If you want to grade urgency against in-hands date, you have to make capturing in-hands date as non-optional as capturing order type already is.

    Building urgency from facts instead of outputs

    Once you accept that ship date is a planning output, the fix isn't to distrust the ERP. It's to stop asking the scheduling engine a question it was never built to answer.

    The right construction looks like this: take the in-hands date, subtract the transit time appropriate to the order type (a rush order and a standard order can have different lead-time assumptions even for the same carrier), and you get a real drop-dead date, the latest point the order can leave the building and still land on time. Compare that number against where the order actually sits in production. That comparison tells you something true: is this specific order, with its specific commitment, at risk. The ERP's own ship-date estimate never enters the calculation, because it's answering a different question.

    This also changes what an escalation rule should look like. Instead of "ship date has passed," the rule becomes "days remaining until the order must leave the building to hit its in-hands date, given its order type, has dropped below the threshold that order type allows." That's a rule built entirely on facts: a customer-supplied date, a service-level field, and a calendar. Nothing in it depends on what the scheduler currently believes about capacity. It will not fire because the scheduler shuffled the queue. It will fire because a real order with a real customer commitment is running out of runway.

    We covered a version of this same instinct, build the rule on the thing that's actually a commitment rather than the thing that's convenient to read, in Business Logic Chains Explained. The point there is the same one here: a rule that's technically easy to write (read one field, compare it to today) is worthless if the field wasn't designed to carry the meaning you're asking it to carry. The work isn't in the if-statement. It's in figuring out which fields are load-bearing.

    Grading the planner instead of the order

    There's a version of this mistake that's worse than a false escalation, and it's the one that shows up in performance reviews instead of Slack alerts.

    If a company measures CSR performance, or automation performance, against ship-date accuracy, on-time-to-ship-date, percentage of orders shipped by the ERP's estimated date, it's building an incentive system around a number that nobody in the building actually controls. The scheduler controls the ship-date estimate. A CSR doesn't set it, can't move it, and often can't even see why it changed. Grading a person against a number generated by an algorithm they don't operate is grading the algorithm and blaming the person for its output.

    This is a subtle trap because it feels rigorous. "We measure on-time-to-ship-date" sounds like a real KPI. But if the ship date itself re-baselines every time the schedule shifts, the metric is partly measuring whether the order shipped on time and partly measuring whether the scheduling engine's estimate was accurate that week. Those are two different things bundled into one number, and only one of them is something a CSR or an automated workflow can actually influence.

    Measure against in-hands date and order type instead, and the metric becomes honest. Did the order land when the customer needed it, given the service level they paid for? That's a question a CSR can actually be held to, because it's a question about the thing they're actually responsible for: managing the order against a real external commitment, not managing an internal forecast they have no lever over.

    Where this shows up earliest: demand is visible before release

    The deeper implication is that none of this urgency information needs to wait until an order gets anywhere near a ship date. In-hands date and order type are both known at PO intake, the moment the order is created, days or weeks before the order reaches the point where a scheduler starts estimating ship dates at all.

    That means the drop-dead calculation, in-hands date minus lead time for that order type, can be computed the day the order enters the system. You don't need to wait for a ship-date field to populate, or worse, to blow past, before you know whether an order is going to be tight. The facts that determine urgency are available immediately. The only reason teams end up watching ship date instead is that it's the field that's visually present on the order screen, updating, looking authoritative. The fields that actually carry the commitment are sitting there too, just quieter, and usually not surfaced anywhere near as prominently.

    Building automation, or even just a daily report, off PO-intake facts rather than mid-production scheduler outputs means risk becomes visible at the earliest possible point, when there's still time to do something about it: reprioritize the queue, call the customer, expedite material. Waiting for a ship-date field to slip past today's date means you find out about the risk after most of the useful window for acting on it has already closed.

    Where we'd be wrong

    If a company's scheduling engine is unusually good, tightly coupled to real floor capacity, updated in near real time, with minimal variance between its estimate and the eventual actual ship date, then ship date starts to behave less like a forecast and more like a reliable signal, and the gap between it and in-hands date shrinks. In that world, grading against ship date is less dangerous, because the scheduler's output and operational reality are close enough that the distinction matters less.

    That's a real condition, and it's worth checking before assuming this argument applies uniformly. But it's a high bar. It requires the scheduling model to be validated against actual outcomes over time, not just trusted because it exists. Absent that validation, the safer default is the one described here: build urgency and escalation off the facts captured at intake, in-hands date and order type, and treat ship date as what it is, a planning number that tells you what the shop currently believes about its own throughput.

    Where to go from here

    If you're building or rebuilding order-automation rules and you're not sure which fields in your ERP are facts and which are computed outputs, that's exactly the kind of workflow mapping we do before writing a single line of automation. Related reading if you want more on how we approach this: Modular vs Monolithic Software: Operations Guide and AI Assistance vs Automation: The Decision Tier That Matters both dig into how we decide what a system should be allowed to decide on its own versus what needs a fact, not a forecast, underneath it.

    If you want to talk through your own ship-date logic, or figure out where your escalation rules are quietly grading a scheduler instead of an order, book a discovery call.


    Ready to Explore Custom Software?

    Schedule a discovery call to discuss how modular implementation can transform your operations with proven 90-day ROI cycles.