Booking confirmation email: send it when the slot is locked
Updated
A booking confirmation answers "is this really booked?". It is opened more than almost any other email, and customers keep it as proof of what they bought and when.
What it should contain
- The service, date, start time and time zone
- Where to go, or the video link
- Price and payment status
- A booking reference
- A link to change or cancel
- A calendar link
When it fires
When the reservation becomes final in your database. If payment is part of the booking, wait for the payment provider's success event. Send the confirmation from the same code that commits the booking so the two cannot drift apart.
Implementation (PHP with the SDK)
<?php
use Inboxili\Client;
function sendBookingConfirmation(Client $inboxili, array $booking, array $customer): void
{
$when = (new DateTimeImmutable($booking['starts_at_utc'], new DateTimeZone('UTC')))
->setTimezone(new DateTimeZone($booking['time_zone']));
$inboxili->emails->send([
'to' => $customer['email'],
'from_email' => 'bookings@yourdomain.com',
'from_name' => 'Acme Studio',
'subject' => 'Booking confirmed: {{service}} on {{date}}',
'html_body' => '<p>Hi {{name}}, you are booked for <strong>{{service}}</strong>.</p>'
. '<p>{{date}} at {{time}} ({{zone}})<br>{{place}}</p>'
. '<p>Reference: {{reference}}</p>'
. '<p><a href="{{ics_url}}">Add to calendar</a> · <a href="{{manage_url}}">Change or cancel</a></p>',
'text_body' => "Booked: {$booking['service']} on {$when->format('Y-m-d H:i')} ({$booking['time_zone']}). Manage: {$booking['manage_url']}",
'template_data' => [
'name' => $customer['first_name'],
'service' => $booking['service'],
'date' => $when->format('l, j F Y'),
'time' => $when->format('H:i'),
'zone' => $booking['time_zone'],
'place' => $booking['place'],
'reference' => $booking['reference'],
'ics_url' => $booking['ics_url'],
'manage_url' => $booking['manage_url'],
],
]);
}
Store starts_at_utc and format it per booking, so daylight saving changes cannot shift a confirmed time.
Sample email
Subject: Booking confirmed: Haircut on Friday, 9 October 2026 Hi Ada, you are booked for Haircut. Friday, 9 October 2026 at 14:30 (Europe/London), 12 Market St. Reference: BK-20931. Add to calendar · Change or cancel
Things that go wrong
- Missing time zone. "2pm" is ambiguous for anyone travelling or booking remotely.
- Calendar file as an attachment. The API cannot send attachments. Serve the
.icsfrom a signed URL. - Confirming before payment clears. Then cancelling leaves a customer with a false confirmation.
- No link to cancel. People then reply to the email, which goes nowhere.
- Two confirmations. Guard with a
confirmation_sent_atcolumn, because the API has no idempotency key.
Delivery events
A bounced confirmation means the customer has no proof of booking. Surface it to your staff so someone can phone or text.
Deliverability notes
Booking mail is expected and transactional. Keep upsells out of it, and send reminders as a separate appointment reminder.
Frequently asked questions
- Can I attach a calendar (.ics) file?
- Not through the Inboxili API, which has no attachment field. Link to a hosted .ics URL that your server generates, or to Google and Outlook add-to-calendar links.
- When exactly should the email be sent?
- After the booking is final: payment captured if payment is required, and the slot is reserved in your database. Not when the customer clicks the button.
Official SDKs
Send your first booking confirmation
Create a workspace, verify a domain, and make your first API call.