Travel operations · CRM, billing, ticketing
Running a travel agency on something other than WhatsApp
Enquiries in one inbox, quotes in a spreadsheet, hotel confirmations in a chat thread, invoices typed by hand — and a customer asking where their voucher is.
§01The problem
A holiday is sold across a dozen small conversations: an enquiry, a shortlist, a quote, a revision, a payment, a hotel confirmation, a flight, and a stream of anxious questions before departure. In most agencies every one of those lives in a different place — WhatsApp, an inbox, a spreadsheet, a supplier portal — and only the person who took the enquiry knows where anything stands.
The cost shows up in three ways. Deals go cold because nobody owns the follow-up. Invoices are typed by hand and get the numbers wrong. And the moment a customer asks for their hotel voucher or ticket, someone digs through a chat thread to reissue a document that should have been generated once and correctly.
It is the same failure as every other problem I work on: the promises are real, but they live in people's heads instead of in a system.
§02The thinking
The temptation was to buy a generic CRM and bolt travel onto it. That fails because the unit of work isn't a 'deal' — it's a trip, which has passengers, dates, hotels, flights, a payment schedule and documents that must be internally consistent. Modelling that properly was the whole job.
So the data model came first: customers and enquiries at the front, deals for the trips being negotiated, tasks with their own activity, comments and attachments for everything that must actually happen, invoices for money, and hotel and air vouchers as first-class records rather than PDFs someone made in Word.
Making vouchers records rather than documents is the decision that pays for itself. A voucher generated from the deal cannot disagree with the booking, can be reissued instantly when a customer loses it, and updates when a hotel changes — none of which is true of a file emailed once and forgotten.
Payments needed the same treatment. Rather than reconciling bank transfers by hand, invoices carry a payment link and the gateway's webhook closes the loop, so 'has this been paid?' is a field rather than an argument.
The integration surface was chosen by where the truth already lived: property-system APIs for hotel inventory and confirmations, cloud services for identity, storage and the mapping and location data a travel product leans on constantly, and a cloud host for the services and jobs behind it. Nothing exotic — the value was in the join, not the novelty.
+ A trip-shaped data model built from scratch
− a generic CRM with custom fields
# a trip has passengers, legs, suppliers and documents that must stay consistent with each other. Custom fields on a sales object model none of that.
+ Vouchers and tickets as generated records
− documents typed once and emailed
# a document is a snapshot that immediately starts lying. A record regenerates on demand and can never disagree with the booking it came from.
+ Payment links on invoices with webhook reconciliation
− manual bank-transfer matching
# the finance question a business asks fifty times a day should be a field, not an investigation.
+ Tasks with activity, comments and attachments attached to the deal
− a separate to-do app
# context that lives away from the work is context nobody reads. The follow-up belongs beside the trip it's about.
§03What shipped
What shipped is an operating system for the agency: enquiries become customers, customers become deals, deals carry tasks that someone owns, money moves through invoices with payment links, and hotel and air vouchers generate straight from the booking data — consistent every time, reissuable in seconds.
The public website sits on the same spine, so a booking enquiry from the site arrives as a real record rather than an email someone has to re-key.
§04Outcomes
Every trip has an owner
deals and tasks carry names and activity, so follow-ups stop depending on memory
Documents that can't be wrong
vouchers and tickets generate from booking data and reissue instantly
“Has it been paid?” is a field
payment links plus webhook reconciliation replace manual matching
§05Reflection
This one is a useful counterweight to the AI work. There is no model anywhere in it — it's schema design, integration and workflow discipline. It is also the project that most reliably changed how a business ran day to day, which is a humbling thing for someone who spends most of his time on AI products to keep in view.
$ cat takeaways.txt
- ✓ Model the real unit of work — a trip, not a generic deal — or the software fights the business daily.
- ✓ Generate documents from records; a file emailed once starts lying immediately.
- ✓ Plenty of high-value product work has no AI in it at all.