Metaviz AI
SaaS

Bookings, inventory, trip building, quotes, flights, chat and payments — one AI-powered workspace

AI Travel-Operations Platform for African Tour Operators

AI Travel-Operations Platform for African Tour Operators
AI Travel-Operations Platform for African Tour Operators — mobile
Overview

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.

Project overview
— 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

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

BeforeAfter
Build itineraries in Word and price in Excel spreadsheetsButler AI builds a full itinerary from a single natural-language prompt in seconds
Search availability by phoning and emailing each supplier separatelyLive colour-coded availability calendar across all properties in real time
Create PDF quotes manually in Canva or Word — taking hoursBranded white-label PDF quote generated and sent in seconds via email or WhatsApp
Add flights manually from a separate GDS and recalculate totals by handIntegrated flight search inserts flights into the trip day and auto-adds to quote total
Track commissions in a shared spreadsheet with no automationSub-agent commissions auto-calculated and tracked in a PostgreSQL ledger with Stripe webhooks
Coordinate guides, drivers, and clients over WhatsApp with no shared contextPer-trip Socket.IO inbox with voice messages, shared live locations, and resource-hold cards
Feature Showcase

A closer look at every screen

tap any screen to zoom

01 · Home Screen
02 · Inventory Management
03 · User Profile
04 · Trips Bookings
05 · Trip Builder
06 · Search Flights
07 · Select Flight
08 · Search Hub
09 · My Properties
10 · My Vehicle
11 · My Guides
12 · Chats
13 · Itinerary Builder
Features

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
Gallery

A look inside

Screenshot 1
Screenshot 2
Screenshot 3
Screenshot 4
Screenshot 5
Screenshot 6
Tech Stack

Built with

Mobile (Flutter)

Flutter (iOS · Android · Web)Dartflutter_blocMaterial 3Mapbox GLFCMFIDO2 passkeyssqflitemek_stripe_terminal

Web (React)

React 18ViteTypeScriptTanStack QueryTailwindCSSMapbox GLreact-i18nextdnd-kitStripe Checkout

Backend

FastAPIPydantic v2PydanticAIasync SQLAlchemyasyncpgAlembicCelery + RedisREST + WebSocketuvicorngunicorn

Database & Cache

PostgreSQL + pgvectorRedis 7SQLite via sqflite (mobile offline)

AI & Search

OpenAI GPT-4oPydanticAI (model routing + validation)pgvector (semantic search RAG)FastAPI SSE (streaming)

Realtime & Comms

Socket.IORedis pub/subFirebase Cloud MessagingSendGridWhatsApp API

PDF & Assets

WeasyPrintReportLabCloudinary (media CDN + signed URLs)

Payments

Stripe Checkout + webhooksStripe Connect (supplier payouts)Multi-currency 3DSPostgreSQL ledger

Flights

Duffel / Amadeus-style APIFastAPI integration layer

Auth & Multi-Tenancy

Keycloak SSOOAuth2JWT (role-scoped)RBACFIDO2/WebAuthn passkeysArgon2 hashing

Geo & Mapping

PostGISMapbox GL (web + mobile)Clustered trip mapsRoute visualisation

DevOps

DockerGitHub Actions CI/CDNginxLinux production servers
Results & Value

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
01Headline outcome
~40%Faster feature developmentOne event-driven FastAPI core powers all five surfaces, eliminating API drift across clients and dramatically accelerating feature delivery.
02
5
Surfaces, one backendReact SPA, Flutter app, AI chat, PDF engine, and Stripe billing share a single API.
03
Seconds
To quote, not daysMargin-protected pricing plus white-label PDF replaces spreadsheet quote assembly.
04
0
API drift across clientsEvery surface reads the same contract, so clients never fall out of sync.