Skip to content

# Check-in Scanner

Check attendees in at the door via QR code scan or manual lookup. The scanner runs full-screen at `/app/events/:id/checkin` — ideal for a tablet or phone held at the entrance.

## Opening the Scanner

From an event's detail page at `/app/events/:id`, click the Check-in Scanner button in the Actions row. The scanner opens full-screen (no sidebar or header) so it's usable on small mobile screens.

The scanner shows three live counters at the top:

- Checked In — tickets already scanned in
- Remaining — tickets issued but not yet checked in
- Total — all tickets issued for this event

## Scan Modes

Switch between modes using the toggle at the top:

### Camera (QR)

Uses the device's camera to scan ticket QR codes. Each ticket email includes a QR that encodes the ticket code. On first use, the browser will request camera permission — grant it and the live preview appears.

Valid scans auto-check the ticket in and flash a success banner. Duplicate scans of the same ticket show "Already checked in" with the original check-in timestamp.

HTTPS required for camera access

Browsers only expose the camera API on HTTPS origins (or `localhost`). In production, the scanner must be loaded via your `app.` subdomain over HTTPS — not an IP address.

### Manual

Two input modes for situations where QR scanning fails (damaged code, no camera, printed ticket list):

- Enter Ticket Code — type the alphanumeric code from the ticket (format `ABCD-1234`)
- Look up by Email — enter the attendee's email; if a single ticket matches, it's checked in directly. If multiple tickets match, a picker appears so the organizer can pick the right one.

## Permissions

The check-in scanner requires one of:

- `SUPER_ADMIN`
- `EVENTS_ADMIN`
- Ownership of the event (the user who created it)

Non-admin event owners can check in attendees for their own events but not others'.

## Audit Trail

Every check-in action is recorded with the ticket code, the user who performed the check-in, and a timestamp. The full log appears on the event detail page under the Check-ins tab, and is included in event exports.

Tickets marked as cancelled (after refund) cannot be checked in — the scanner rejects them with a red banner.

## Admin Routes

- `/app/events/:id/checkin` — full-screen scanner for a specific event

## Related

- Ticketed Events — creating events and tiers
- Payments Settings — Stripe configuration