Events & Classes

Run paid classes, range days, and private lessons directly from your store. Sell seats with inventory tracking, capture digital waivers, email reminders, and give attendees a self-service registration dashboard โ€” all without leaving the admin.


Features

Feature Description
Single & bundle events Standalone classes or multi-session courses bought with one registration
Sessions Multiple datetime occurrences per event with per-session capacity
Recurring generator Spawn N weekly/daily occurrences from a template in one step
Tiered pricing Product variants for General / Member / VIP seat types
Waivers Required or optional per event, signed with a digital signature pad
Email reminders Automatic 24-hour and 1-hour reminders before each session
Roster management Check-in, resend reminders, cancel, and move attendees between classes
Customer dashboard Self-service "My Registrations" card on the customer account page
Cancellation windows Per-event policy defines how far in advance customers can cancel
One-seat-per-order Enforce individual checkouts so each attendee signs their own waiver
Theme integration Four storefront sections (list, carousel, hero, detail) via the visual editor

Prerequisites

Before setting up, you need:

  • Events & Classes plugin activated from Settings > Plugins
  • (Optional) Customer Accounts enabled in Settings > General if you want to require login before customers can register

Setting Up

  1. Navigate to Settings > Plugins
  2. Find Events & Classes
  3. Click Activate
  4. Navigate to Plugins > Events
  5. Click Create event to add your first class
  6. Add the Events sections to your theme through the visual editor (see Theme Integration)

Event Types

Type When to use Seat inventory
Single One-off classes, weekly recurring classes (each week is its own event) Per session
Bundle Multi-week courses where one purchase covers every session (e.g. 4-Week Defensive Handgun) One pool across all sessions

Behind the scenes each event is backed by a regular product (product_type = 'event'), so cart, checkout, Fortis payment, tax, and receipts use the same flows as any other product. The backing product is hidden from the catalog โ€” the only purchase path is the event page.


Creating an Event

  1. Plugins > Events > Create event
  2. Fill in:
    • Title, description, cover image โ€” what shoppers see in listings
    • Type โ€” single or bundle (see above)
    • Instructor, location, timezone, address โ€” shown on the detail page
    • Minimum age, difficulty level, what to bring โ€” optional metadata
  3. Add sessions โ€” each session needs a start/end datetime, capacity, and price (for single-type events)
  4. Waiver (optional) โ€” toggle Require waiver and provide the waiver text
  5. One-seat-per-order (optional) โ€” toggle this if you want each attendee to check out separately so everyone signs their own waiver
  6. Status โ€” draft (hidden), published (live), cancelled, or completed
  7. Save

Recurring Series

Use Generate recurrence inside the event form to create N occurrences at once (e.g. every Tuesday at 6 PM for 6 weeks). This produces N independent single events โ€” no runtime recurrence logic, so future edits only affect the class you edit.

Tiered Pricing

To offer General / Member / VIP price tiers on one event, edit the backing product's variants after the event is created. The tier label appears on the roster next to each attendee.


Waivers

Events flagged Require waiver collect a digital signature from every attendee.

  1. After checkout, the attendee sees a "Sign waiver" button on the order confirmation page and on My Account > My Registrations.
  2. A modal opens with the waiver text and a signature pad.
  3. The signed snapshot, signature image, IP address, and timestamp are stored on the registration record.
  4. Admin can view/download the signed waiver PDF from the roster.

If an attendee can't sign at checkout (email order, admin-created registration, etc.), use Email waiver link from the roster row's action menu to send them a direct link to the sign-waiver modal.


Email Reminders

Automatic reminders go out before each session:

Mailable When
Registration confirmation Immediately on successful purchase, with waiver PDF attached if signed
24-hour reminder 24 hours before the session start time
1-hour reminder 1 hour before the session start time

To disable reminders per event, uncheck Send reminders in the event form.

Reminders are sent automatically โ€” no manual intervention needed.


Roster Management

Navigate to Plugins > Events, click an event, and open the Roster tab.

Per-Attendee Actions

Action What it does
Check in Stamp attendee as checked in (clearable)
View waiver Open the signed waiver PDF
Email waiver link Send the attendee a link to the sign-waiver modal (only when required and not yet signed)
Resend reminder Queue a new 24-hour reminder email
Move to another event Transfer the registration to a different event/session
Cancel registration Free the seat and mark the registration cancelled

Export

Export CSV downloads the active (non-cancelled) roster with name, email, phone, session, tier, waiver status, and check-in timestamp.

Moving an Attendee

When a customer can't make their class, admin can move them to another event instead of refunding.

  1. Click the row's action menu โ†’ Move to another event
  2. Pick the target event (and session for single-type events)
  3. Optionally add a reason โ€” it's saved to the registration's internal notes
  4. Confirm

The system atomically frees the source seat, claims a seat on the target (refusing if sold out), and rewrites the registration's event/session. No money moves โ€” for price differences, handle the refund or invoice manually.

Cancelling a Registration

Admin cancellation from the roster frees the seat immediately and emails the attendee. Refunds are not processed automatically โ€” the admin decides whether to refund based on the event's cancellation policy and timing.


Customer Experience

Registration

  1. Customer visits /events or lands on an event via an Event List / Carousel / Hero section.
  2. Clicks Reserve my seat โ€” the seat is added to their cart.
  3. Completes checkout like any other product.
  4. On the order confirmation page, signs the waiver if required.

My Registrations

Logged-in customers see a My Registrations card on their /account page (auto-appears when customer accounts are on and the plugin is active). Per registration they can:

  • Download the signed waiver PDF
  • Add the session to their calendar (.ics file)
  • Sign the waiver (if required and not yet signed)
  • Cancel the registration (within the cancellation window โ€” event's published policy text is shown inline)

Cancellation frees the seat on the source event. Refunds are handled per the event's published policy, not automatically โ€” the customer sees a note explaining that.


Cancellation Policy

Each event has two settings that govern cancellations:

Setting Purpose
Cancellation policy Free-text text shown to customers before they cancel (e.g. "Full refund up to 24 hours before start; no refunds after that")
Cancellation window (hours before start) How many hours before the session start the customer can self-cancel

After the window passes, the Cancel button on My Registrations disappears. Customers can still contact you directly and admin can cancel from the roster.


Deactivating an Event

To hide an event from the storefront, change its Status to anything other than Published. The storefront uses a strict status = 'published' filter, so:

Status Use when
Draft Work in progress; you'll publish later
Completed Event has happened; keep the roster for records
Cancelled Event is called off (emails cancellation notices if wired up)

The backing product's status doesn't need to change โ€” events aren't rendered from the product index and the only purchase path is the event page, which respects the Event status.

Past-event registration is also blocked automatically โ€” once a single-event session's start time has passed, that session is removed from the picker; once a bundle's first session has started, the whole event shows a "This event has ended โ€” registration is closed" state.


Theme Integration

Four sections ship with the plugin and appear in the visual editor's Add Section picker without any theme-file changes. Each section has the same container / padding / margin settings and honors the current theme's colors and fonts.

Section Best for
Events List A full grid or list โ€” use it on the /events template or a landing page
Events Carousel A horizontal slider on the homepage or product page
Event Hero Feature one specific event with a large cover image and CTA (supports multi-event slideshow mode)
Event Detail The /events/{handle} page content (auto-placed โ€” not in the picker)

The /events and /events/{handle} templates are auto-injected into every theme the first time they're hit, so storefronts work out of the box.


Troubleshooting

Event not showing on the storefront

Symptoms: Event exists in admin but doesn't appear in listings or via direct URL.

Solutions:

  • Confirm Status is Published
  • Confirm at least one session's start time is in the future (/events hides ended events)
  • For bundle events, confirm the first session hasn't started yet โ€” in-progress bundles are filtered out
  • Clear the upcoming-events cache by saving any event (the observer busts the team's cache)

Customer can't register

Symptoms: "Reserve my seat" button missing or registration returns an error.

Solutions:

  • Event status isn't Published โ€” change it
  • Event has ended โ€” the form is replaced with an "ended" message by design
  • Session is sold out โ€” backing product stock hit zero
  • Event is marked one-seat-per-order and the customer already has it in their cart
  • For logged_in submitter gates on reviews or events, confirm Customer Accounts is enabled in Settings > General

Reminders not sending

Symptoms: No reminder email arrives 24h or 1h before a session.

Solutions:

  • Confirm the event doesn't have reminders disabled in the form
  • Check the registration isn't cancelled
  • If a reminder was already delivered for that window (24h or 1h), another one won't fire for the same session

Waiver PDF not generating

Symptoms: Download link returns an error.

Solutions:

  • Waiver must be signed (waiver_signed_at is set) before the PDF is available
  • Confirm Browsershot is installed and functional โ€” it's what renders the HTML waiver to PDF
  • Check that event.waiver_content isn't empty