Aziz Motors
A Belgian car showroom was selling entirely through WhatsApp. This replaced that with a searchable inventory, structured enquiries, and a dashboard the owner runs himself.
Role
Solo Developer (End-to-End)
Duration
In active development
Year
2026
Status
Deployed — final testing in progress
3
Applications
1
Developer
90d
Log retention, then auto-deleted
Overview
Every enquiry, every photo, every price negotiation lived in one WhatsApp account. It worked, until it didn't scale — nothing was searchable, nothing was shareable, and nothing survived a lost phone. This project turned that into a system.
The problem
The showroom ran its sales process through WhatsApp. Customers could not browse stock, compare vehicles or share a listing with a partner. The dealer could not tell which cars were drawing interest, could not answer a question without scrolling a chat history, and had no record that outlived the conversation. Reservations, purchase enquiries and import requests all arrived through the same channel with no structure.
Constraints
- Belgian market — the site is Dutch-language, and GDPR applies to every piece of data collected
- A single non-technical administrator, so the dashboard had to be usable without training
- Vehicle specifications vary enormously between cars, so the data model had to absorb that
- A modest budget, which ruled out per-seat SaaS tooling for analytics or content
What I built
Three applications share one server: a public site for browsing and enquiries, an admin dashboard for the dealer, and the API behind both. Buyers filter stock by make, fuel, transmission, price and year, with the filters held in the URL so a search can be shared or bookmarked. Enquiries are structured — a reservation, a sell request and an import request are different things, and each captures what the dealer actually needs to respond. The dashboard shows who is on the site right now and which vehicles they are looking at, which tells the dealer where interest is without a third-party analytics product.
How it fits together
- Express API with MongoDB, chosen because vehicle equipment lists vary in shape from car to car and document storage absorbs that without junction tables
- Two Next.js applications — the public site and the admin dashboard — deployed independently
- Live visitor presence over WebSockets, with an in-memory session map and historical visit logs
- Rotating refresh-token families with reuse detection: replaying a rotated token invalidates the whole family and forces re-authentication
- All interface text in translation files rather than in components, so copy changes never require a developer
Running in production
One Hostinger VPS running all three applications behind Nginx, each as its own PM2 process, with Let's Encrypt certificates across the public, admin and API subdomains. Images are stored and transformed through ImageKit.
My role
- Requirements discovery with the dealer, and the data model that came out of it
- All three applications — public site, dashboard and API
- Authentication, GDPR compliance and the analytics layer
- Server provisioning, deployment and TLS
Outcome
- Stock is browsable, filterable and shareable rather than trapped in a chat thread
- Reservations, sell requests and import enquiries arrive structured instead of as free text
- The dealer can see live interest per vehicle without a third-party analytics product
Last updated
What I Delivered
Replaced a WhatsApp-only sales process with a structured platform
Live visitor analytics built on the existing server rather than a fourth application
GDPR by design — raw IP addresses are never stored and visit logs expire automatically
Refresh-token reuse detection: a replayed token invalidates its entire family
Dutch-language throughout, with every string in translation files