Problem
A Swiss ground-transportation operator needed to move off manual, phone- and WhatsApp-based booking onto a self-serve website: customers should be able to book an airport transfer, see a real quote, and pay online, without a human relaying flight numbers by hand.
Constraints
- Go-live needed to land before the client’s summer season ramp-up, so the build was split into demoable phases rather than one long build-and-reveal cycle.
- Local payment expectations in Switzerland meant Stripe alone wasn’t enough — TWINT support was a hard requirement, not a nice-to-have.
- The client wanted to keep post-launch operating costs low: no per-seat CMS licenses, no managed database bill they didn’t understand.
Architecture
A static Astro shell handles marketing and booking-flow pages, with React islands for the interactive quote and booking form. A FastAPI backend owns pricing logic, flight-status lookups, and Stripe/TWINT payment intents; Supabase (Postgres) stores bookings and driver assignments. Cloudflare Pages serves the static build, with FastAPI running as a separate service.
Stack
Astro, React, FastAPI, Supabase, Cloudflare Pages, Stripe (with TWINT).
My role
Sole engineer end-to-end — architecture, frontend, backend, payment integration, and deployment — working directly with the client on scope and phasing.
Outcome
Phase 1 shipped with live flight-tracking integration, so quotes adjust to actual arrival times rather than scheduled ones. Delivered on a phased schedule with a working demo at the end of each phase, which kept the client able to sanity-check direction before the next phase began.