For a New Jersey manufacturer, TwinCore rebuilt a legacy .NET warehouse app into a custom warehouse management system (WMS) on Angular and .NET. The same web app runs on handheld scanners and on desktop.

Industry
Country
USA
Project duration
18 months
Team
  • 1 frontend developer
  • 2 backend developers
  • 1 designer
Project url
Internal operations system, not public-facing
Outcome
Legacy .NET application replaced by an Angular and .NET WMS FEFO enforced on every pick Every lot tracked to its bin Receiving-to-dispatch running on handheld scanners Migrated module by module, with no big-bang switchover

About the client

A New Jersey manufacturer that makes and distributes its own goods, holding lot-tracked, expiry-dated stock. The warehouse ran on an older in-house WMS, a legacy .NET application that had grown hard to change.

30-day

advance warning on short-dated lots, cutting write-offs the old manual sweep caught only at the stock count

0 shutdowns

for warehouse-wide stock counts, replaced by area-scoped cycle counts running directly during operations

3 live quantities

per SKU (on-hand, reserved, available), tracked down to bin and lot, replacing a single on-hand number

100%

of stock movements on an audit trail

Legacy .NET Modernization to a Custom Warehouse Management System

What client received

  • Legacy .NET migrated to one web app for scanner and desktop

    Problem: The legacy .NET application only ran on a desktop, so the warehouse floor could not use it on handheld scanners.

    Result: single responsive Angular web app on a rebuilt .NET API replaced it. The app runs on both desktop and the handheld scanner's browser. TwinCore migrated it module by module, while the old system stayed live. The floor and the office now use one codebase instead of a desktop tool plus paper at the racks.

  • FEFO-enforced picking

    Problem: Operators picked whichever lot was convenient, so older stock sat until it expired and got written off.

    Result: With FEFO mode active, pick orders are routed to the lot with the earliest expiry date first, ranked per SKU. On the scanner the picker reads one line (bin, lot, days-to-expiry) instead of choosing from a lot list. Earliest-expiry lots clear before they reach the disposal window.

  • Lot- and bin-level inventory tracking

    Problem: The old system tracked one quantity per SKU, with no record of which lot sat in which bin.

    Result: Stock is tracked to rack, bin, and lot, with on-hand, reserved, and available split out per SKU. Putaway directs each pallet to a specific bin. No pick pulls a lot without its expiry attached.

  • Receiving with PO matching and QC hold

    Problem: Inbound deliveries were checked in on paper, so discrepancies surfaced days later, not at the dock.

    Result: Receiving runs against scheduled dock doors, compares expected vs received per line, flags late inbound POs, and places pallets on QC hold before they enter pickable stock. Delayed and short deliveries are visible the moment they arrive, not at month-end reconciliation.

  • Min-stock replenishment with auto-suggest

    Problem: Reorders depended on someone noticing a shelf was getting low.

    Result: The replenishment view lists every SKU below its minimum threshold, suggests an order quantity, and attaches supplier and lead days, with a one-click replenishment order to the right supplier. Stockouts on fast movers drop because critical items surface before they hit zero.

  • Area- and category-scoped cycle counting

    Problem: Accurate counts meant stopping the warehouse for a full physical inventory.

    Result: Count plans scope to one area or category, move through scheduled / in-progress / completed, and record variance per plan. Counting runs area by area while picking continues, so the line never stops.

Project Goal

The legacy .NET application ran on an outdated framework version and carried known bugs. The client wanted it modernized incrementally, without stopping the warehouse.

  • Migrate the application to a newer .NET version
  • Add the warehouse capabilities the legacy app lacked, including FEFO picking, expiry control, replenishment, and cycle counting
  • Fix the bugs already affecting the running system
  • Improve integration with the existing inventory services, syncing a defined subset of data rather than every field
  • Improve the deployment process
  • Make errors easier to find in the logs
  • Strengthen the audit trail

Experts says

Igor G
Igor G
System Architect

“Igor leads technical delivery at TwinCore, with a focus on .NET modernization and custom operational systems for logistics and warehousing. TwinCore has delivered operational and AI-driven systems across logistics and B2B workflows, including a custom AI agent platform for business workflow automation and a load board for the logistics industry.”

  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 1
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 2
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 3
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 4
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 5
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 6
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 7
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 8
  • Legacy .NET Modernization to a Custom Warehouse Management System screenshot 9
Previous slide
    Next slide

    Technologies used

    Angular
    .NET / C#
    migration from legacy .NET
    REST API
    Microsoft SQL Server
    integration layer to existing inventory management system
    barcode scanning on web-capable handheld scanners
    Scroll to top