Skip to main content
Leak 03 · Shipment exceptions

30+ validation rules catching shipment exceptions before they become chargebacks.

A live shipment dashboard with per-retailer ship-window math, running around your existing ERP. The team works in a modern app. The ERP stays in place.

The Problem

You can't really replace the ERP, but the way it makes the team work isn't sustainable either.

The Result

A live ops dashboard on top of the legacy ERP. 30+ automated validation checks, per-retailer ship-window math, and everyone working off the same view.

Real-time Ship List grid with validation badges and exception highlighting layered on top of the legacy ERP
  • The legacy ERP stays where it is as the system of record. A modern ops app sits on top, reading orders continuously and showing them in a live grid.
  • 30+ automated checks catch exceptions before they become chargebacks: bad freight terms, PO Box on hazmat, missing customer item setup, zero ship time, wrong workcenter, and more.
  • A ship-window calculator handles the date math for every shipment, with the per-customer carve-outs (Walmart, Target, Walgreens), UPS transit times, holidays, and weekends baked in.
  • Real-time updates push to every screen over SignalR, so the whole team's looking at the same view at the same time.
Results
$0 spent on ERP replacement
30+ validation rules per shipment
~30 sec lag from legacy ERP to live grid
  • Exceptions show up as soon as the data lands, not weeks later when a chargeback hits the mailbox.
  • No system-of-record migration to do. Training, integrations, and historical data all stay where they are.
  • Shadow spreadsheets quietly retire. Once the ops app is the live view, the side-of-desk stuff stops getting opened.

The system you can't replace is the one holding you back.

If you've been in 3PL for any length of time, you know the shape of this one. The WMS, TMS, or ERP you've been running for a decade or two is the system of record. It owns the customer master, the orders, the financials. Replacing it is an 18-month, seven-figure project with months of dual running, and the upside doesn't pay back the risk.

The catch is it was never designed for the way ops runs today. The team needs to see live status across thousands of shipments. Several people work the same exception queue without stepping on each other. Every retailer has its own ship-window math, its own definition of "on time," and its own list of things you have to validate before tendering (freight terms, hazmat rules, address rules, account-number formats). A chargeback shows up the moment one of them's wrong. Doing that work inside a legacy ERP screen plus a pile of spreadsheets is slow and error-prone, and over time the shadow systems multiply: side databases, whiteboards, the master spreadsheet on someone's OneDrive. None scale, all are key-person risks, and they don't agree with each other.

A modern dashboard that sits on top of the legacy ERP.

A live shipment dashboard sits on top of the legacy ERP. The ERP stays the system of record; we don't touch it. Every thirty seconds or so, a background worker pulls fresh orders into a modern data layer, runs the validation rules, and pushes anything that changed out to every operator's screen. The team works in a normal app, the ERP keeps doing what it does, and the business doesn't have to pay for a rip-and-replace.

Five pieces that made this work.

Step 01

Get the ERP's data into a modern store, live

Orders, customers, items, and addresses live inside the legacy ERP, accessible over ODBC. Reading it straight into modern interfaces every time someone clicks is slow and chatty. A background worker pulls new and changed orders every thirty seconds and writes them as Order and Shipment records into a modern SQL Server schema. The ERP stays the system of record; the ops app reads from a modern layer that's never more than a few seconds behind.

Step 02

Validate every shipment against thirty-plus rules

Every retailer has its own chargeback rulebook. Freight terms have to match carrier types. Hazmat can't go by air. PO Boxes need a specific carrier. Account numbers have format rules. A shipment validator runs more than thirty checks — address completeness, ship and tender date math, freight terms vs. carrier compatibility, hazmat pairing, account-number format, customer item setup — and re-runs whenever anything on a shipment changes. Every error has a stable code, so the exception queue isn't a guessing game.

Step 03

Calculate ship windows the way each customer defines them

"When does this shipment have to leave?" depends on who's getting it. Some retailers measure backwards from a fixed delivery date. Some let the math run through weekends. Target has its two-day, Walmart its one-day, Walgreens its own rules. A ship-window calculator encodes all those cases plus the per-customer carve-outs, counts UPS business days, and skips holidays and weekends. The windows in the ops app match the ones each retailer actually enforces.

Step 04

Push updates live to every screen

Multiple operators work the same queue, and a list that's even a refresh out of date is one where work gets done twice or not at all. The shipment grid is built on ag-Grid with custom validation badges. A SignalR hub pushes every change — new shipment, validation update, status change — to every connected client as it happens. The race conditions that come with legacy ERP screens mostly go away.

Step 05

Quiet the noise per customer with "acceptable errors"

Not every rule applies the same way to every customer. Some retailers explicitly allow things the generic rule would flag. A per-customer "acceptable errors" config lets the team mark specific error codes as fine for specific customers — the validator still runs every check, the filtered output just leaves out the ones the team has accepted. Operators stop dismissing the same false positive a hundred times a day.

Technical detail (for the engineers in the room)
  • .NET 8 · ODBC · SQL Server pull orders out of the legacy ERP every thirty seconds and write them as Order and Shipment records into the modern operational store
  • Shipment validator runs the thirty-plus per-shipment and cross-shipment rules, with per-customer acceptable-error filtering on the way out
  • Ship-window calculator encodes the per-customer ship and tender date math, and takes the holiday calendar and UPS transit days as inputs
  • ASP.NET Core · SignalR push shipment changes out to every connected client as they happen
  • React · MUI · ag-Grid make up the live operations grid that operators actually work in

Stuck with a legacy WMS, TMS, or ERP you can't replace?

Book a free intro call. We'll walk through where your team is working around the legacy system today and what a modern app on top of it would look like. No rip-and-replace.

Book an intro call
(407) 349-3633