01 / Marketplace
ChefMarket — A restaurant–supplier B2B marketplace ecosystem
Three mobile apps, an admin panel and a real-time backend — in one ecosystem.
- 3role-specific mobile apps
- 40+admin panel views
- 500msnotification dedup window
01 / Overview
ChefMarket fully digitises restaurant–supplier trade in Azerbaijan: suppliers sell products, restaurants place orders and drivers deliver. Three separate mobile apps (Supplier, Restaurant, Driver), a React admin panel and a Tenant Portal talk to each other in real time through a single .NET 8 backend.
02 / The problem
Restaurant supply ran on phone calls, WhatsApp and paper delivery notes. Nobody knew exactly where an order was, prices could not be compared, and the cash a driver collected was reconciled by hand at the end of the day.
03 / Our approach
Every role got its own app — one each for suppliers, restaurants and drivers — with an admin panel on top. The whole order lifecycle sits on one status flow, pushed to all three parties at the same moment over SignalR. When the network drops, actions go into an offline queue and are replayed on reconnect.
04 / The result
Orders, delivery and cash reconciliation now live in one panel. Suppliers manage their own catalogue through Buy Box competition and bulk price updates, and restaurants collect quotes from several suppliers at once with a tender request.
05 / Key features
What it does.
- 01
Full order lifecycle
Accepted → preparing → ready → on the way, with a real-time notification at every step.
- 02
Buy Box and price competition
Market price comparison and recommendations for the supplier.
- 03
Tender requests
A restaurant asks once and collects prices from many suppliers.
- 04
Logistics board
Waves, routes and stops, plus driver assignment.
- 05
Driver cash reconciliation
Expected versus collected cash, tracked per stop.
- 06
Offline queue
Actions are kept when the network drops and replayed when it returns.
06 / Architecture
How it is built.
One global notification bridge
A single SignalR toast bridge with map-based dedup (a 500ms window) stops the same event being shown twice.
Boundary conversion
Backend PascalCase becomes camelCase at the service boundary, so components never deal with two naming schemes.
Relative URL storage
The database holds only relative paths and IStorageUrlResolver builds the full address, so moving storage never touches the data.
07 / Technology
Tech stack.
- Backend
- .NET 8
- FastEndpoints
- CQRS / MediatR
- Hangfire
- Database
- SQL Server
- Mobile
- React Native 0.83 / 0.84
- React 19 (New Architecture)
- TypeScript 5.8
- Frontend
- React 19
- Horizon UI (Chakra + Tailwind)
- ApexCharts
- State
- Zustand 4
- React Context
- Real-time
- SignalR (WebSocket)
- Firebase Cloud Messaging
- Print and maps
- Bluetooth ESC/POS thermal printer
- react-native-maps
- Monitoring
- Firebase Crashlytics (PII-redacted breadcrumbs)
09 / More work
Related projects.
More marketplace and neighbouring work from the same studio.














