Case Study

JC Shuttles

From business requirement to cloud solution.

At a Glance

Project typeServerless booking platform, SPA and API
SectorTourism and private transport, Cape Town
Core capabilityPrivate tour and shuttle booking with distance based dynamic pricing, real time availability, and automated notifications
Built forJC Shuttles
Live atd2t5f63crizf2.cloudfront.net
StackReact, 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.