
01 · Business management system
BizSyncer
Business operations, synchronised.
- Category
- Business management system
- Role
- Product design & full-stack engineering
- Built by
- Empire Pro Dev
- Links
- Live product


Screens
BizSyncer interface
Overview
A business management platform bringing sales, inventory, point of sale, services, customers, expenses, branches, staff, reports, assets and debt management into one operational system.
Product areas
- Sales
- Inventory
- Point of sale
- Services
- Customers
- Expenses
- Branches
- Staff
- Reports
- Assets
- Debt management
Technologies
- Next.js
- TypeScript
- Tailwind CSS
- Supabase
- PostgreSQL
- Prisma
Case study
From problem to product
The complete engineering lifecycle behind BizSyncer.
- 01
Problem
Running a business means tracking sales, stock, services, staff, branches, expenses and debts at the same time, usually across disconnected tools or paper records.
- Sales, stock and debts kept in separate notebooks and spreadsheets
- Owners with several branches cannot see the whole business in one place
- Unreliable internet at the counter stops cloud-only tools from working
- 02
Idea
BizSyncer: one operational system where every part of the business stays in sync, from the point of sale to the final report.
- One account per business, with its branches and staff underneath
- A point of sale that keeps working offline and syncs when the connection returns
- Reports built from the same records the counter creates
- 03
Approach
BizSyncer started as a Django back end with a separate Next.js front end. As the product grew, I moved the back end into Next.js route handlers that read the same PostgreSQL database through Prisma, so the whole product now ships from one codebase with its data model intact.
- Build around the daily routine at the counter: sell, restock, record expenses, close the day
- Ship small increments on a live product rather than one large release
- Treat offline behaviour as a requirement from the start
- 04
Architecture
Operations, resources, finance and customer relationships are modelled as connected domains, all feeding a shared reporting layer.
- Route handlers grouped by domain: sales, products, services, debts, expenses, assets and branches
- Owner and staff permissions checked on the server for every request
- Subscription status controls write access when a plan expires
System architecture
4 layers · 11 modules
L01Operations
3 modules- Point of sale
- Sales
- Services
L02Resources
4 modules- Inventory
- Assets
- Branches
- Staff
L03Finance & relationships
3 modules- Expenses
- Debt management
- Customers
L04Insight
1 module- Reports
Conceptual architecture: layers and their responsibilities. - 05
Design
The interface is organised around the tasks a shop owner repeats every day, with the point of sale one tap away and every list searchable and filterable.
- A bottom navigation bar on phones and a full sidebar on desktop
- Skeleton loading states, so screens never jump while data arrives
- Receipts, invoices and reports laid out to be printed or shared
- 06
Development
BizSyncer is written in TypeScript end to end, from React Query data hooks in the interface to Prisma queries on the server.
- Barcode scanning with the device camera at the point of sale
- Product photos and receipts uploaded straight to Cloudflare storage through short-lived signed links
- A local IndexedDB store and sync queue that record work offline and replay it in order once back online
- Mobile-money subscription payments confirmed by a verified webhook
- 07
Data
Every transaction becomes structured operational data, which forms the basis for reports that describe how the business is actually performing.
- Daily summaries with net profit per product
- Debt histories with every payment recorded against the customer
- Tanzanian regions, districts, wards and streets as reference data for addresses
- 08
Testing
Every change is type-checked and linted, and each workflow is exercised in the browser both online and offline before it reaches the live product.
- Offline sales tested by dropping the connection mid-sale and confirming the queue replays
- Permissions tried from staff accounts, not only from the owner's
- Expired-subscription behaviour checked so data stays readable but locked for editing
- 09
Deployment
BizSyncer runs in production at bizsyncers.com on serverless hosting, with the PostgreSQL connection pool tuned for short-lived functions.
- Installable as an app on phones and desktops
- A service worker caches the app shell, so it opens without a connection
- Search metadata, a sitemap and public landing pages for discovery
- 10
Result & current state
BizSyncer is live in production and keeps growing feature by feature on the same codebase.
- Sales, services, stock, debts, expenses, assets, branches and staff in one system
- Keeps working at the counter when the internet drops
- A platform admin area for businesses, subscriptions and reports
What building it taught.
Challenges
- Keeping sales recorded offline consistent with the server once the connection returns
- Moving the back end off Django without disrupting a live product and its data
- Showing staff only what their role allows while owners see everything
Solutions
- A local sync queue with optimistic updates that replays changes in order and reconciles with the server
- Prisma pointed at the existing database, so the new route handlers read the same tables the old API wrote
- Staff permissions stored per branch and enforced in every route handler
Lessons
- Offline support has to shape the data layer from the start; it cannot be bolted on later
- A back-end port is safest when the database stays the single source of truth
- Small, frequent releases on a live product surface problems while they are still small





