---
title: "Events & Classes"
description: "Publish classes, sell seats, collect waivers, and manage attendee rosters"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.firearmcart.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 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 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

1. Navigate to **Plugins > Marketplace**
2. Find **Events & Classes**
3. Click **Activate**
4. Navigate to **Plugins > Events**
5. Click **Add Event** to create your first class
6. Add the Events sections to your theme through the visual editor (see [Theme Integration](#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 > Add 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. **Limit to 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 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.

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, 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.

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 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 (`/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 **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_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

---

## Related Documentation

- [Theme Sections](/themes/sections) - Adding sections to your theme
- [Customer Accounts](/customers/customer-accounts) - Enabling customer login so attendees get the My Registrations card
- [Order Management](/orders) - How event purchases flow through the order system

Source: https://docs.firearmcart.com/integrations/events/index.mdx
