Installation

This page covers installing Showtime on a site that does not already run Owl, Stub, or Headcount. If one of them is already installed, read Upgrading from a standalone plugin first — the order of operations matters and getting it wrong can drop data.

Requirements

  • Craft CMS 5.6.0 or later
  • PHP 8.2 or later
  • MySQL 8.0+ or PostgreSQL
  • Craft Commerce 5.0+ — optional. Only Owl’s event ticketing uses it; everything else takes payment through Stripe directly.
  • A Stripe account, if you will charge for bookings or memberships
  • A PayPal Business account, optionally, for memberships

Showtime pulls in rlanvin/php-rrule, spatie/icalendar-generator, and stripe/stripe-php through Composer. You don’t need to require them yourself.

1. Install via Composer

From your project root:

composer require justinholtweb/craft-showtime

2. Install the plugin

php craft plugin/install showtime

Or go to Settings → Plugins in the control panel and click Install next to Showtime.

Installing Showtime runs one migration that, in turn, installs every mounted module’s schema — 20 tables in all (owl_*, stub_*, headcount_*) plus Showtime’s own showtime_perks. Each module’s schema is recorded under its own plugin:<handle> migration track, exactly as it would be standalone.

You will not see Owl, Stub, or Headcount in the plugin list. That is the point. They are mounted as internal modules, not registered with Craft’s Plugins service, which is why one license covers all three. Their control-panel sections, element types, action routes, Twig variables, and console commands are all live regardless.

3. Enter your license key

Buy a license from the Craft Plugin Store and enter the key at Settings → Plugins → Showtime, or set it in your environment and reference it there. There is only one key — the bundled plugins are never license-checked.

4. Configure the shared credentials

Go to Settings → Plugins → Showtime. The top of that screen is the part that only exists because these plugins ship together:

  • Stripe — secret key, publishable key, webhook secret. Entered once, handed to both Stub and Headcount under their own attribute names.
  • Email — the from-name and from-address used for booking and membership mail.
  • Default currency — e.g. USD.

Below that, Stub’s own settings are inlined, and Headcount’s settings screen is linked (it ships its own control-panel routes). All of it is covered in detail on the Configuration page.

All Stripe fields accept $ENV_VAR syntax, so keep the real values in .env:

STRIPE_SECRET_KEY=sk_live_xxx
STRIPE_PUBLISHABLE_KEY=pk_live_xxx
STRIPE_WEBHOOK_SECRET=whsec_xxx

5. Point your webhooks at the site

Each module keeps its own webhook endpoint, so there is one per payment flow you actually use.

Stub (booking payments) — add a Stripe endpoint for:

https://yoursite.com/actions/stub/webhook/handle

subscribed to payment_intent.succeeded and payment_intent.payment_failed.

Headcount (membership subscriptions) — add a Stripe endpoint for:

https://yoursite.com/actions/headcount/webhook/stripe

subscribed to checkout.session.completed, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, invoice.paid, invoice.payment_failed, and customer.subscription.trial_will_end.

And for PayPal, if you enable it:

https://yoursite.com/actions/headcount/webhook/paypal

6. Set up the scheduled tasks

Two of the three modules want a recurring command. Add them to cron (or your scheduler of choice) — see Console commands for the full list.

# Extend recurring event occurrences toward the rolling horizon
0 3 * * * cd /path/to/project && php craft owl/maintenance/regenerate --queue >> /dev/null 2>&1

# Expire lapsed subscriptions and reconcile with the gateway
0 4 * * * cd /path/to/project && php craft headcount/subscriptions/expire >> /dev/null 2>&1
15 4 * * * cd /path/to/project && php craft headcount/subscriptions/sync >> /dev/null 2>&1

7. Add the module schema step to your deploy

Craft’s own migrate/all only knows about installed plugins, and the mounted modules deliberately aren’t. Showtime ships its own command that brings every mounted module up to date:

php craft up
php craft showtime/migrate/all

It is idempotent, so it is safe to run unconditionally on every deploy. In practice each Showtime release also ships a thin sync migration that does the same thing, so craft up alone usually suffices — running both costs nothing and removes the question.

8. Build something

Nothing is created for you. Once installed, the usual first steps are:

  • Showtime → Calendars — create a calendar, then add events to it (Owl)
  • Showtime → Services and → Providers — define what can be booked, by whom, and when (Stub)
  • Showtime → Plans — create membership tiers and sync them to Stripe (Headcount)
  • Showtime → Member perks — once you have both a plan and a service, link them (see Member perks)

Front-end templating is documented on each plugin’s own site — the Twig APIs are unchanged when bundled. See What’s included for the map.

Uninstalling

Uninstalling Showtime drops every bundled module’s tables. Its uninstall migration runs each module’s uninstall in reverse order, which is the correct behaviour but means all your bookings, events, and subscriptions go with it. Take a database backup first.

php craft plugin/uninstall showtime