For a manufacturer we built a CRM/ERP system that supports the full process for exclusive, hand-built bespoke products. The starting point felt less like a typical ERP engagement and more like a digital mirror of a craft: every item is unique, every process counts dozens of actions, and every component has its own lifecycle from order to assembly.
Before this project, administration was largely paper-based. Order slips, status cards, inventory lists — all useful in the workshop, but awkward as soon as a question needs to be answered by multiple people in multiple places. A customer question about an item's status often meant a tour past colleagues with the paper stack in hand.
We built a real-time application where internal staff track the status of each item, the status of ordered parts, and delivery progress. Status changes made in the workshop are visible in the showroom immediately; incoming orders link automatically to the right in-progress items.
Under the hood sits a Kotlin back-end on Vert.x with PostgreSQL as the database. The choice for Vert.x was deliberate: the system must handle many events and updates without lag, and must comfortably handle websockets for real-time signaling to the Angular 8 front-end.
Traceability was a key theme. For exclusive bespoke products every component must always be traceable — back to who ordered it, when it arrived, which quality check it passed, and which item it ultimately ended up in. We anchored traceability as a first-class concept in the data model, not as a byproduct of scattered log files.
Moving from paper to this system was not so much a technology project as a change project. We involved the workshop craftspeople and commercial staff early in screen designs, ran small pilots in sub-processes, and only scaled up as trust grew. The result is a system that genuinely helps them rather than adding extra work alongside their existing way of doing things.
Outcomes
- Paper administration replaced by one realtime system
- Traceability per component anchored as a first-class concept in the data model
- Workshop status changes visible immediately through websockets on Vert.x with Angular 8