Controls · Reverse logistics

Financial controls on material leaving the building

Scrap is where warehouse inventory quietly stops being inventory. Material goes into a container, paperwork moves it off the customer's books, a truck takes it away. Every step is a place where the paperwork and the physical reality can drift apart.

An estimated $2,782 a year in labour time saved, by the site's own tracker. Where the figure comes from

2 asset trackers per load
3 blocking gate checks
Derived status from timestamps
Confidential client & operation

What it saves

$2,782 a year, estimated

The site's efficiency-savings tracker timed two tasks by hand and again with the software. The labour time saved comes to an estimated $2,782 a year.

TaskSaved a year
Closing a scrap container$2,025
Opening a scrap container$757
Total$2,782

Estimated by the site's own efficiency-savings tracker: each task timed by hand and again with the software, the time saved valued at a fully loaded labour rate over a 252-day working year. Labour time only, to the whole dollar.

Built for the scrap and recycling operation of a contract-logistics site, moving end-of-life material from the floor to third-party recyclers.

Scrap chain: six timestamped milestones and the drift alert beneath themA timeline of six milestones, each stamped t0 to t5: the container is allocated against live inventory, closed with a per-item snapshot frozen, transfer paperwork is generated from actual on-hand quantities and uploaded, a placard is printed with the weight captured once, the gate audit scans every pallet onto the truck or blocks the load and emails leadership, and the pickup is confirmed once two asset trackers are logged. A note says the status is derived from the timestamps and never stored, beside a table of the three records of driver, truck, trailer and plate. A red lane below shows inventory added after the snapshot, the background job that re-reads live inventory and alerts, and the baseline re-arming after each alert.THE CHAIN · EACH MILESTONE IS A TIMESTAMPt0Container allocatedChecked against live inventory, notguessedt1Container closedA per-item snapshot of its contentsis frozent2Transfer paperworkFrom actual on-hand quantities;uploaded to the customer portala failed upload is shown in redt3Placard printedScannable container code, load andpallet number; weight capturedonce and carried forwardt4Gate auditEvery pallet on the load scannedonto the truck; checked in thebrowser, re-checked on the serverelse blocked + leadership emailed3 blocking gate checkst5Pickup confirmed2 asset trackers logged onspecified pallets, enforced in everypath that can confirm oneStatus is derived from the timestamps and never stored: the stage is computed fromwhich milestones exist, so no status field can drift out of sync with reality, and stampinga milestone twice is harmless when several people work the same load.THREE RECORDSSAME FOUR FIELDSAs ordereddriver · truck · trailer · plateVendor confirmationdriver · truck · trailer · plateVerified at the gatedriver · truck · trailer · platekept for no reason other than to catch the mismatchTHE CONTROL THAT DIDN'T EXIST · AFTER THE PAPERWORK IS FILEDAdded after the snapshotMaterial dropped into a container whosetransfer paperwork was already filedwould leave the site on no documentBackground jobRe-reads live inventory against the frozenper-item snapshot and raises an alert foranything added sinceBaseline re-armsAfter each alert the snapshot is re-based,so the next drift is reported rather thanthe same one again
Six milestones, each a timestamp, carry a container from allocation to pickup; the stage is computed from the stamps. Beneath the line, the control that was missing: inventory added after the snapshot now raises an alert.

How do you stop inventory leaving in a scrap container off the paperwork?

Freeze each container's contents when it closes, then keep comparing. In this build, closing a scrap container takes a per-item snapshot; a background job re-reads live inventory, alerts whenever anything was added after the transfer paperwork was filed, then re-arms its baseline. At the gate, any pallet assigned to the load but not scanned onto the truck blocks submission.

The problem

The chain ran on people remembering. A supervisor guessed which container was free. An analyst queried inventory and hand-typed a transfer document — the paperwork that moves material off the customer's books — then uploaded it manually to their portal. A placard was hand-written. A truck was audited at the gate against whatever was written down.

The gap that mattered had no owner at all: nothing stopped material being dropped into a container after its transfer paperwork was already filed. That inventory physically leaves the site and never appears on any document: shrink with nobody's name on it.

What we built

The full chain, automated and instrumented — container allocation verified against live inventory rather than guessed, transfer paperwork generated from actual on-hand quantities, automatic upload to the customer portal with the failure called out in red when it doesn't succeed, and placards printed on the ZPL label printers on the warehouse floor, carrying a scannable container code, load and pallet number, and captured weight. The customer portal offers no API, so the upload drives its screens, the second half of APIs over legacy systems, or screen access where there is none.

Then the control that didn't exist before.

  • Closing a container freezes a per-item snapshot of its contents
  • A background job re-reads live inventory and alerts whenever anything was added after the paperwork was filed
  • The baseline re-arms after each alert, so it reports new drift rather than repeating itself
  • Material scrapped out of the wrong disposition bucket is flagged in the closing summary

The scrap chain, before and after

StepBeforeAfter
Choosing a containerA supervisor guessed which one was freeAllocation verified against live inventory
Transfer paperworkHand-typed from an inventory query, uploaded by handGenerated from on-hand quantities, uploaded automatically, failures shown in red
PlacardsHand-writtenPrinted with a scannable container code, load and pallet number, and captured weight
The truck auditChecked against whatever was written downBlocks submission on any assigned pallet not scanned onto the truck
Material added after filingLeft the site on no documentRaises an alert

A truck gate audit that blocks a missing pallet

The truck audit is a hard stop. If any pallet assigned to the load wasn't physically scanned onto the truck, submission is blocked and leadership is emailed — checked in the browser, re-checked on the server, and alerted independently, so bypassing the interface still produces both a block and a notification.

Two asset trackers must be logged on specified pallets before a pickup can be confirmed, and the rule is enforced identically in every path that can confirm one. The system also holds three separate records of driver, truck, trailer and plate — what was ordered, what the vendor's confirmation said, and what was verified at the gate — for no reason other than to catch the mismatch.

Weight is captured once, at placard printing, and carried forward automatically. Where a single order spans several pallets, weight resolves by container rather than by order, because keying on the order number collapses every pallet to whichever placard was printed last.

The result

Status is derived from what actually happened — each milestone is a timestamp, and the stage is computed from them — so there is no status field to drift out of sync with reality. Stamping a milestone twice is harmless, which matters when several people work the same load.

The operation gained a control it had never had: material that leaves the building without appearing on the paperwork now generates an alert instead of a discrepancy someone finds later. That is reconciliation as a control, not a report.

Questions about this build

Why is the gate audit checked in the browser and again on the server?

So that going around the screen changes nothing. If any pallet assigned to the load was not physically scanned onto the truck, the browser blocks submission, the server re-checks and blocks it again, and leadership is emailed by an independent alert. Bypassing the interface still produces both a block and a notification.

Why derive the load's status from timestamps instead of storing it?

Because a stored status can drift out of step with what actually happened. Each milestone is a timestamp, and the stage is computed from them, so there is no status field to disagree with reality. Stamping a milestone twice is harmless, which matters when several people work the same load.

Why does weight resolve by container rather than by order?

Because one order can span several pallets. Weight is captured once, when the placard is printed, and carried forward automatically. Keying it on the order number would collapse every pallet in a multi-pallet order to whichever placard was printed last; keying it on the container keeps each pallet's own weight.

Built with

  • Python
  • SQL Server
  • Selenium WebDriver
  • Zebra ZPL
  • Scheduled reconciliation jobs

On the details we left out

Client, location, system names and volumes are withheld deliberately; the savings above are the tracker's dollar estimates, with the minutes, rates and headcount behind them left out. We're happy to go deeper on architecture and approach on a call.

Services this draws on

Workload Optimization

Squeeze more throughput out of the hardware and licenses you already pay for.

See Workload Optimization →

System Integration

Connect aging systems to modern APIs, data platforms, and SaaS tools.

See System Integration →

More projects

Product · Quality & compliance

Warehouse audits that can't be quietly passed

Customer-facing quality audits ran on paper and a survey tool. We built a configurable audit platform with scheduling, escalation, approvals — and a gate that blocks sign-off when the scan doesn't match.

Read the story →
Safety · Equipment control

Equipment that locks itself out when it fails inspection

Powered industrial trucks were signed out on a clipboard, and the fall-protection harness that some of them require was a separate honour system. We built a badge kiosk where the truck you pick decides the inspection you must pass — and which refuses to release anything that fails.

Read the story →
Access Control · Internal platform

Adding a permission shouldn't mean altering the user table

Access was a boolean column on the user record, so every new screen was a schema change. We replaced it with roles that map to screens, credential checks that verify a second person without elevating the first, and a suspension path that fails closed.

Read the story →
Get in touch

Got material leaving on paperwork typed by hand?

Walk us through one load, from the container to the truck, and where the paperwork comes from. Free assessment.

Prefer to talk?

Call 832-598-8234 or email msco@stoneagesoftware.com. Houston, Texas — serving Houston, The Woodlands, Conroe, Sugar Land, Katy, Pearland, and the Greater Houston metro.

What happens next

We read your message, an engineer replies with questions or a straight answer, and if a call would help, we book one. From the first reply on, you're talking to the people who'd do the work.

No obligation — we reply within one business day. This form sends your details to Stone Age Software LLC so we can respond to you. See our privacy policy for how we handle them. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.