Email for travel agencies, tour operators and booking platforms
Updated
A trip changes after you book it. Flights move, hotels swap rooms, tours are cancelled. Travel email is therefore less about the first confirmation and more about keeping one source of truth and telling people when it changes.
The lifecycle
| Stage | Email | Key content | |---|---|---| | Booked | Confirmation | Reference, summary, link to itinerary | | Paid | Payment confirmation | Amount, method, balance due date | | Balance reminder | Payment reminder | Amount, deadline, pay link | | Itinerary changed | Change notice | What changed, old vs new, what to do | | Before departure | Check-in and travel info | Check-in link, documents needed | | Disrupted | Disruption alert | What happened, options, contact | | Cancelled | Cancellation | What is cancelled and refund state | | Refund | Refund confirmation | Amount and timing |
Link to the itinerary
Put the live itinerary at a page the traveller can open any time, and have every email link to it. A PDF attached to an old email shows stale flight times, while the link always shows the current plan. The API has no attachments, which pushes you toward the better design.
Time zones
Travel is where time zones bite. Store each segment's time with its local zone, format it in that zone, and label it ("14:35 local time in Lisbon"). Never format all times in the traveller's home zone.
Example: itinerary change (Node.js)
import { Inboxili } from "@inboxili/node";
const inboxili = new Inboxili({ apiKey: process.env.INBOXILI_API_KEY });
export async function sendItineraryChange(booking, change) {
// One email per traveller who should hear about it.
for (const traveller of booking.contactTravellers) {
await inboxili.emails.send({
to: traveller.email,
fromEmail: "trips@yourtravel.example",
fromName: "Yourtravel",
subject: "Change to your trip {{reference}}",
htmlBody:
"<p>Hi {{name}}, your trip {{reference}} has changed.</p>" +
"<p><strong>Before:</strong> {{before}}<br><strong>Now:</strong> {{after}}</p>" +
'<p><a href="{{url}}">View your updated itinerary</a></p>',
textBody: `Your trip ${booking.reference} has changed. View it: ${booking.itineraryUrl}`,
templateData: {
name: traveller.firstName,
reference: booking.reference,
before: change.before,
after: change.after,
url: booking.itineraryUrl,
},
});
}
}
Handling disruption bursts
When a flight is cancelled, hundreds of travellers need emails in minutes. Queue them, send in priority order (earliest departures first), and pace below 120 requests per minute per key. Add an in-app banner too, because the email may arrive late.
Things that go wrong
- Missing local time zone on departure times.
- Duplicate change emails when a supplier feed updates several times. Compare the new itinerary hash with the last one you notified about.
- Promotions inside confirmations. Offers belong in a separate campaign.
- Sending to the booker only. Decide, per message, who needs to know.
Frequently asked questions
- Can I attach a PDF itinerary or e-ticket?
- Not through the Inboxili API, which has no attachment field. Send a link to a hosted itinerary that stays current when plans change, which is better than a PDF that goes out of date.
- How do I email every passenger on a booking?
- The API takes one recipient per request, so send one email per traveller address, usually after deciding which people on the booking should get which message.
Start sending booking emails
Create a workspace, verify a domain, and make your first API call.