GalaFlow
A multi-tenant platform for travel agencies. An agent describes a trip in plain language; the AI assistant returns a costed itinerary — flights, hotels, transfers, activities — which the agent then edits, books, invoices, and sends to the client as a branded PDF.

what we delivered
Agencies were quoting trips by hand — spreadsheets for pricing, a Word document per client, and no shared record of what was booked. GalaFlow turns that into one system: the itinerary, the bookings, the invoice, and the client-facing document are all the same object.

AI itinerary drafting
A chat endpoint runs each turn through a session manager that extracts trip parameters — destinations, dates, pax, budget — and assembles a costed itinerary. Replies stream back over Server-Sent Events, so a long answer appears as it is written rather than after a wait.
tenancy that holds at the query layer
Every agency's data is scoped by the tenant, not by controller checks. An ID belonging to another agency raises a record-not-found and returns a 404 — the row is invisible rather than merely forbidden. Roles (admin, agent, viewer) gate actions on top of that.
bookings and billing
Itinerary items carry their own booking state, so a trip can be half-confirmed while flights are still pending. Agency subscriptions run on PayMongo with seat counts, billing cycles, and trial/past-due states tracked against the agency record.
white-label client documents
Agencies set their own logo, colors, typography, and contact details, previewed live against a sample itinerary. Every client-facing PDF and booking email goes out in the agency's branding, not ours.
an audited record
Actions write to a polymorphic audit log, so an agency owner can see who changed a price, who cancelled a booking, and when — the questions that surface when a client disputes what they were quoted.
what this demonstrates
GalaFlow is a full-stack SaaS build — API, frontend, AI integration, billing, and the deployment pipeline around it. Here's what this project shows we can do for you.
Multi-tenant architecture
Tenancy enforced at the data layer, with role-based gates above it. The isolation is structural, so a missed check in a controller cannot leak another tenant's rows.
LLM product integration
An AI feature wired into real domain objects — parameter extraction, itinerary assembly, and streamed responses, behind an adapter that keeps the provider swappable.
Rails API engineering
Rails 8 with PostgreSQL, Redis, and Sidekiq for background work. UUID primary keys, enum-backed state, and health endpoints for liveness, database, and cache.
Subscription billing
Plans, seats, billing cycles, and lifecycle states from trialing through past-due — integrated with a local payment processor rather than assuming Stripe.
Testing across the split
RSpec on the API, Vitest for pure frontend logic, and Playwright for anything that renders or routes — a deliberate division rather than one runner stretched over everything.
CI/CD and observability
Pull-request checks for lint, tests, and dependency audits; staging deploys that poll until the release settles, smoke-test health endpoints, and report to Slack. Sentry on both halves.