Calendar Dashboard
One workspace surface for everything booked — upcoming, past, no-shows, and cancellations, with a per-host filter.
Calendar Dashboard
The calendar dashboard at /calendar is the host-side view of every meeting booked through any of the workspace's booking links. It's a read-first surface — you came here to see what's on, not to schedule (that's Booking Links) and not to attend (that's the public /book/<slug> page).
Screenshot needed — /calendar with Upcoming tab selected and several meetings listed
The four tabs
| Tab | What it shows |
|---|---|
| Upcoming | Confirmed meetings with starts_at ≥ now, oldest-first (next meeting at the top) |
| Past | Confirmed + completed meetings whose starts_at is in the past, newest-first |
| No-shows | Meetings the host marked as no_show after the fact |
| Cancelled | Meetings cancelled by attendee or host |
Rescheduled meetings don't appear in Past as ghosts — only the new confirmed row counts. The original rescheduled placeholder is kept in the database for audit but hidden from these tabs to avoid double-counting.
The host filter
The dropdown on the right of the tabs lets you pick whose meetings you're looking at:
- My meetings (default) — only the events where you are the host
- Everyone — all hosts in the workspace
- A specific user — pick a teammate from the dropdown
This lets a sales manager review the team's booked pipeline, an HR lead see all upcoming interviews, or a customer success lead audit which CSMs have customer calls this week.
Permission-wise, the workspace policy on who can see whose meetings is governed by RLS on scheduling_calendar_events. By default, every workspace member can read every event in the workspace. If your workspace has a stricter policy (HR-only, manager-only, etc.) the host filter respects it — you'll only see hosts you have permission to read.
What's in the table
Each row shows:
- Attendee — name + email
- When — formatted with day, time, and duration (compact when both ends are on the same day)
- Status — colored badge (Confirmed / Completed / Rescheduled / No-show / Cancelled)
- Actions — Join button when a meeting URL (e.g. Google Meet) is set; otherwise a placeholder
Clicking a row takes you to the event detail. (Full detail panel with cross-module links — deal, contact, ticket — ships with the AI Panel work in the scheduling roadmap's Phase 3.)
Empty states
Each tab has a tailored empty state:
- Upcoming, empty → "Share a booking link to start collecting meetings" with a deep-link to
/settings/booking-links - Past, empty → "Completed and historical meetings will land here"
- No-shows, empty → "Marking attendees as no-show keeps your stats clean"
- Cancelled, empty → "Cancellations from the public reschedule flow appear here"
Performance
The dashboard reads scheduling_calendar_events directly via Supabase, with the bucket filter applied server-side (so the Upcoming tab doesn't have to walk past + cancelled + no-show events). Default cap is 200 rows per bucket; the cache slices by bucket × host so flipping tabs is instant.
For workspaces with thousands of meetings, paging + a date-range picker arrive when we ship the month-grid view (Phase 2 of the scheduling completion plan).
What this page is not
- Not a calendar view — there's no month grid (yet). Phase 2.
- Not where you create meetings — that's the booking link config + the public attendee flow. Internal meetings (one-off "let's grab a coffee") still go through your real calendar app for now.
- Not a CRM activity log — for that, look at the contact's or deal's activity feed in
/crm. Bookings auto-create those, but the source of truth for activity history lives there.
Read next
- Booking Links — set up the links that feed the dashboard
- Reschedule & Cancel — what status transitions look like
- Google Calendar Integration — how meetings sync out to your real calendar