docs
/
EventOxygen

Event setup

The event record, sessions, ticket types and participants — every field the attendee app and the door depend on.

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.

FieldWhat it does
titleShown everywhere. Long titles truncate in the app bar.
slugUnique, ^[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.
typeConference, meetup, workshop, and so on. Rendered as the badge above the title. Default conference.
statusdraft → published → live → completed, with cancelled available at any point.
startDate / endDateDates. A one-day event prints as "Oct 8, 2026"; a range prints both ends.
startTime / endTime / timezoneTime-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.
venueA place object {name, address, city, country}. Rendered as one line under the street address.
addressstreet1, 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.
settingsSee below.
host[], organizers[]Shown in the Organizers block on the event home.
statstotalTicketsSold, 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.

Venue is an object, not a string

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.

FieldMeaning
zoneThe 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.
scanTypeentrance 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.
matchByticket_code, ticket_type or credential_code (wristband or badge code).
isActiveA 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

SettingEffect
networkingEnabledPeople, connections and messaging inside the event.
leadsEnabledBadge-scan lead capture for exhibitors.
checkInRequiredAttendees must be scanned in before door-side features apply.
qrRotationEnabled, qrRotationIntervalRotating QR codes; default interval 30 seconds. The server's QR payload also carries its own 60-second signature window regardless.
allowWalkInsWhether staff may create tickets at the door.
requireApprovalRegistrations wait for approval instead of confirming immediately.
maxAttendeesPerSessionDefault capacity for sessions that set none.

Sessions

Datatype event_session, one record per slot, linked by event (the event's record id).

FieldNotes
title, descriptionCard and detail.
typetalk, panel, workshop, keynote, networking, break, meetup, other. Shown as a chip.
statusdraft, scheduled, live, completed, cancelled.
dayDate the session belongs to. The schedule calendar buckets by this and opens on the first day that has sessions.
startTime, endTime, durationWall-clock times such as 18:40; duration in minutes.
track, zone, roomRendered as "track · room · zone".
capacity, registeredCount, attendedCount, waitlistCountCounts 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.
isPublicDefault true. Private sessions are hidden from the attendee schedule.
streamingisLive, streamUrl, recordingUrl, platform (youtube, vimeo, custom, none).
resources[]`{name, type: slides
feedbackEnabled, averageRatingSession feedback.
Sessions attach to the event id, not the slug

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.

FieldDefaultRule
isActivetrueInactive 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.
maxPerOrder10Per booking.
maxPerCustomer1 when price is 0Counted across the buyer's non-cancelled, non-refunded tickets of that type. Free tickets are one per person unless you raise it.
price, currency0, USDA total of zero skips payment.
allowReentryfalseA second entrance scan is "Ticket already used" unless you enable this. reentryLimit caps the count.
allowTransferfalseAttendees cannot hand a ticket on unless this is true. transferDeadline closes it. transferPreservesPerks (default true) keeps claimed perks with the ticket.
zoneAccess[], sessionAccess[]emptyEmpty means every zone and every public session.
perks[]—`{id, name, type: perk
title, slug, color, sortOrder—Display. Slug is unique per event.
Two defaults catch organizers out

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.

FieldNotes
event, customer, emailRequired. The email is the identity used by networking.
typeattendee, speaker, exhibitor, sponsor, volunteer, press, vip — the People directory filters on this.
roleFree text such as keynote, panelist, moderator. Shown under the name.
statusinvited, accepted, declined, waitlisted, confirmed, cancelled, no_show. Only confirmed participants appear in the attendee app's People list.
featuredSurfaces the person in event-home rows.
sessions[]Session ids; the profile resolves them to titles.
bio, shortBio, imageProfile card. The card image and the profile avatar come from this record and the customer record respectively, so keep them consistent.
sociallinkedin, twitter, website, github.
topics[], tags[]Topic chips on the profile.
logisticsTravel and accommodation needs, dates, dietary and special requirements.
rsvpinvitedAt, 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.