| Before | After |
|---|---|
| Build itineraries in Word and price in Excel spreadsheets | Butler AI builds a full itinerary from a single natural-language prompt in seconds |
| Search availability by phoning and emailing each supplier separately | Live colour-coded availability calendar across all properties in real time |
| Create PDF quotes manually in Canva or Word — taking hours | Branded white-label PDF quote generated and sent in seconds via email or WhatsApp |
| Add flights manually from a separate GDS and recalculate totals by hand | Integrated flight search inserts flights into the trip day and auto-adds to quote total |
| Track commissions in a shared spreadsheet with no automation | Sub-agent commissions auto-calculated and tracked in a PostgreSQL ledger with Stripe webhooks |
| Coordinate guides, drivers, and clients over WhatsApp with no shared context | Per-trip Socket.IO inbox with voice messages, shared live locations, and resource-hold cards |
Bookings, inventory, trip building, quotes, flights, chat and payments — one AI-powered workspace
AI Travel-Operations Platform for African Tour Operators


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
Problem
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.
Solution
The Butler AI co-pilot, built on GPT-4o and PydanticAI with streaming FastAPI responses, handles the entire operator workflow from a single natural-language prompt — creating enquiries, searching live inventory, building itineraries, generating quotes, and holding bookings in seconds instead of hours of multi-system coordination.
Itinerary building was slow and manual
Problem
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.
Solution
A drag-to-resequence trip builder lets operators arrange day cards containing hotels, vehicles, guides, parks, flights, and activities. The pricing engine recalculates live on every change and the builder flags availability conflicts automatically, powered by PostgreSQL, Redis, and Flutter.
No live inventory visibility
Problem
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.
Solution
A live colour-coded availability grid shows inventory across all properties in real time — exactly what is available, what is held, and what is booked — eliminating double-booking and manual phone checks before any itinerary is built.
Branded quoting was a design bottleneck
Problem
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.
Solution
Operators upload their logo, brand colours, and terms once. Every quote is then auto-rendered as a branded PDF with a per-day breakdown and an Accept & Book CTA, ready to send by email or WhatsApp via WeasyPrint and Cloudinary — in seconds, not hours.
Flights were a separate process
Problem
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.
Solution
Operators search, compare, and insert flights directly into a trip day from inside the platform. Flights are automatically added to the quote total — no switching to a separate GDS or OTA, and no manual recalculation.
Commission and payment tracking was opaque
Problem
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.
Solution
Stripe 3DS multi-currency checkout, supplier-bill tracking, and auto-calculated sub-agent commissions are built into the core. A PostgreSQL ledger tracks every transaction, payout, and commission split with Stripe webhook reconciliation.
Distributed teams had no realtime sync
Problem
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.
Solution
Every trip gets its own Socket.IO + Redis inbox shared by operator, supplier, guide, and client. The Flutter app supports voice messages with waveform display, shared live locations, and inline resource-hold cards — replacing WhatsApp with a structured, context-aware channel.
Before / After
A closer look at every screen
tap any screen to zoom
What it does
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
A look inside






Built with
Mobile (Flutter)
Web (React)
Backend
Database & Cache
AI & Search
Realtime & Comms
PDF & Assets
Payments
Flights
Auth & Multi-Tenancy
Geo & Mapping
DevOps
What actually changed
Five surfaces — React SPA, Flutter app, AI chat, PDF rendering, Stripe billing — run on one event-driven FastAPI core, so a feature ships once and lands everywhere. The enquiry-to-booking pipeline that used to span four tools now executes from a single prompt.
- Delivered a full-stack AI travel-ops platform (React SPA, Flutter mobile, Butler AI, PDF engine, Stripe billing) from a single FastAPI + PostgreSQL backend
- Butler AI co-pilot on GPT-4o + PydanticAI executes the full enquiry-to-booking workflow from natural-language prompts
- Margin-protected pricing engine + WeasyPrint white-label PDF generator replaces days of spreadsheet quoting
- Realtime Socket.IO + Redis per-trip channels with voice messages, shared live locations, and inline resource holds replace WhatsApp coordination
- PostGIS + Mapbox GL continent-wide geo-clustering scales from single operator to DMC-network deployments
- 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



