AI-Powered Travel-Operations SaaS for African Tour Operators
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.
An AI-powered travel management platform that helps operators manage bookings, trips, quotes, payments, partners, and operations through one unified workspace.
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
Every challenge on the left became a shipped capability on the right.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
The Platform Modules - One AI Workspace, Five Surfaces, One Backend
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.
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.
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.
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.
Search, compare, and insert flights directly into any trip day. Flights are auto-added to the quote total with no manual recalculation required.
Manage vehicles, rates, and availability. Driver and guide profiles with languages, ratings, and assignments. Maintenance flags and availability rules enforced across the calendar.
Per-trip inbox shared by all parties. Flutter app supports voice messages with waveform display, shared live locations, and inline resource-hold cards.
Multi-currency 3DS checkout, supplier-bill tracking, and auto-calculated sub-agent commissions with referral codes. PostgreSQL ledger with Stripe webhook reconciliation.
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.
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.
Two surfaces, one rhythm




Butler Enquiry Flow
- Operator opens Butler chat
- types or speaks trip request
- GPT-4o creates structured enquiry
- inventory searched automatically
- itinerary draft returned
- operator reviews and confirms
Quote-to-Booking Flow
- Enquiry confirmed
- trip builder opened
- day cards arranged with hotels, vehicles, guides, flights
- pricing engine calculates live
- branded PDF generated
- sent to client via email/WhatsApp
- client clicks Accept & Book
- booking confirmed in ledger
Realtime Collaboration Flow
- Booking confirmed
- per-trip Socket.IO channel created
- operator, supplier, guide, and client joined
- voice messages and live locations shared
- resource holds created inline
- all parties synced in real time across web and mobile
A closer look at every screen
The office's command center
Everything back-office in one console — with role-based access drawn as a hard line, not a suggestion.

Meet the 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.
- Create structured travel enquiries from free-form natural-language prompts
- Search live inventory across hotels, vehicles, guides, parks, flights, and activities
- Build complete multi-day itineraries with auto-sequenced day cards
- Run the live pricing engine and output a margin-protected quote
- Generate and send branded white-label PDF quotes via email or WhatsApp
- Place and manage resource holds across the inventory calendar
- Confirm bookings and update the PostgreSQL ledger
- Search past enquiries, quotes, and bookings via semantic vector search
- Streaming responses via FastAPI SSE for real-time co-pilot feel
- PydanticAI validates every structured output before any write operation
How it all fits together
Three layers, read top to bottom — the applications people use, the services that power them, and the infrastructure they run on.
The rulebook under the hood
Everything inside
10 capability groups, laid out as an uneven mosaic — not a wall of identical cards.
The manifest, module by module
- Flutter (iOS · Android · Web) · Dart · flutter_bloc · Material 3 · Mapbox GL · FCM · FIDO2 passkeys · sqflite · mek_stripe_terminal
- React 18 · Vite · TypeScript · TanStack Query · TailwindCSS · Mapbox GL · react-i18next · dnd-kit · Stripe Checkout
- Geo & Mapping: PostGIS (continent-wide geo queries) · Mapbox GL (web + mobile) · Clustered trip maps · Route visualisation
- FastAPI · Pydantic v2 · PydanticAI · async SQLAlchemy · asyncpg · Alembic · Celery + Redis · REST + WebSocket · uvicorn · gunicorn
- AI & Search: OpenAI GPT-4o · PydanticAI (model routing + validation) · pgvector (semantic search RAG) · FastAPI SSE (streaming)
- Auth & Multi-Tenancy: Keycloak SSO · OAuth2 · JWT (role-scoped) · RBAC · FIDO2/WebAuthn passkeys · Argon2 hashing
- PostgreSQL + pgvector (primary + vector search) · Redis 7 (Celery broker + Socket.IO pub/sub) · SQLite via sqflite (mobile offline)
- Docker · GitHub Actions CI/CD · Nginx (reverse proxy) · Linux production servers
- Realtime & Comms: Socket.IO · Redis pub/sub · Firebase Cloud Messaging (push) · SendGrid (transactional email) · WhatsApp API (quote delivery)
- PDF & Assets: WeasyPrint · ReportLab · Cloudinary (media CDN + signed URLs)
- Payments: Stripe Checkout + webhooks · Stripe Connect (supplier payouts) · Multi-currency 3DS · PostgreSQL ledger
- Flights: Duffel / Amadeus-style API · FastAPI integration layer
What actually changed
Engineering outcomes beneath the headline numbers.
See it in action
The platform is live — browse the site, poke the demo, or install the app.





