The Events module is AppEngine's ticketed-event platform: create an event, define ticket types, sell them through the Storefront, run sessions on a schedule, scan QR codes at the door, and manage the participant roster. It lives at /events/* (staff) and /client/events/* (customer/public) and ships its own data model.
Not the same as CRM events
CRM also has an EventService under /crm/events/*. That one is for internal calendar events — appointments, reservations, internal scheduling. The standalone Events module documented here is for public-facing ticketed events with payment, badges, multi-session schedules and check-in. They share no code and address different needs:
| CRM events | Events module | |
|---|---|---|
| Audience | Internal staff + contacts | General public |
| Sale | None — internal scheduling | Tickets sold via Storefront |
| Check-in | None | QR scanning, zone occupancy |
| Schedule | Single appointment | Multi-day, multi-track sessions |
| Path prefix | /crm/events/* | /events/*, /client/events/* |
If your case is "schedule a sales call with a contact" → CRM. If it's "sell tickets to a conference" → this module.
Concepts
| Concept | Owns |
|---|---|
| Event | The event record — venue, dates, scan points, ticket types, status (draft, published, live, ended) |
| TicketType | A purchasable tier — name, price, capacity, perks, allowed scan points, re-entry rules |
| Ticket | An issued ticket — holder email, QR code, status (active, used, cancelled, refunded), check-in history |
| Booking | A purchase that grouped one or more tickets, tied to a payment ref |
| Session | A scheduled item on the agenda — title, room/track, start/end, type (talk, workshop, break) |
| Participant | Someone with a role at the event — speaker, sponsor, organiser, attendee — independent from ticketing |
| CheckIn | An entry/exit scan record. Drives zone occupancy |
| Credential | A pre-printed badge/wristband/NFC code that can be assigned to a ticket |
| Perk | An add-on bundled with a ticket type (swag, meals) — claimable at fulfillment desks |
What's in each page
- Event creation —
POST /events/create, event shape, venue, capacity. - Ticketing — ticket types, sales via Storefront, ticket as a Storefront product.
- Sessions and scheduling — multi-track agendas, day-grouped schedule.
- Check-in — QR scan workflow, zone occupancy, re-entry.
- Participants — roster, RSVP, communications, late registration.
Three controllers
| Controller | Path prefix | Principal | What for |
|---|---|---|---|
EventsController | /events | User (staff) | Create events, issue/refund tickets, run check-in, manage participants |
EventsClientController | /client/events | Customer / public | Browse events, purchase tickets, view schedule, RSVP |
| (event repository) | /data/event | User | Direct CRUD on the event record (used by admin UI) |
The split is the same pattern as the rest of AppEngine: staff endpoints carry @Roles(RoleType.User), customer endpoints accept the customer JWT, and a few public reads (event list, ticket types, schedule) are decorated @PublicRoute() so a marketing site can render the event page without auth.
How a ticket becomes money
Ticket sales are handled by the Events module on top of the Storefront's payment gateways. The customer endpoint POST /client/events/tickets/purchase creates a booking and a Stripe payment intent (or a PayPal order), and POST /client/events/tickets/confirm-order finalises it after the gateway callback. Each ticket type maps to a Storefront product variant under the hood, so fees, taxes, gift-card use and discount codes all run through the same pricing pipeline as a regular order.