All work
  • 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.

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.