Events are created and edited in Studio Manager → Events. This page is the field reference for what you are filling in and how each value shows up in EventOxygen, in Appmint Mobile at the door, and in the server's check-in rules.
The event record
Datatype event. The fields below live under data.
| Field | What it does |
|---|---|
title | Shown everywhere. Long titles truncate in the app bar. |
slug | Unique, ^[a-z0-9-]+$. The attendee app links events by slug, so it must be set and stable. Server list endpoints accept either the slug or the record id. |
type | Conference, meetup, workshop, and so on. Rendered as the badge above the title. Default conference. |
status | draft → published → live → completed, with cancelled available at any point. |
startDate / endDate | Dates. A one-day event prints as "Oct 8, 2026"; a range prints both ends. |
startTime / endTime / timezone | Time-of-day line plus the zone name. Default timezone America/New_York — set it, or a West Coast event shows New York times. |
days[] | {date, label, startTime, endTime} — drives the day tabs on multi-day schedules. |
tracks[] | {id, name, description, color, location} — track pills in the schedule and on session cards. |
venue | A place object {name, address, city, country}. Rendered as one line under the street address. |
address | street1, street2, city, region, postalCode, country. This is the line with the pin icon. |
zones[] | {id, name, description, capacity} — where occupancy is counted. |
scanPoints[] | See below. |
accreditationPoints[] | See below. |
settings | See below. |
host[], organizers[] | Shown in the Organizers block on the event home. |
stats | totalTicketsSold, totalRevenue, totalAttendees, totalSessions, totalParticipants — maintained by the server, shown as chips. |
Status lifecycle
Draft is invisible to attendees. Published makes the event browsable in the public list and lets ticket types sell. Live turns on the door: scanning, check-in statistics and occupancy. Completed closes it and settles the numbers. Use the admin endpoints publish, live, complete and cancel rather than editing the status field by hand, because each one also fires the matching notifications.
Venue versus address
The address is the postal location with the pin icon; the venue is the named place with the building icon. Fill both for a large site ("ExCeL London" plus its street address). If you only have one, put it in address; the venue line is hidden when empty.
Older records stored the venue as plain text. The app handles both, but new records should use the {name, address, city, country} shape so the line renders cleanly.
Scan points
Scan points are the places staff stand with a scanner.
| Field | Meaning |
|---|---|
zone | The zone a successful scan checks the attendee into. Occupancy is per zone. |
acceptedTicketTypes[] | Empty = any ticket type. Otherwise a ticket of another type is denied at this point. |
scanType | entrance records an entry (subject to re-entry rules). eligibility only answers "may this ticket do this here" — unlimited, nothing recorded. Use it for meal lines and session doors. |
matchBy | ticket_code, ticket_type or credential_code (wristband or badge code). |
isActive | A disabled point denies everything. |
Accreditation points
Where badges are collected and tickets fulfilled. ticketTypes[] limits which types are handled here; allowWalkIn (default false) lets staff fulfil a ticket for someone with no prior purchase; allowOnlinePickup (default true) lets an online purchase be fulfilled here. A fulfil attempt at a point that does not allow the path is refused.
Settings
| Setting | Effect |
|---|---|
networkingEnabled | People, connections and messaging inside the event. |
leadsEnabled | Badge-scan lead capture for exhibitors. |
checkInRequired | Attendees must be scanned in before door-side features apply. |
qrRotationEnabled, qrRotationInterval | Rotating QR codes; default interval 30 seconds. The server's QR payload also carries its own 60-second signature window regardless. |
allowWalkIns | Whether staff may create tickets at the door. |
requireApproval | Registrations wait for approval instead of confirming immediately. |
maxAttendeesPerSession | Default capacity for sessions that set none. |
Sessions
Datatype event_session, one record per slot, linked by event (the event's record id).
| Field | Notes |
|---|---|
title, description | Card and detail. |
type | talk, panel, workshop, keynote, networking, break, meetup, other. Shown as a chip. |
status | draft, scheduled, live, completed, cancelled. |
day | Date the session belongs to. The schedule calendar buckets by this and opens on the first day that has sessions. |
startTime, endTime, duration | Wall-clock times such as 18:40; duration in minutes. |
track, zone, room | Rendered as "track · room · zone". |
capacity, registeredCount, attendedCount, waitlistCount | Counts are server-maintained; the card shows registered / capacity. |
participants[] | Speaker records for the session. A participant's profile lists its sessions by title. |
requiredTicketTypes[], requiredAccreditation[] | Gate the session at an eligibility scan point. |
isPublic | Default true. Private sessions are hidden from the attendee schedule. |
streaming | isLive, streamUrl, recordingUrl, platform (youtube, vimeo, custom, none). |
resources[] | `{name, type: slides |
feedbackEnabled, averageRating | Session feedback. |
The app fetches sessions by the event's slug; the server resolves that to the id before querying. If you import sessions from elsewhere, event must hold the record id or the schedule stays empty.
Ticket types
Datatype event_ticket_type. These rules are enforced by the server at purchase time, in this order.
| Field | Default | Rule |
|---|---|---|
isActive | true | Inactive types cannot be bought. |
saleStartDate, saleEndDate | — | Outside the window the type is refused. |
capacity, soldCount | — | Refused when capacity − soldCount is less than the quantity requested. |
maxPerOrder | 10 | Per booking. |
maxPerCustomer | 1 when price is 0 | Counted across the buyer's non-cancelled, non-refunded tickets of that type. Free tickets are one per person unless you raise it. |
price, currency | 0, USD | A total of zero skips payment. |
allowReentry | false | A second entrance scan is "Ticket already used" unless you enable this. reentryLimit caps the count. |
allowTransfer | false | Attendees cannot hand a ticket on unless this is true. transferDeadline closes it. transferPreservesPerks (default true) keeps claimed perks with the ticket. |
zoneAccess[], sessionAccess[] | empty | Empty means every zone and every public session. |
perks[] | — | `{id, name, type: perk |
title, slug, color, sortOrder | — | Display. Slug is unique per event. |
Re-entry and transfer are both off by default. A conference where people step out for lunch needs allowReentry; a ticket you expect people to pass to a colleague needs allowTransfer.
Participants
Datatype event_participant. Speakers, exhibitors, sponsors, volunteers, press and VIPs are tracked here, separately from ticket holders, because they are confirmed rather than sold to.
| Field | Notes |
|---|---|
event, customer, email | Required. The email is the identity used by networking. |
type | attendee, speaker, exhibitor, sponsor, volunteer, press, vip — the People directory filters on this. |
role | Free text such as keynote, panelist, moderator. Shown under the name. |
status | invited, accepted, declined, waitlisted, confirmed, cancelled, no_show. Only confirmed participants appear in the attendee app's People list. |
featured | Surfaces the person in event-home rows. |
sessions[] | Session ids; the profile resolves them to titles. |
bio, shortBio, image | Profile card. The card image and the profile avatar come from this record and the customer record respectively, so keep them consistent. |
social | linkedin, twitter, website, github. |
topics[], tags[] | Topic chips on the profile. |
logistics | Travel and accommodation needs, dates, dietary and special requirements. |
rsvp | invitedAt, respondedAt, message, plusOne, guestCount. |
Participants respond to invitations from the app (accept, decline, tentative), and staff confirm or cancel them from Appmint Mobile.
Cover images
coverImage and images[] feed the carousel. A plain HTTPS URL loads fastest. A signed object-storage URL works, but a multi-megabyte PNG behind a signed URL shows as a blank card until it arrives, and signed URLs expire. Keep covers under a megabyte and prefer a permanent URL. See media storage.
What the server checks at the door
Every entrance scan runs these gates in order, and a failure is written as a denied event_checkin record with a reason, so denials are auditable:
1. Code resolves to a ticket (or credential when the point matches by credential code).
2. Re-entry. If the ticket has already entered and the type does not allow re-entry, "Ticket already used". With re-entry allowed, reentryLimit still applies.
3. Scan point filters. The ticket type must be in acceptedTicketTypes when that list is set; the point must be active.
4. Zone access. The point's zone must be in the type's zoneAccess (empty means all). Failure records wrong_zone.
A pass appends to the ticket's checkIns[], sets its current zone, and returns live occupancy for that zone against its capacity. Eligibility points run the same gates without recording an entry, and also check that a perk has claims remaining. Check-out requires the ticket to be currently checked in, and an override records a mandatory reason.