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.
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 customer | All-day appointment |
| Mark a staff unavailable | Block time |
| Recurring weekly unavailability | Block 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).