Calendar invite attached to or linked from the confirmation email
Why it matters
Without a .ics attachment, the booking lives only inside your email. Customers have to manually re-type the date, time, and timezone into their calendar — and half of them won't. The no-show rate for booking flows without calendar attachments is measurably higher than flows that attach .ics at confirmation time, because a calendar entry is the only thing that triggers the phone reminder ten minutes before the appointment. A text-only confirmation email is a user-experience failure that directly converts into lost revenue.
Severity rationale
Medium because the gap increases no-show rate and rebooking cost, but the booking itself still exists server-side.
Remediation
Generate the .ics synchronously inside the confirmation handler and attach it to the same email — do not ship a follow-up email with the invite, because customers open the confirmation once and never return. Set the attachment content-type to text/calendar. Edit src/lib/email.ts:
const icsData = await generateBookingICS(booking, booking.host)
await resend.emails.send({
from: FROM_EMAIL,
to: booking.customer_email,
subject: `Confirmed: ${booking.service_name}`,
html: confirmationEmailTemplate(booking),
attachments: [{
filename: 'booking.ics',
content: Buffer.from(icsData).toString('base64'),
contentType: 'text/calendar',
}],
})
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Booking Notifications & Reminders Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
Taxons
History
- 2026-04-18·v1.0.0·Initial import from booking-notifications-reminders·automated