---
title: Check-in Scanner
description: QR and manual ticket check-in for ticketed events at the door.
icon: material/qrcode-scan
status: new
tags:
  - guide
  - admin
  - events
---

# 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.

![Check-in scanner — manual mode](../../../assets/images/screenshots/admin/events/checkin-scanner.png){ loading=lazy }

---

## 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.

!!! tip "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](ticketed-events.md) — creating events and tiers
- [Payments Settings](../payments/settings.md) — Stripe configuration
