Stock counts ten times faster with QR-labelled parts.
A bespoke .NET 8 + MariaDB app on AWS Lambda, built across 11 sequential work orders. Counter staff scan parts on arrival, customers self-register from the website, and the same codebase is now growing into the company's financial-management hub.
Denver Auto Spares strips five different car brands in Port Elizabeth and resells the parts to walk-in, phone and online customers. Off-the-shelf retail and accounting tools don't model what they actually do — a single car becomes a long list of individually-tracked parts, each with photos, pricing and a status (available, in cart, sold, damaged, lost).
Stock counts dragged at the end of every shift. Counter staff captured customer details on paper, then re-typed them into the system, costing roughly twenty minutes per new customer and introducing typos that resurfaced months later on invoices.
Denver Auto Spares brought us a written spec broken into numbered work orders — WO1 through WO11 — and asked us for a bespoke build rather than an automation layer. We worked through the work orders sequentially against a single .NET 8 codebase rather than starting greenfield each time, so every release built on the last.
The app is a custom ASP.NET Core MVC application running on one AWS Lambda function fronted by API Gateway, with MariaDB for storage. The front-end is server-rendered Razor with vanilla JavaScript per page — no SPA framework. Where third-party libraries earned their place, we used them: QuestPDF for invoices, quotes and credit notes; QRCoder for printable part labels with a batch print queue; SixLabors.ImageSharp to resize and thumbnail every part photo on upload; Twilio for the staff PIN login.
We built the public customer-registration form to write directly into MariaDB with input validation and bot protection, removing the paper-and-retype step at the counter. The bank-statement CSV import ships with duplicate detection so a re-uploaded month does not double-book.
- Custom ASP.NET Core MVC app on a single AWS Lambda + API Gateway, with MariaDB for storage.
- Server-rendered Razor + vanilla JavaScript per page — no SPA framework, low overhead for a 10-person shop.
- Per-part tracking with photos, pricing and status (available, in cart, sold, damaged, lost) — a stripped car becomes a structured inventory list.
- QR-coded printable part labels (QRCoder) with a batch print queue.
- QuestPDF invoices, quotes and credit notes.
- Twilio-driven staff PIN login.
- Public customer-registration form writing straight into MariaDB with input validation and bot protection.
- Bank-statement CSV import with duplicate detection so re-uploaded months don't double-book.
- SixLabors.ImageSharp resizing and thumbnailing every part photo on upload.
- Stock counting ten times faster, in the owner's words — manual counts replaced by scan-in on arrival, with periodic audits instead of every-shift counts.
- ≈20 minutes saved per new customer at the counter, plus the typo-driven invoice errors that used to surface months later are gone.
- Bank-statement import surfaces mis-keyed payments before they age, instead of being reconstructed at month-end.
- Eleven work orders shipped sequentially against one codebase — every release builds on the last instead of starting greenfield.
“You guys are on fire.”
- Steady expansion of the same codebase into Denver Auto Spares' financial-management hub — accounts, reporting and adjacent workflows landing on the existing platform rather than as bolted-on tools.
Every exception has a pattern. Let's find yours.
A 20-minute call is usually enough to know whether a pilot makes sense.
Stephan Esterhuizen — Co-founder
Skip the relay. Reach me directly.
Connect with StephanCape Town · South Africa · POPIA-aligned