Control panel

Three plugins would normally mean three sidebar sections, three dashboards, and three settings screens. Showtime puts one Showtime item in the sidebar and hangs everything off it.

The navigation

The subnav is assembled from every mounted module, and each entry only appears if the current user holds the permission that module registers for it:

ItemGoes toNeeds
Dashboard/admin/showtimeeither stub:viewBookings or headcount-manageSubscriptions
Events/admin/owl/eventsowl-manageEvents
Calendars/admin/owl/calendarsowl-manageCalendars
Bookings/admin/stub/bookingsstub:viewBookings
Calendar/admin/stub/calendarstub:viewBookings
Services/admin/stub/servicesstub:manageServices
Providers/admin/stub/providersstub:manageProviders
Members/admin/headcount/subscriptionsheadcount-manageSubscriptions
Member perks/admin/showtime/perksheadcount-managePlans
Plans/admin/headcount/plansheadcount-managePlans
Reports/admin/headcount/reportsheadcount-viewReports
Settings/admin/settings/plugins/showtimeadmin

If a user has permission for none of it, the Showtime item is hidden entirely rather than shown as a link that 403s on click.

The modules keep their own control-panel routes — /admin/stub/…, /admin/owl/…, /admin/headcount/…. Rewriting every URL in three plugins would be churn for no benefit, and keeping them means bundled and standalone behave identically. The Showtime nav is a front door onto them, not a replacement. Any bookmark or deep link you already have keeps working.

The dashboard

Showtime → Dashboard is the one screen only the bundle can show — bookings and memberships side by side:

  • Bookings today, this week, and pending
  • Today’s booking list
  • Active members
  • Monthly revenue, broken into booking income taken this month and recurring MRR

Revenue is deliberately shown as two components and a combined total. Booking income is money actually taken this month; MRR is a run-rate. They are different kinds of number, and the sum on its own would mislead — so you get both.

Every panel is permission-gated independently and every read is null-safe per module, so the dashboard degrades to whatever is actually mounted and in use rather than failing.

Settings

One composite screen at Settings → Plugins → Showtime: the shared Stripe/email/currency group, Stub’s own settings inlined beneath it, and links out to Headcount’s settings screens. See Configuration.

Stub’s settings are worth a note. Standalone, they were served by Craft’s plugin-settings page — which never fires for a mounted module, so bundling them would have made those settings unreachable. Showtime renders Stub’s own settings template inside its screen, namespaced so the inputs land exactly where Stub expects them. Headcount ships its own control-panel settings routes, which do work when mounted, so those are linked rather than inlined.

Widgets and element indexes

Everything else is unchanged. Headcount’s dashboard widgets are available on Craft’s own dashboard, and the Event, Booking, and Subscription element indexes behave like any Craft element index — custom columns, sorting, search, saved views, trash and restore.