Is your proposal related to a problem?
The Insights dashboard displays raw booking counts in the Most Booked and Least Booked Team Members tables, but there is no signal for whether Round Robin distribution is actually balanced. An admin looking at a table where one member has 32 bookings out of 286 across 11 members cannot tell from the raw number alone that this member is 23% above expected. Admins must perform manual mental math to detect distribution drift, and by the time imbalance is visible in raw counts, it has often already compounded.
Describe the solution you'd like
A visual distribution balance indicator added to the existing member stats tables. Specifically:
- A color-coded ring (green, yellow, red, or gray) wrapping each team member's avatar in the Most/Least Bookings Scheduled tables
- The ring color is based on how far each member's actual booking count deviates from the expected equal share (
expectedPerMember = totalBookings / memberCount)
- On hover, a tooltip shows the exact deviation percentage (e.g., "+23% above expected") and the calculated expected count
Thresholds:
| Color |
Deviation |
Meaning |
| Green |
≤ 20% |
Balanced |
| Yellow |
> 20% and ≤ 50% |
Drifting |
| Red |
> 50% |
Significantly imbalanced |
| Gray |
0 bookings |
Insufficient data |
This requires zero backend changes. The calculation runs entirely on the data already returned by the existing membersWithMostBookings query. No new tRPC procedures, no schema changes, no new endpoints.
Describe alternatives you've considered
-
A separate "Distribution Health" chart card: This would add a new card to the Insights dashboard with a bar or radar chart showing balance across all members. We ruled this out because it adds layout complexity and a new component footprint for information that can be conveyed inline with the existing tables.
-
A numeric deviation column in the table: Adding a "Deviation %" column next to the booking count. This works functionally but adds horizontal width to the table on all screen sizes and changes the table layout. The ring indicator conveys the same information without altering the existing structure.
-
Backend-calculated distribution scores: Having the server compute and return a balance metric. Unnecessary for this use case since the client already has all member counts in a single response and the calculation is trivial (deviation from mean).
Additional context
We (Team Dark Launch) set up a full local Cal.com environment and traced the Insights data pipeline end to end: tRPC procedures, InsightsBookingBaseService authorization, the BookingTimeStatusDenormalized PostgreSQL view, the trigger pipeline populating BookingDenormalized, and the frontend components. We seeded 286 bookings via seed-insights.ts and confirmed the pipeline works correctly.
During our audit, we identified this as a genuine gap in the existing member stats UX. The implementation follows HOW_TO_ADD_BOOKING_CHARTS.md patterns and uses the useInsightsBookingParameters() hook for filter state.
Edge cases handled: empty arrays, single-member teams (notice rendered), zero-booking members (gray ring), and date range changes (recalculates).
We have a complete implementation ready to submit as a PR. Under 500 lines across 5 files, yarn lint passes clean, tested against our seeded environment.
Requirement/Document
No external document. The implementation follows existing Cal.com Insights patterns documented in HOW_TO_ADD_BOOKING_CHARTS.md.
Is your proposal related to a problem?
The Insights dashboard displays raw booking counts in the Most Booked and Least Booked Team Members tables, but there is no signal for whether Round Robin distribution is actually balanced. An admin looking at a table where one member has 32 bookings out of 286 across 11 members cannot tell from the raw number alone that this member is 23% above expected. Admins must perform manual mental math to detect distribution drift, and by the time imbalance is visible in raw counts, it has often already compounded.
Describe the solution you'd like
A visual distribution balance indicator added to the existing member stats tables. Specifically:
expectedPerMember = totalBookings / memberCount)Thresholds:
This requires zero backend changes. The calculation runs entirely on the data already returned by the existing
membersWithMostBookingsquery. No new tRPC procedures, no schema changes, no new endpoints.Describe alternatives you've considered
A separate "Distribution Health" chart card: This would add a new card to the Insights dashboard with a bar or radar chart showing balance across all members. We ruled this out because it adds layout complexity and a new component footprint for information that can be conveyed inline with the existing tables.
A numeric deviation column in the table: Adding a "Deviation %" column next to the booking count. This works functionally but adds horizontal width to the table on all screen sizes and changes the table layout. The ring indicator conveys the same information without altering the existing structure.
Backend-calculated distribution scores: Having the server compute and return a balance metric. Unnecessary for this use case since the client already has all member counts in a single response and the calculation is trivial (deviation from mean).
Additional context
We (Team Dark Launch) set up a full local Cal.com environment and traced the Insights data pipeline end to end: tRPC procedures,
InsightsBookingBaseServiceauthorization, theBookingTimeStatusDenormalizedPostgreSQL view, the trigger pipeline populatingBookingDenormalized, and the frontend components. We seeded 286 bookings viaseed-insights.tsand confirmed the pipeline works correctly.During our audit, we identified this as a genuine gap in the existing member stats UX. The implementation follows
HOW_TO_ADD_BOOKING_CHARTS.mdpatterns and uses theuseInsightsBookingParameters()hook for filter state.Edge cases handled: empty arrays, single-member teams (notice rendered), zero-booking members (gray ring), and date range changes (recalculates).
We have a complete implementation ready to submit as a PR. Under 500 lines across 5 files,
yarn lintpasses clean, tested against our seeded environment.Requirement/Document
No external document. The implementation follows existing Cal.com Insights patterns documented in
HOW_TO_ADD_BOOKING_CHARTS.md.