WorkestraDocs
PlatformCalendar & Scheduling

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).

Calendar dashboard upcoming tab

Screenshot needed — /calendar with Upcoming tab selected and several meetings listed

The four tabs

TabWhat it shows
UpcomingConfirmed meetings with starts_at ≥ now, oldest-first (next meeting at the top)
PastConfirmed + completed meetings whose starts_at is in the past, newest-first
No-showsMeetings the host marked as no_show after the fact
CancelledMeetings 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)
  • ActionsJoin 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.