Skip to content

# Events

Run paid, free, or donation-based events end-to-end — from creating an event with multiple ticket tiers, to Stripe-backed checkout for attendees, through QR-code check-in at the door.

Ticketed Events is a separate feature from the Gancio event calendar integration — Gancio publishes shift-based community events, while Ticketed Events handles commerce, capacity, and attendance tracking for in-person or online gatherings.

Feature flag

Enable in Settings → Feature Toggles, or set `enableTicketedEvents=true` in the site settings. Payments must also be enabled for paid tiers to work.

## In This Section

- Ticketed Events

  Create events, configure tier types (paid, free, donation), publish, and manage attendees.

- Check-in Scanner

  QR scan or manual lookup to check attendees in at the door.

## How It Works

1. Create an event in the admin at `/app/events` — title, date, venue, format (in-person / online / hybrid).
2. Add ticket tiers — at least one tier is required. Each tier has a type (`PAID`, `FREE`, `DONATION`), price, and capacity.
3. Publish — the event transitions from `DRAFT` → `PUBLISHED` and becomes available at `/event/:slug` on your public site.
4. Attendees register — the public event page uses Stripe Checkout for paid tiers, a simple email form for free tiers, and a suggested-amount flow for donation tiers.
5. Tickets are emailed — each buyer receives an email with a unique ticket code (QR-scannable).
6. Check-in at the door — organizers use the Check-in Scanner on a phone or tablet to mark tickets as checked in.

## Event Lifecycle

Events move through the following statuses:

Status | Meaning
--- | ---
`DRAFT` | Work in progress — not visible publicly
`PENDING_APPROVAL` | Submitted for review (if organizer is a non-admin)
`PUBLISHED` | Live on the public site; tickets can be purchased
`CANCELLED` | Event cancelled — tickets marked for refund
`COMPLETED` | Event has ended

Visibility controls who can see a published event:

Visibility | Behavior
--- | ---
`PUBLIC` | Listed on `/events` and indexable
`UNLISTED` | Only reachable by direct link (slug URL)
`PRIVATE` | Requires an invite code to access

## Admin Routes

- `/app/events` — event list, create, edit, publish
- `/app/events/:id` — event detail with tickets and check-ins
- `/app/events/:id/checkin` — full-screen check-in scanner

## Public Routes

- `/events` — browse public events (if `enableEvents` is on)
- `/event/:slug` — event detail with ticket purchase
- `/event/:slug/ticket/:ticketCode` — ticket confirmation with QR code