AI-Powered Travel-Operations SaaS for African Tour Operators
A full-stack, AI-powered travel-operations platform for tour operators, DMCs, hotels, fleets, guides, and agents across Africa. It unifies bookings, inventory, multi-day trip building, branded PDF quotes, in-app flights, partner chat, commissions, and Stripe payments in one workspace, with a built-in OpenAI Butler assistant.
Bookings, inventory, trip building, branded PDF quotes, flights, chat, commissions, and Stripe payments — one AI-powered workspace for every actor in the African travel industry.
This platform is purpose-built for African tour operators, DMCs, hotels, fleet managers, guides, and agents. It replaces the fragmented stack of spreadsheets, WhatsApp threads, and disconnected tools with one unified workspace. The Butler AI co-pilot handles the entire workflow — from creating enquiries and building itineraries to searching inventory, generating quotes, and holding bookings — all from natural-language prompts powered by GPT-4o and PydanticAI.
The platform runs across web (React), mobile (Flutter), and AI chat — all connected to a single FastAPI + PostgreSQL backend. Operators can build multi-day itineraries with drag-to-resequence day cards, search and insert live flights, generate white-label branded PDF quotes in seconds, and collect Stripe payments in multiple currencies with 3DS compliance. Sub-agent commissions, partner chat with voice messages and shared locations, and a real-time availability calendar make this a true end-to-end operations platform for the African safari and adventure travel market.
This platform is a comprehensive operations hub for every actor in the African travel supply chain. It connects tour operators, DMC partners, hotels, vehicle fleets, guides, and sub-agents on a single realtime workspace. The system replaces email chains, WhatsApp groups, and spreadsheet-based quoting with an AI-driven workflow that goes from enquiry to confirmed booking in minutes rather than days.
The Butler AI co-pilot, built on GPT-4o and PydanticAI, can create enquiries, search live inventory across properties, build multi-day itineraries, auto-price trips with margin protection, and generate branded PDF quotes — all from a single natural-language prompt. Realtime Socket.IO channels keep every party — operator, supplier, driver, agent — in sync across web, mobile, and timezones.
The platform is multi-tenant by design, with an org → user → role model enforced by RBAC and Keycloak SSO. Sub-agent seats, referral codes, and automatic commission calculations are built into the core billing layer alongside Stripe multi-currency checkout and supplier-bill tracking.
African Tour Operations Are Still Fragmented Across WhatsApp, Spreadsheets, and Email
- No unified operations workspace — African tour operators managed enquiries on WhatsApp, built itineraries in Word docs, priced trips in Excel spreadsheets, and chased payments via email. Every handoff between these tools introduced delay, errors, and lost context — especially when coordinating across multiple suppliers, guides, and DMC partners simultaneously.
- Itinerary building was slow and manual — assembling a multi-day safari itinerary required cross-referencing availability across hotels, vehicles, guides, parks, and flights in separate systems. A single quote could take days to produce and any change required a full rebuild of the pricing calculation.
- No live inventory visibility — operators had no real-time view of what was available across their supplier network. Double bookings, last-minute conflicts, and manual phone-and-email availability checks were routine, burning staff time and damaging supplier relationships.
- Branded quoting was a design bottleneck — creating professional, white-label PDF quotes required a designer or hours in Canva/Word. There was no automated way to produce a branded per-day breakdown with Accept & Book CTAs and send it via email or WhatsApp at the speed clients expected.
- Flights were a separate process — searching, comparing, and including flights in a trip required switching to a separate GDS or OTA, then manually copying figures into the itinerary and recalculating totals. There was no integrated flight layer that auto-added to the quote.
- Commission and payment tracking was opaque — sub-agent commissions were calculated manually in spreadsheets. Multi-currency payments, supplier bills, and payout records were scattered across bank portals and email threads with no single ledger or automated reconciliation.
- Distributed teams had no realtime sync — operators in Nairobi, guides in the Serengeti, and clients in Europe were coordinating over WhatsApp with no shared live context. Job updates, location sharing, and resource holds had no structured channel, leading to miscommunication and missed logistics.
How We Built One AI Workspace to Replace the Entire African Tour Operator Stack
We architected an event-driven FastAPI + PostgreSQL backend powering a React SPA, Flutter mobile app, and OpenAI Butler co-pilot — five surfaces sharing one API with zero drift. Every pain point was addressed with a specific, production-grade feature built for the realities of African travel operations.
Build itineraries in Word and price in Excel spreadsheets. Search availability by phoning and emailing each supplier separately. Create PDF quotes manually in Canva or Word — taking hours. Add flights manually from a separate GDS and recalculate totals by hand. Track commissions in a shared spreadsheet with no automation. Coordinate guides, drivers, and clients over WhatsApp with no shared context.
Butler AI builds a full itinerary from a single natural-language prompt in seconds. Live colour-coded availability calendar across all properties in real time. Branded white-label PDF quote generated and sent in seconds via email or WhatsApp. Integrated flight search inserts flights into the trip day and auto-adds to quote total. Sub-agent commissions auto-calculated and tracked in a PostgreSQL ledger with Stripe webhooks. Per-trip Socket.IO inbox with voice messages, shared live locations, and resource-hold cards.
The Platform Modules — One AI Workspace, Five Surfaces, One Backend
Butler AI Co-Pilot
Streaming GPT-4o co-pilot that creates enquiries, builds itineraries, searches inventory, generates quotes, and holds bookings from natural-language prompts. PydanticAI validates all structured outputs.
Availability Calendar
Colour-coded real-time grid showing live inventory across all properties. The trip builder reads this calendar and flags conflicts automatically before any booking is made.
Trip Builder + Auto-Pricing
Drag-to-resequence day cards with hotels, vehicles, guides, parks, flights, and activities. The pricing engine recalculates live on every change and outputs a white-label PDF in seconds.
Branded PDF Quotes
Operators upload logo, colours, and terms once. Every quote is auto-rendered as a branded PDF with per-day breakdown and Accept & Book CTA, sent via email or WhatsApp.
Flight Search & Insertion
Search, compare, and insert flights directly into any trip day. Flights are auto-added to the quote total with no manual recalculation required.
Fleet, Drivers & Guides
Manage vehicles, rates, and availability. Driver and guide profiles with languages, ratings, and assignments. Maintenance flags and availability rules enforced across the calendar.
Realtime Per-Trip Chat
Per-trip inbox shared by all parties. Flutter app supports voice messages with waveform display, shared live locations, and inline resource-hold cards.
Stripe Payments & Commissions
Multi-currency 3DS checkout, supplier-bill tracking, and auto-calculated sub-agent commissions with referral codes. PostgreSQL ledger with Stripe webhook reconciliation.
Live Ops Dashboard
Real-time enquiries, holds, bookings, conversion rate, revenue, and margin — plus a clustered geo-map across all operator countries powered by TanStack Query and PostGIS.
Multi-Tenant RBAC
One Flutter codebase serves all roles with tailored dashboards. Sub-agent seats, referral codes, and commission plans enforced at API middleware level with Keycloak SSO and role-scoped JWTs.
Designed for every screen
Web
- Full ops dashboard: real-time enquiries, holds, bookings, conversion, revenue, and margin KPIs
- React trip builder with drag-to-resequence day cards, inventory search, and auto-pricing engine
- Colour-coded availability calendar across all properties and suppliers
- Branded PDF quote generator — upload logo once, generate quotes in seconds
- Flight search, comparison, and insertion into itinerary days
- Fleet, driver, and guide management with availability rules and assignment views
- Stripe payments management: multi-currency checkout, supplier bills, commissions ledger
- Sub-agent management: seat allocation, referral codes, commission plan configuration
- Mapbox PostGIS clustering: continent-wide trip map with country-level drill-down
- Role-scoped views enforced at UI and API middleware level (Keycloak SSO, RBAC JWT)
Mobile
Platforms: iOS 15+ · Android 11+ · Web (React, all modern browsers)
- Butler AI co-pilot accessible from the main screen — create enquiries, build trips, and generate quotes by voice or text
- Full offline capability via SQLite local store — works in remote safari locations without connectivity
- Multi-day itinerary view with drag-to-resequence day cards and live pricing
- Realtime per-trip chat with voice messages, waveform display, and shared live location
- Push notifications via FCM for enquiry updates, booking confirmations, and payment events
- Stripe multi-currency checkout and payment confirmation in-app
- Sub-agent commission tracking and referral code management
- Role-scoped dashboards for operators, DMC partners, guides, and drivers
- Biometric login with Face ID / Touch ID and FIDO2 passkey support
- Mapbox-powered clustered geo-map of all active trips across the continent
Butler AI
An embedded co-pilot in the React admin SPA and Flutter mobile app. Model: OpenAI GPT-4o (primary) via a PydanticAI routing layer. Streaming: FastAPI Server-Sent Events (SSE) for real-time streaming responses. Structured Outputs: PydanticAI validates all structured outputs before any database write. Vector Search: pgvector RAG over past enquiries, quotes, and bookings — every interaction improves accuracy.
System design
The rules that run the product
- All entities follow the lifecycle: Enquiry → Itinerary → Quote → Hold → Booking → Invoice → Payment → Completion
- The pricing engine is margin-protected: operator margin is locked per trip; supplier rates and commissions are calculated separately
- Availability holds are time-bound and auto-release if not converted to a booking within the configured window
- Butler AI outputs are always validated by PydanticAI before any write to the database
- Sub-agent commissions are calculated per-booking based on the assigned commission plan and auto-reconciled with Stripe webhooks
- RBAC is enforced at FastAPI middleware and UI level — role-scoped JWTs restrict data access and write permissions per actor
- Stripe Connect requires supplier onboarding before any payout can be initiated
- All PDF quotes use the operator's uploaded branding assets stored in Cloudinary with signed URL access control
- Butler Enquiry Workflow: Operator sends prompt → Butler creates structured enquiry → inventory searched → availability calendar checked → itinerary draft built → pricing engine runs → branded PDF generated → quote sent to client
- Trip Builder Workflow: Operator opens builder → day cards created → hotels, vehicles, guides, flights inserted → conflicts flagged by calendar → pricing recalculated live → quote PDF rendered → sent via email or WhatsApp
- Booking Confirmation Workflow: Client accepts quote → booking record created → supplier holds converted to confirmed reservations → Stripe invoice generated → payment link sent → commission splits calculated → all parties notified via Socket.IO and FCM
- Realtime Collaboration Workflow: Booking confirmed → per-trip Socket.IO channel opened → operator, supplier, guide, client joined → voice messages, live locations, and resource-hold cards shared inline → all changes synced across web and mobile in real time
- Celery Beat sends follow-up reminders to clients with open quotes at configurable intervals
- FCM push notifications fire on every enquiry update, hold confirmation, booking event, and payment receipt
- pgvector embeddings are computed asynchronously by Celery on every new quote and booking save, improving Butler AI search accuracy over time
- Stripe webhook handler auto-reconciles payments and updates invoice status and commission ledger within seconds
- Alembic migrations run automatically on deployment startup via container hooks
- Availability conflicts are detected and flagged automatically when any inventory item is added to a trip day
Everything inside
Butler AI Co-Pilot
- Create enquiries, build itineraries, search inventory, and generate quotes from natural-language prompts
- Streaming GPT-4o responses via FastAPI SSE for a real-time co-pilot feel on web and mobile
- PydanticAI validates every structured output before any write operation
- pgvector semantic search RAG over all past enquiries, quotes, and bookings
- Multi-turn conversation with full session history maintained across interactions
Enquiry & CRM
- Structured enquiry pipeline with source tracking and status management
- Full client profile with enquiry, quote, and booking history
- Sub-agent seat management with referral codes and commission plan assignment
- One-tap conversion from enquiry to itinerary build
Trip Builder & Quoting
- Drag-to-resequence day cards with hotels, vehicles, guides, parks, flights, and activities
- Live pricing engine recalculates on every change with margin protection
- Availability calendar integration flags conflicts before booking
- White-label PDF quote generation with branded per-day breakdown and Accept & Book CTA
- Automated follow-up reminders via Celery Beat after quote delivery
Inventory & Availability
- Colour-coded real-time availability calendar across all properties and supplier types
- Time-bound resource holds that auto-release if not converted
- Fleet management: vehicle rates, availability rules, maintenance flags
- Driver and guide profiles: languages, ratings, assignments, and availability
Flights
- Search, compare, and insert flights directly into any itinerary day
- Flights auto-added to quote total with no manual recalculation
- Duffel / Amadeus-style API integration for live availability and pricing
Payments & Commissions
- Stripe multi-currency 3DS checkout with automatic reconciliation via webhooks
- Supplier-bill tracking and payout management via Stripe Connect
- Sub-agent commission auto-calculation and PostgreSQL ledger
- Referral code tracking and commission plan configuration per agent
Realtime Chat & Collaboration
- Per-trip Socket.IO + Redis inbox shared by operator, supplier, guide, and client
- Voice messages with waveform display on Flutter mobile
- Shared live location updates within trip channel
- Inline resource-hold cards for in-chat booking actions
Live Ops Dashboard
- Real-time KPIs: enquiries, holds, bookings, conversion rate, revenue, and margin
- Clustered Mapbox + PostGIS geo-map of all active trips across the continent
- Country-level drill-down and per-operator performance views
- TanStack Query for live data refresh without page reload
Multi-Tenant & RBAC
- Org → user → role model with Keycloak SSO and RBAC-enforced at API middleware
- Role-scoped JWT restricts data access per actor: operator, DMC, guide, driver, agent
- Sub-agent seats, referral codes, and commission plan configuration per org
- One Flutter codebase serving all roles with tailored dashboard views
Auth & Security
- Keycloak SSO with OAuth2, JWT, and RBAC
- FIDO2 passkeys and biometric login on Flutter mobile
- Signed Cloudinary URLs for all media access control
- Full audit logging on sensitive operations
Built on a modern stack
Outcomes that move the business
- Delivered a full-stack AI travel-ops platform (React SPA, Flutter mobile, Butler AI, PDF engine, Stripe billing) from a single FastAPI + PostgreSQL backend — ~40% faster feature development, zero API drift
- Butler AI co-pilot built on GPT-4o + PydanticAI executes the full enquiry-to-booking workflow from natural-language prompts, replacing a multi-system manual process with seconds of conversational AI
- Margin-protected pricing engine + WeasyPrint white-label PDF generator replaces days of spreadsheet quoting with a sub-second automated workflow
- Realtime Socket.IO + Redis per-trip channels with voice messages, shared live locations, and inline resource holds replace WhatsApp coordination across distributed teams
- PostGIS + Mapbox GL continent-wide geo-clustering scales from single operator to DMC-network deployments with country-level drill-down on the live ops dashboard
- Multi-tenant RBAC with Keycloak SSO, sub-agent seats, referral codes, and commission plans provides enterprise-grade access control from day one
- Stripe multi-currency 3DS checkout + Connect + webhook auto-reconciliation eliminates manual commission tracking and supplier payout management
See it in action
My Role & Deliverables
Role: Full-Stack Engineer (Travel SaaS) — Python · FastAPI · React · Flutter · OpenAI · Multi-Tenant
Project Description: Built a full-stack, AI-powered travel-operations platform for African tour operators, unifying bookings, inventory, multi-day trip building, branded PDF quotes, flights, chat, and Stripe payments in one workspace. I architected an event-driven FastAPI + PostgreSQL backend serving a React web app, a Flutter mobile app, and an OpenAI Butler co-pilot that runs the full workflow from prompts. I built the margin-protected pricing engine, white-label PDF quoting, realtime Socket.IO sync, PostGIS geo-mapping, and a multi-tenant RBAC model with sub-agent commissions.
Skills & Deliverables:
- Full-Stack Development (Python FastAPI, React, Flutter)
- AI App Development (OpenAI GPT-4o, PydanticAI, pgvector RAG)
- iPad & Mobile App Development (Flutter iOS/Android)
- Multi-Tenant SaaS Architecture (RBAC, Keycloak SSO, org model)
- PDF Generation Engine (WeasyPrint, white-label branding)
- Realtime Systems (Socket.IO, Redis pub/sub, FCM)
- Payments & Commissions (Stripe multi-currency, Connect, webhooks)
- Geo-Mapping (PostGIS, Mapbox GL, continent-wide clustering)



