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
- Navigate to Settings > Plugins
- Find Events & Classes
- Click Activate
- Navigate to Plugins > Events
- Click Create event to add your first class
- 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
- Plugins > Events > Create event
- 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
- Add sessions โ each session needs a start/end datetime, capacity, and price (for single-type events)
- Waiver (optional) โ toggle Require waiver and provide the waiver text
- One-seat-per-order (optional) โ toggle this if you want each attendee to check out separately so everyone signs their own waiver
- Status โ draft (hidden), published (live), cancelled, or completed
- 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.
- After checkout, the attendee sees a "Sign waiver" button on the order confirmation page and on My Account > My Registrations.
- A modal opens with the waiver text and a signature pad.
- The signed snapshot, signature image, IP address, and timestamp are stored on the registration record.
- 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.
- Click the row's action menu โ Move to another event
- Pick the target event (and session for single-type events)
- Optionally add a reason โ it's saved to the registration's internal notes
- 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
- Customer visits
/eventsor lands on an event via an Event List / Carousel / Hero section. - Clicks Reserve my seat โ the seat is added to their cart.
- Completes checkout like any other product.
- 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 (
/eventshides 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_insubmitter 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_atis 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_contentisn't empty
Related Documentation
- Theme Sections - Adding sections to your theme
- Customer Accounts - Enabling customer login for the
logged_ingate - Order Management - How event purchases flow through the order system