Metaviz AI
Travel Tech / Tour Operator SaaSCase study

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.

Project Overview

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.

Product overview screenshot — 16:9
— Relevant keywords —
AI Travel Operations PlatformAfrican Tour Operator SaaSMulti-Day Trip BuilderBranded PDF Quote GeneratorButler OpenAI Co-PilotFlutter Travel App
FastAPI Travel BackendStripe Multi-Currency PaymentsRealtime Trip Chat Socket.IOPostGIS Geo-MappingMulti-Tenant RBAC TravelDMC Software Africa
Challenge & Solution

Seven problems, seven pivots

Every challenge on the left became a shipped capability on the right.

Problem 01
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.
Problem 02
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.
Problem 03
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.
Problem 04
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.
Problem 05
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.
Problem 06
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.
Problem 07
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.
Ecosystem

The Platform Modules - One AI Workspace, Five Surfaces, One Backend

01
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.

OpenAI GPT-4oPydanticAIFastAPIStreaming SSE
02
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.

PostgreSQLRedisFlutterFastAPI
03
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.

FlutterFastAPIWeasyPrintMapboxPostgreSQL
04
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.

WeasyPrintCloudinarySendGridFastAPI
05
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.

Duffel / Amadeus-style APIFastAPIFlutter
06
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.

PostgreSQLReact MapFastAPIMapbox
07
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.

Socket.IORedisFlutterFCMFastAPI
08
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.

Stripe CheckoutStripe WebhooksPostgreSQLFastAPI
09
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.

TanStack QueryMapboxPostGISFastAPIReact
10
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.

Keycloak SSORBACJWTFastAPIFlutter
User Experience

Two surfaces, one rhythm

Web dashboard screenshot — 16:9 · gallery slot 1
16:9 · slot 2
16:9 · slot 3
16:9 · slot 4
Console features
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)
Key flows

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
AI Assistant · Embedded

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
Butler AI
online · ready to draft
Embedded
Build a 7-day Tanzania safari for 4 pax in October - two nights Serengeti, two Ngorongoro, three Zanzibar, budget $4,500 pp
Draft ready — grounded in similar past jobs:
Line item · materials— · —
Labour— · —
VATauto
Totalcomputed
What vehicles do we have available in Nairobi between 12–18 March for a group of 8?
Generate a quote for the Okavango Delta itinerary we built yesterday and send it to the client as a PDFShow me all enquiries from European agents this quarter with a value over $10,000Hold the Sanctuary Lodge for 3 nights starting 5 April and add it to the Mombasa itinerary
Chatbot screenshots — 16:9 · replace this mockup once uploaded
Architecture

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.

Layer 1
Client Applications
React 18
Vite
TypeScript
TanStack Query
TailwindCSS
Mapbox GL
react-i18next
Flutter (iOS
Android
Web)
Dart
flutter_bloc
Material 3
Layer 2
Application & AI Services
FastAPI
Pydantic v2
async SQLAlchemy
Celery + Redis
REST + WebSocket
Flutter Mobile App (iOS + Android) - flutter_bloc + GetIt for state/DI; SQLite via sqflite for offline store with prioritised sync queue; Firebase Cloud Messaging for push notifications; Mapbox GL for geo-mapping; biometric login and FIDO2 passkeys; mek_stripe_terminal for Tap-to-Pay
React + Vite Web SPA - React 18 + TypeScript + TanStack Query; TailwindCSS + Mapbox GL; react-i18next for multi-language; dnd-kit for drag-to-resequence trip builder; Stripe Checkout + webhooks for payments
FastAPI Backend (Python) - Async FastAPI with uvicorn/gunicorn multi-worker; SQLAlchemy async + asyncpg; Alembic migrations; Pydantic v2 + PydanticAI; Celery + Redis (task queue + pub/sub); FastAPI WebSocket for realtime per-trip channels
AI Layer - OpenAI GPT-4o (vision + reasoning) via PydanticAI routing; pgvector for semantic search RAG over past quotes and bookings; Streaming SSE responses to web and mobile clients
PDF & Assets Engine - WeasyPrint for branded PDF rendering; ReportLab for complex layouts; Cloudinary for operator media CDN (logos, trip images); SendGrid for transactional email delivery
Geo & Mapping Layer - PostGIS extension on PostgreSQL for continent-wide geo queries; Mapbox GL on web and mobile; clustered trip maps with country-level drill-down; trip route visualisation
Auth & Multi-Tenancy - Keycloak SSO with OAuth2 + JWT; RBAC enforced at FastAPI middleware and UI level; role-scoped JWTs for operator, DMC, guide, driver, agent, and admin; signed Cloudinary URLs for media access control
Infrastructure - Docker + GitHub Actions CI/CD; Nginx reverse proxy; PostgreSQL + pgvector (primary + vector store); Redis 7 (Celery broker + Socket.IO pub/sub); Linux production servers
Layer 3
Infrastructure & Operations
Docker
GitHub Actions CI/CD
Nginx
PostgreSQL + pgvector
Redis 7
Linux
Business Logic

The rulebook under the hood

Rules · the ledger
§1
All entities follow the lifecycle
Enquiry → Itinerary → Quote → Hold → Booking → Invoice → Payment → Completion
§2
The pricing engine is margin-protected
operator margin is locked per trip; supplier rates and commissions are calculated separately
§3
Availability holds are time-bound and auto-release if not converted to a booking within the configured window
§4
Butler AI outputs are always validated by PydanticAI before any write to the database
§5
Sub-agent commissions are calculated per-booking based on the assigned commission plan and auto-reconciled with Stripe webhooks
§6
RBAC is enforced at FastAPI middleware and UI level - role-scoped JWTs restrict data access and write permissions per actor
§7
Stripe Connect requires supplier onboarding before any payout can be initiated
§8
All PDF quotes use the operator's uploaded branding assets stored in Cloudinary with signed URL access control
Workflows · pipelines
Butler Enquiry Workflow8 steps
1Operator sends prompt2Butler creates structured enquiry3inventory searched4availability calendar checked5itinerary draft built6pricing engine runs7branded PDF generated8quote sent to client
Trip Builder Workflow10 steps
1Operator opens builder2day cards created3hotels4vehicles5guides6flights inserted7conflicts flagged by calendar8pricing recalculated live9quote PDF rendered10sent via email or WhatsApp
Booking Confirmation Workflow7 steps
1Client accepts quote2booking record created3supplier holds converted to confirmed reservations4Stripe invoice generated5payment link sent6commission splits calculated7all parties notified via Socket.IO and FCM
Realtime Collaboration Workflow10 steps
1Booking confirmed2per-trip Socket.IO channel opened3operator4supplier5guide6client joined7voice messages8live locations9and resource-hold cards shared inline10all changes synced across web and mobile in real time
Automations · trigger → action
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
Features

Everything inside

10 capability groups, laid out as an uneven mosaic — not a wall of identical cards.

01Butler 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
02Enquiry & 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
03Trip 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
04Inventory & 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
05Flights
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
06Payments & 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
07Realtime 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
08Live 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
09Multi-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
10Auth & 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
Tech Stack

The manifest, module by module

Frontend
  • 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
Backend
  • 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
Database
  • PostgreSQL + pgvector (primary + vector search) · Redis 7 (Celery broker + Socket.IO pub/sub) · SQLite via sqflite (mobile offline)
DevOps
  • Docker · GitHub Actions CI/CD · Nginx (reverse proxy) · Linux production servers
Tools
  • 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
Results & Value

What actually changed

01
🤖
AI as a First-Class Tool
02
~40% Faster Feature Development
03
📄
Days of Quote Work Replaced by Seconds
04
🌍
Continent-Wide Geo Scale
05
🏢
True Multi-Tenancy from Day One
06
💬
Realtime for Distributed Teams
07
💳
Automated Commission & Payment Tracking
Key achievements

Engineering outcomes beneath the headline numbers.

A1Delivered 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
A2Butler 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
A3Margin-protected pricing engine + WeasyPrint white-label PDF generator replaces days of spreadsheet quoting with a sub-second automated workflow
A4Realtime Socket.IO + Redis per-trip channels with voice messages, shared live locations, and inline resource holds replace WhatsApp coordination across distributed teams
A5PostGIS + Mapbox GL continent-wide geo-clustering scales from single operator to DMC-network deployments with country-level drill-down on the live ops dashboard
A6Multi-tenant RBAC with Keycloak SSO, sub-agent seats, referral codes, and commission plans provides enterprise-grade access control from day one
A7Stripe multi-currency 3DS checkout + Connect + webhook auto-reconciliation eliminates manual commission tracking and supplier payout management

See it in action

The platform is live — browse the site, poke the demo, or install the app.