Menu
Manufacturing

Customer and staff mobile apps extending a legacy dealer management system

A family of mobile apps extending an established dealer management system in two directions at once — a customer app for parts, service, rental and fleet with an offline-capable order basket, and a native staff app for warehouse and yard inventory with barcode scanning.

Client — an equipment and commercial vehicle dealership group
Concept visuals — not actual screenshots
01 — Challenge

Equipment dealerships run on core systems that predate mobile entirely, which shows up at both ends of the business. Customers can't check parts availability or pricing without phoning the counter, and staff performing stock counts work on paper or at a fixed terminal, then re-key everything into the core system afterwards — which is exactly where transcription errors enter. Replacing the core system wasn't on the table; it runs the business, and no dealership wants that risk. Any mobile capability had to work around it instead, including consuming an older XML-based interface directly where no modern service existed.

Two more constraints shaped the build: warehouse and yard work happens in places with poor or no signal, so anything assuming a live connection is unusable exactly where the work occurs. And the trade carries pricing components — core charges, environmental charges — that general e-commerce doesn't model, so getting them wrong means the price quoted isn't the price charged.

02 — Approach

Held the parts basket in an on-device relational database behind a repository abstraction, so assembling an order doesn't depend on connectivity and nothing is lost to a dropped connection or a closed app across a multi-day order. Trade-specific pricing components are modelled as first-class fields on every basket line rather than an adjustment applied at checkout, so the price a customer sees while browsing is the price they pay.

For the staff app, bundled the barcode scanner as an in-repository module rather than an external dependency, giving direct control over scan behaviour in an operation that repeats hundreds of times per stock count. Inventory counting and parts receiving share a single base transaction abstraction — authenticate, scan, accumulate, submit — implemented once so both operations behave identically and new ones are cheap to add. Where the core system only exposed an older XML interface, the client speaks that format directly alongside modern JSON services rather than waiting on a middleware layer that would have delayed the whole project. Staff authenticate with a passcode rather than full credentials, matched to how warehouse staff actually work — short, repeated sessions on a shared or dedicated device.

03 — Impact

Customers can check parts, service, rental and their own fleet without a phone call, and the counter is freed up for enquiries that genuinely need a person. Orders survive interruption because the basket lives locally, stock counts are captured once at the point of counting instead of being transcribed later, and the core system was never put at risk because every capability was delivered as a channel over it rather than a replacement for it.

Stack
React NativeReact NativeTypeScriptReduxSQLiteAxiosJavaRetrofitKotlin
More work
Construction ERP: site planning, daily reports, offers and e-signed invoicing→Water management inspection system with tenant-scoped task workflows→Livestock measurement tracking on monthly subscriptions→

Something holding you back?

New build, rebuild, or adding AI to what you already have — I'll take a look and give you an honest perspective.

Get in touch ↗