The hard parts
- Timezones: availability lives in the business timezone; storage is UTC.
- Races: a partial unique index makes double-booking impossible at the database level.
- Calendars: a hand-rolled RFC 5545 builder attaches an
.icsto every confirmation.
Email that cannot break bookings
Send after commit, catch everything, and fall back to a capture transport when SMTP is missing.