- DevOps & Infrastructure
- Web Development
Bethany House omni-channel commerce platform
One system for the online store, the shop floor and the workshop, so every channel sees the same stock and orders in real time.
- Client
- Bethany House, Kenya
- Stack
- Docker Flutterwave GitHub Actions Laravel Livewire M-Pesa mailcow Next.js nginx Paystack PostgreSQL
- Links
- Live site
The context
Bethany House sells online and through physical outlets, and makes many of its products in-house with a team of tailors.
The problem
Online and in-store sales needed to draw on the same inventory. Production, purchasing and reporting also had to live in one place, with each member of staff seeing only what their job requires.
What we built
A headless platform with a Laravel REST API at its centre, serving three interfaces.
Online storefront
Built in Next.js and server-rendered for speed and search. It runs in English, French and Portuguese, prices in Kenyan Shillings or US Dollars based on the visitor's location, and takes payment by M-Pesa, Paystack or Flutterwave.
Admin dashboard
Built in Laravel Livewire, covering products, inventory across outlets, orders, returns, procurement and reporting. A production module tracks bills of materials, tailor task assignments, work in progress and material use.
Point of sale
For the physical outlets, with SKU search, split payments across cash, M-Pesa and card, thermal receipts and end-of-day cash reconciliation.
Access and security
Access is controlled by six configurable roles, from Super Admin to POS Clerk and Tailor. Admin accounts use two-factor authentication, and every change is recorded in an audit trail.
How it runs
The whole platform runs in Docker Compose behind nginx, with only ports 80 and 443 exposed. GitHub Actions tests every change with PHPUnit and Jest, builds images tagged by commit, and deploys to production. Staging and production have separate branches, and certificates come from Let's Encrypt.
For email, I set up a self-hosted mailcow server on a VPS with outbound relay through Brevo and SPF records for deliverability, and connected the Laravel application over SMTP.