What you get in the generated ZIP
A typical booking generation includes:
app/blueprints/
├── resource_bp.py # what gets booked (room, person, equipment)
├── availability_bp.py # rules: hours, exceptions, blackouts
├── booking_bp.py # state machine: requested → confirmed → completed → cancelled / no_show
├── reminder_bp.py # scheduled jobs at configurable lead times
├── calendar_sync_bp.py # interface for Google Calendar / Outlook / iCal
└── waitlist_bp.py # queue when fully booked
app/models/
├── resource.py # timezone-aware
├── availability_rule.py # recurring + exception windows
├── booking.py # start_at, end_at stored UTC; computed local at read
└── reminder_log.py # prevents duplicate reminders
What's already wired
- Timezone correctness: every datetime stored UTC. The resource has a timezone. The user has a timezone. The booking carries both. Display layer converts at presentation time. Tests cover DST transitions, leap seconds skipped, ISO 8601 only on the wire.
- Conflict detection: slot reservation uses a database-level constraint preventing overlapping bookings on the same resource. Concurrent reservation attempts get a 409 with the conflicting booking ID for graceful UX.
- Recurring availability: rules support "every weekday 9-5", "every Tuesday 10-2", "the first Saturday of each month" via RRULE notation. Exceptions (holidays, vacation) override.
- Reminders: Celery Beat schedules reminders at configurable lead times (24h, 1h, 15m). The reminder log prevents duplicate sends if Beat re-runs.
- Cancellation policy: configurable refund window with state-machine guard. Cancel-after-window triggers a no-refund flow with optional fee.
- Waitlist: when fully booked, customers can join a waitlist. Cancellations trigger automatic notification to the next person in line.
- Calendar sync: scaffold for Google Calendar / Outlook / iCal via webhook subscription; you wire your own OAuth credentials.
What ships in docs/
docs/decisions/ADR-0007-timezone-storage.md— UTC-only at storage, conversion at presentation, with rejected alternative (per-record timezone)docs/decisions/ADR-0012-slot-conflict-detection.md— database-level constraint vs application-level check, with rationaledocs/diagrams/booking-state-machine.md— Mermaid state diagram of the booking lifecycledocs/decisions/ADR-0015-reminder-scheduler.md— Celery Beat + dedup vs queue-based scheduling
Internal links
- Twilio integration for SMS reminders
- SendGrid integration for email reminders
CTA
Try it — free plan, no credit card. archiet.com.
Generate a booking system, look at the timezone handling and the conflict detection, decide if it's the shape you'd ship.