Zedule.
CALENDAR

All-day events

Mark an appointment as all-day in the New Appointment modal. The booking spans 00:00–23:59 and renders in a strip above the hour grid that only appears when there's at least one all-day event today.

Updated

Some bookings don’t have a start time. A photographer holding the day for a wedding, a clinic running a vaccination clinic, a venue booked for an event. In those cases, picking a time slot is wrong — you want the whole day marked.

Creating an all-day event

In the New Appointment modal, check All-day event (no specific start time). The time picker hides; the booking gets stored with:

start_at = <date>T00:00:00Z
end_at   = <date>T23:59:00Z
is_all_day = 1

Save — the appointment renders as a full-width pill in a strip above the hour grid, in the staff column it’s assigned to.

The all-day strip

The strip only renders when at least one all-day event exists for the day in view. Empty all-day → no strip → no wasted vertical space. When events do exist:

  • A gutter cell labelled ALL DAY (small, letter-spaced, light)
  • One pill per all-day event per staff column
  • Click a pill → opens the same details modal as a timed event

Multiple all-day events on the same staff render as multiple pills in the same cell, wrapping if necessary.

Timed and all-day on the same day

You can have both. The timed events render in the hour grid as usual; the all-day events sit in their own strip above. Status actions (Mark complete / No-show / Cancel) work the same way on both kinds.

What about block-time?

If you want to mark a staff member unavailable for a whole day — vacation, training, sick day — use Block time instead. Block-time has a Repeat weekly option for recurring unavailability; all-day appointments don’t repeat. Block-time also prevents customer bookings during that window; all-day appointments just hold the slot.

You want…Use…
Hold the whole day for one customerAll-day appointment
Mark a staff unavailableBlock time
Recurring weekly unavailabilityBlock time + Repeat

Backend note

is_all_day is a column on the appointments table. Newer tenants get it via the schema; existing tenants get it on first POST/PATCH that touches the field, via an opportunistic ALTER TABLE (no manual migration needed).