The problem
Kisuge Hardware sits at Makutano Junction in Rongo Town, on the Rongo–Homabay Road. Tiles, boards and timber, doors, fasteners, paints, gypsum. A real retail business doing real volume — and like most hardware yards in the region, running on handwritten dockets, a calculator, and one trusted person’s memory.
Every off-the-shelf POS we evaluated had the same problem: built for somewhere else. None handled M-Pesa STK Push as a first-class payment method. None did fractional units (you sell tiles by the square metre, not the unit). None worked when the fibre dropped, which it does. None spoke the way a Kenyan hardware yard works.
So we built one.
What we built
A three-surface system:
- Mobile POS app (Expo + React Native) — the till that the cashiers and owner actually use, on Android tablets at the counter and phones on the floor.
- Admin dashboard (Next.js) — the back-office surface for inventory, suppliers, reports, GRN, user management.
- API (FastAPI + MongoDB) — everything in between.
Identity is Clerk with owner and cashier roles in publicMetadata; the mobile app shows different drawer items based on role. Media is Cloudinary with signed uploads for product gallery images. Currency is KES. Tax handling reflects Kenya VAT thresholds for retail of this category.
Things we got right
Offline-first cart. The mobile app holds an in-memory cart in Zustand and queues sales locally when the API is unreachable. When connectivity returns, the queue drains. Cashiers don’t see a connectivity error mid-sale; they see the sale completing as normal.
In-cart price editing. Counterintuitive — most POS systems lock the price to the SKU. In a hardware yard the cashier negotiates on the spot, gives a discount on a bulk order, throws in a fraction. The system records the SKU price and the realised price; reporting separates the two so margin loss is visible.
Fractional quantities. You buy half a tin of paint, one and a quarter sheets of plywood, 0.7 cubic metres of sand. The product model carries a unit_of_measure and allow_fractional flag per category.
Sequential receipt numbers and GRN references. Every receipt and goods-received note gets a monotonic reference allocated server-side. No client-side IDs, no gaps, no duplicates even under reconnection.
Receipt PDFs via ReportLab. Server-rendered PDFs in the brand colours (Primary Deep Green #1B4332, Amber Accent #F59E0B), no VAT line (the business operates below the threshold), single authorised signature line. Downloaded, printed to the receipt printer, or emailed via Resend straight from the sale screen.
Architecture decisions worth flagging
One Mongo collection per concept, not per surface. A Sale document is the same shape whether it’s viewed from the mobile till, the admin dashboard, or a report. Reduces the number of places a schema change touches.
Clerk roles in publicMetadata, not custom claims. Survives the Clerk SDK upgrades, doesn’t require a backend re-issue when an owner promotes a cashier.
AsyncMongoClient from pymongo, not Motor. Motor was deprecated in May 2025; the official pymongo async client is the supported path forward. All new CoreLabz Mongo work uses it.
NativeWind v4 for styling, no JS state for visual variants. Tailwind classes only. Keeps the React Native build closer to the web mental model and removes the temptation to reach for a custom theme system.
What it’s doing today
In daily use at Kisuge Hardware. transactions a day; SKUs in inventory; .
Where this is going
There’s a longer thesis here. Hardware yards across the Rongo–Migori–Nyanza region are operating on the same dockets-and-memory pattern; the regional contractor market connecting them to trade professionals is underserved. The POS deployment at Kisuge is the first node — clean data on what the region actually buys, who the suppliers are, what margins look like. It’s a real moat for what could become a national contractor marketplace, if the business case continues to support it.
That’s a longer story. For now, the till works, the inventory balances, and the owner sleeps at night.
MAK Hardware POS is a CoreLabz build, operated by us, used daily by Kisuge Hardware in Rongo Town.