At a Glance
| Project type | Serverless booking platform, SPA and API |
|---|---|
| Sector | Tourism and private transport, Cape Town |
| Core capability | Private tour and shuttle booking with distance based dynamic pricing, real time availability, and automated notifications |
| Built for | JC Shuttles |
| Live at | d2t5f63crizf2.cloudfront.net |
| Stack | React, Vite, TypeScript, Tailwind CSS (S3 and CloudFront), Python 3.12 Lambda on ARM64 behind API Gateway, DynamoDB single table design, Cognito, EventBridge, SQS, Amazon SES, Terraform |
The Challenge
JC Shuttles needed to move away from manual, back and forth coordination for booking private tours and shuttle transport in Cape Town. Pricing quoted by hand does not scale and is easy to get inconsistent. Customers wanted to see attractions, build an itinerary, and get an accurate price without waiting on a reply. The business side needed a way to manage pricing and availability without going back to a developer every time something changed.
The Approach
The platform, built under the name Ndeya Cape Explore, gives customers a self-service flow: browse Cape Town attractions, build a custom itinerary, get dynamic pricing calculated from actual route distance and vehicle type, check real time availability for a date and vehicle slot, and book directly. An admin layer behind Cognito authentication lets JC Shuttles manage pricing configuration and view and manage bookings without touching code. Booking creation and status changes publish events that trigger automated customer notifications, so a confirmed or updated booking does not depend on someone remembering to follow up manually.
Technical Architecture
The platform is a serverless, event driven system on AWS:
- Frontend: React, Vite, TypeScript, and Tailwind CSS, built as a single-page app and hosted on S3 behind CloudFront
- Backend: 13 Python 3.12 Lambda functions on ARM64, behind a REST API Gateway, covering attraction listings, pricing calculation, availability checks, and booking CRUD
- Data: a single DynamoDB table storing bookings, attractions, pricing configuration, and availability slots, with GSIs for status and region, date and category, and customer lookups
- Events: booking created and booking status changed events publish to a custom EventBridge bus, fanning out to a Lambda for email delivery through Amazon SES and to SQS for further notification processing
- Auth: a Cognito User Pool with an admin group gating the pricing and booking management routes
- Pricing: calculated from real route distance (haversine) rather than a flat rate, quoted in ZAR and rounded to the nearest R5
All infrastructure is defined in Terraform, with the state and environment isolated under the client's own AWS footprint.
Status
JC Shuttles is live and serving as the business's customer-facing booking platform, handling the full flow from browsing attractions through to a confirmed booking.
What This Demonstrates
- Translating a real small business operational problem, manual booking and inconsistent pricing, into a self-service serverless platform
- Event-driven architecture used practically: booking events triggering downstream notification logic rather than tight synchronous coupling
- A pricing model grounded in real calculation, distance-based, rather than a static price list
- A clean separation between customer-facing flows and an admin layer, so day-to-day pricing and availability changes do not require developer involvement
JC Shuttles is one example of the business systems and cloud platform work behind ByTheodore's implementation and cloud engineering services.