Somerset West, Western Cape, South Africa

Case Study · Custom Web App

Noupoort Mountain Estate

A booking and venue management platform for a 24-cabin wedding estate in the Piketberg mountains. Five interfaces on one platform, replacing phone calls and spreadsheets.

ClientNoupoort Mountain Estate
Status● Live since June 2026
TimelineFull platform in 11 weeks
InterfacesAdmin · Staff · Hosts · Guests · Cleaning

Escape to the mountains, arrive at a working system

Weddings bring up to 150 guests who each need a cabin on a rugged mountainside. Before this platform, the owner tracked 24 cabins in spreadsheets, chased payments through bank statements and coordinated cleaners by text. Now one idea organises everything: cabins are only bookable through an event. The couple shares a code; every booking rolls up to their function with a complete financial picture.

The demos below are working slices in the estate’s own palette. All names, codes and amounts are fictional.

I

The Booking

One code from the invitation. Four steps. Built for elderly guests on phones: big targets, no accounts, no passwords.

Enter the event code

The homepage booking bar accepts WEBER-MALAN-2026; the event name, couple and dates appear instantly.

Enter your event codeWEBER-MALAN-2026Find My Event
II

The Estate Map

Twenty-four cabins at their true GPS positions on MapLibre, colour-coded by booking, payment and cleaning status. Native GeoJSON layers, because HTML markers drifted and stuttered on phones. Tap a marker.

Cabin 12 · Awaiting payment
AwaitingAvailableOut of service
III

The Payments

Guests pay by EFT and claim it; the owner confirms in one click and both sides flip green. It replaced a button that faked success and saved nothing. Try the loop.

Guest portal · NPT-0412

Standard Bank · 07# ### ####Ref: NPT-0412
Amount: R12,400.00 Date: 12 August 2026

Status: No claims yet

Admin · Payment Claims

Confirming updates total paid and flips the booking: UNPAID, PARTIALLY PAID, PAID.

IV

The Invoice

Package tiers, extras, custom items, free-night deductions, deposits and a per-function VAT exemption toggle. One shared line builder feeds the admin invoice and the host proforma, so they can never disagree.

Noupoort Mountain EstateINVOICE
Billed toThe Weber-Malan Wedding
EventWEBER-MALAN-2026 · 12 Dec
DescriptionQtyUnitTotal
Wedding package · 100 guests · 3 courses1R98,000.00R98,000.00
Friday night menu100R240.00R24,000.00
Conference room1R10,000.00R10,000.00
Loyalty discount · returning client-R5,000.00
Subtotal (excl. VAT)R127,000.00
VAT 15%R19,050.00
Deposit received-R30,000.00
Total dueR116,050.00
Banking details print at the bottom with the payment reference. Preview, Save, Print or Send to Host.
V

The Housekeeping

Four cleaners, phones in the field, patchy signal. An installable PWA with PIN login, 56px targets for gloves, photo breakage reports and checklists that schedule themselves from bookings. Tick the boxes.

Cabin 12 · Pre-arrival
📷 Report breakageSign off: Perfect

The estate’s own palette

Warm golds against slate, a serif voice for the guest-facing pages, tight utilitarian type in the admin. Straight from the platform’s Tailwind config.

The ten-step gold scale, with #a8753b as the working primary · slate #2D3E50 for dark surfaces · guest pages set with serif display headings and an italic gold accent, admin pages in compact sans with 11px uppercase eyebrow labels and pill toggles

Function-gated, not open

The estate is a venue, not a resort. Functions own bookings; that one decision shaped the whole data model.

Passwordless guests

Booking reference plus last 4 phone digits. Wedding guests never create accounts.

EFT with claims, not gateways

Card payments were built, then deliberately disabled. The owner prefers EFT with reconciliation, so claims bridge the gap.

Per-cabin date overrides

Cabin 14 arrives Friday, cabin 15 on Saturday, in the same booking. The model bends to real weddings.

Next.js 14 · TypeScript · Supabase (46+ tables, RLS) · MapLibre GL · FullCalendar · React PDF · Resend · PWA · Vercel · 152-page verified builds · Playwright E2E on production

The screens

Public homepage with event code booking bar
Public homepage with event code booking bar
SCREENSHOT: Admin dashboard with upcoming functions
Admin dashboard with upcoming functions
SCREENSHOT: Estate map with 24 colour-coded cabin markers
Estate map with 24 colour-coded cabin markers
SCREENSHOT: Function detail with package and financial summary
Function detail with package and financial summary
SCREENSHOT: Invoice PDF preview with VAT and banking details
Invoice PDF preview with VAT and banking details
SCREENSHOT: Booking flow at the review step
Booking flow at the review step
SCREENSHOT: Guest portal payments tab
Guest portal payments tab
SCREENSHOT: Event host portal with WhatsApp share
Event host portal with WhatsApp share
SCREENSHOT: Payment Claims with Confirm and Reject
Payment Claims with Confirm and Reject
SCREENSHOT: Cleaning PWA checklist on mobile
Cleaning PWA checklist on mobile
SCREENSHOT: Booking calendar resource timeline
Booking calendar resource timeline
Homepage at 320px
Homepage at 320px
“Okay on the bookings for guest, absolute hundred percent, it looks great.”

Jo · Owner, Noupoort Mountain Estate

11weeks to launch
24cabins, mapped and cleaned
5interfaces, one platform
0downtime since launch

Running a venue on WhatsApp and spreadsheets? We should talk.