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 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 day-before and hour-of reminders before each session, with configurable lead times |
| 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 Plugins > Marketplace
- (Optional) Customer Accounts enabled in Settings > General so customers get the “My Registrations” card on their account page
Setting Up
- Navigate to Plugins > Marketplace
- Find Events & Classes
- Click Activate
- Navigate to Plugins > Events
- Click Add Event to create 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 > Add 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
- Limit to 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 recurring… inside the event form to create N weekly occurrences at once (e.g. every Tuesday at 6 PM for 6 weeks) — you give it a start date and time, an end time, a number of weeks, a capacity and a price. 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, by default |
| Hour-of reminder | 1 hour before the session start time, by default |
Reminders are sent automatically — no manual intervention needed. A scheduled job checks every 15 minutes for sessions entering a reminder window.
Events Settings
Reminders are configured for the whole store, not per event. Click Settings on Plugins > Events:
| Setting | Purpose |
|---|---|
| Send 24-hour reminder | Switch it off to stop the day-before email entirely. When on, Hours before start sets the lead time (1-168). |
| Send hour-of reminder | Switch it off to stop the just-before email. When on, Hours before start sets the lead time (0-24). |
| Default cancellation window (hours before start) | Default self-cancellation window for new events. 0 disables self-service cancellation. |
| From email | Sender address for event emails. Must be on a domain with branded email enabled; leave blank to use the team default. |
Cancelled registrations stop receiving reminders, and a reminder already delivered for a given window won’t fire twice for the same session.
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 — the same menu item becomes Clear check-in afterwards |
| 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, and only for registrations tied to an order) |
| 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 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. Defaults to the store-wide value from Events Settings. |
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 |
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, three of which 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 Limit to one seat per order and the customer already has it in their cart
Reminders not sending
Symptoms: No reminder email arrives 24h or 1h before a session.
Solutions:
- Open Plugins > Events > Settings and confirm Send 24-hour reminder / Send hour-of reminder are on
- Check the registration isn’t cancelled
- If a reminder was already delivered for that window, another one won’t fire for the same session
- If you set a custom From email, confirm its domain still has branded email enabled
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 so attendees get the My Registrations card
- Order Management - How event purchases flow through the order system

