Resources · Feature guides
Door check-in with QR codes
Turn any phone into a fast, reliable door scanner. Door staff sign in once, point the camera at each attendee's confirmation-email QR code, and Site Calendar Pro admits, rejects, or flags duplicates in under a second — with a live attendance count on your admin screen.
- You'll need: Site Calendar Pro 1.1.4.3 or later active, at least one paid or RSVP event with attendees, a phone or tablet with a camera, and your site served over HTTPS
- Difficulty: Intermediate — no code, but involves WordPress user-role admin
Why this matters
Printed guest lists are slow and easy to fake. A photo of a confirmation email could be forwarded, screenshotted, or used twice. Site Calendar Pro solves both problems by generating a unique QR code for every attendee and giving your door staff a dedicated scanner page that talks to the same database in real time. Every ticket is admitted exactly once; refunded tickets are rejected automatically; duplicates show an amber "already checked in" warning so you can investigate on the spot.
code (e.g. ABCD1234). The QR encodes a URL like https://yoursite.com/?pcal_ticket=ABCD1234. When your scanner reads it, the page POSTs to /wp-json/pcal/v1/checkin/admit, which updates _pcal_checked_in_at on the attendee post. No third-party service, no extra subscription — everything runs on your own WordPress install.
Before you start
Make sure each of the following is true. If any item fails, fix it before continuing — the scanner won't work otherwise.
- Site Calendar Pro 1.1.4.3 or later is active. Earlier versions had two critical bugs that prevented the scanner from working reliably: 1.1.4.2 fixed a missing-asset error that left the scanner stuck on "Starting camera…" indefinitely, and 1.1.4.3 fixed a race condition that incorrectly flagged the very first scan as a duplicate. Both are resolved in 1.1.4.3 and later. If you're on an earlier Pro version, update via Dashboard → Updates before running an event.
- You've sold or registered at least one test ticket — see Setting up Stripe payments or Setting up WooCommerce ticketing.
- You can receive the attendee confirmation email on a separate device (you'll use its QR for the test scan).
- Your site uses HTTPS. Mobile browsers will not grant camera access on plain HTTP — even on localhost.
Step 1 — Create the public scanner page
The scanner is a normal WordPress page that contains the [pro_calendar_checkin] shortcode. Door staff bookmark its URL and use the same page for every event you run.
- Go to Pages → Add New.
- Title:
Door Check-in. - Set the URL slug to something hard to guess — e.g.
/door-checkin-bdf-2026/, not/checkin/. This stops random visitors landing on the sign-in screen. - Add a Shortcode block (or Custom HTML block) with this content:
[pro_calendar_checkin] - Publish.
[pro_calendar_checkin event_id="587"] (replace 587 with the event's post ID). Tickets for any other event get a clear "Wrong event" rejection. Leave the attribute off for normal use.
Step 2 — Tell Site Calendar where the page lives
Pointing the plugin at your scanner page lets it redirect door-staff users straight there after sign-in, so they never see the WordPress dashboard.
- Go to Site Calendar → Settings → Tickets.
- Scroll to Door scanner.
- Paste the full URL of the page you just created into Scanner page URL (e.g.
https://yoursite.com/door-checkin-bdf-2026/). - Click Save changes.
Step 3 — Create a dedicated scanner login
Don't give door staff your admin password. Create a separate user with the Pro Calendar Scanner role — it can verify and admit tickets, and nothing else. No access to settings, content, or attendee data beyond what's needed to check someone in.
- Users → Add New.
- Username: something memorable like
door-scanner. - Email: any address you control (it's only used for password resets).
- Set a strong password — door staff will only type it once.
- Role: Pro Calendar Scanner.
- Add New User.
door-north, door-south). The attendance log records which user admitted each ticket, which is invaluable if a dispute arises later.
Step 4 — Test on a phone
This is the most important step. Don't skip it — discovering a camera permission problem on event night with a queue forming is no fun.
- On a phone, open your scanner page URL (
https://yoursite.com/door-checkin-bdf-2026/). - Sign in as the
door-scanneruser. You should land back on the scanner page (not the dashboard). - When the browser asks for camera permission, tap Allow.
- On a second device, open the attendee confirmation email and tap the QR code to enlarge it.
- Point the scanner phone's camera at the QR. You should see a green Admitted panel within about a second.
- Scan the same QR again — you should now see an amber Already checked in warning.
Step 5 — Use the manual code box as a fallback
Some QRs don't scan well in low light, behind glass, or on cracked screens. Below the camera viewfinder there's a Or type the code input — door staff can type the 8-character code printed on the ticket page (e.g. ABCD1234) and tap Verify. Same result, same audit trail, no camera needed.
This is also useful on browsers that don't support live camera scanning. Pro 1.1.4.2+ ships a bundled jsQR fallback so most browsers work, but the manual box is the universal escape hatch.
Step 6 — Watch the live attendance counter
While door staff are scanning, you (or any user with admin access) can monitor progress in real time.
- Go to Site Calendar → Events.
- Hover over the event name and click Check-in.
- You'll see total tickets sold, admitted count, and an attendee table that ticks over as scans happen.
- After the event, click Export CSV for your records (timestamp, scanner user, name, ticket type).
Undoing a check-in
Mistakes happen — door staff scan the same QR twice in a long queue, a friend hands their phone to the wrong person, or you need to re-test the scanner after setup. Site Calendar Pro 1.1.4.4 added a non-destructive Undo check-in action that clears the admission without refunding or removing the attendee.
From the live Check-in screen (recommended for event-night use):
- WordPress admin → Site Calendar → Events → [the event] → Check-in
- Find the attendee row showing 🟢 ADMITTED status
- Click Undo on that row
- The row returns to ⚪ WAITING and the attendee can be scanned again immediately
From the Attendees screen (added in 1.1.4.4 — recommended for support staff):
- WordPress admin → Site Calendar → Events → [the event] → Attendees
- Find the attendee row
- Click Undo check-in (the button only appears on rows that have been admitted)
- A confirmation dialog spells out what the action does and doesn't do — confirm to clear the check-in
Both buttons do the same thing: clear the check-in timestamp and the recording-staff-member fields, then write a small audit-trail record (_pcal_last_checkin_undone_at, _pcal_last_checkin_undone_by, _pcal_checkin_undo_count) so multi-staff teams can see prior undo actions.
Important: the Remove & refund button on the Attendees screen is a different action — it deletes the attendee record entirely and issues a Stripe/WooCommerce refund. If you only want to clear a check-in, use Undo check-in, not Remove. The destructive button is now labelled and styled distinctly in Pro 1.1.4.4 to prevent confusion.
Troubleshooting
"Camera access denied"
Either the user tapped Block when the permission prompt appeared, or your site isn't on HTTPS. Mobile browsers refuse camera access on plain HTTP. Fix HTTPS first (most hosts offer a free Let's Encrypt certificate), then in iOS Settings → Safari → Camera or Android Chrome site settings, clear the previous denial and reload.
"Scanner sign-in required" appears on a logged-in user
The user doesn't have the pcal_check_in capability. Check their role — they need Pro Calendar Scanner, or any Editor-or-above role (Editor, Administrator, Shop Manager). Subscribers and Customers cannot scan.
QR scans but result panel says "Ticket not found"
The QR is from a deleted attendee record, or it points at a different WordPress site. Confirm the QR was generated by this site by opening it in any QR reader — the URL should start with your domain.
Scanner-role user lands on wp-admin instead of the scanner page
Settings → Tickets → Scanner page URL is empty or wrong. Re-paste the full https:// URL of the scanner page and save. Sign out, sign back in to verify the redirect.
Red "Ticket refunded — do not admit" appears
This is correct behaviour, not a bug. The attendee was refunded through WooCommerce or Stripe; the QR is invalid. Refuse entry and direct the holder to support@your-domain if they think it's a mistake.
Scanner sits on "Starting camera…" forever and the camera never activates
If you're on Pro 1.1.0 – 1.1.4.1, this is the missing-asset bug fixed in 1.1.4.2. Update Pro via Dashboard → Updates (or Site Calendar → Settings → Licence → Check for plugin update to force an immediate check). On 1.1.4.2+ the scanner activates within a second of the page loading.
If you're already on 1.1.4.2+, the cause is almost always denied camera permission or a non-HTTPS URL. See "Camera access denied" above.
First successful scan shows amber "Already checked in" instead of green "Admitted"
If you're on Pro 1.1.4 – 1.1.4.2, this is the scanner race condition fixed in 1.1.4.3. The server correctly admits the attendee on the first scan, but a second admit call fires a few milliseconds later (because the QR is still in the viewfinder) and the duplicate response overwrites the green panel with amber. Update Pro to 1.1.4.3 or later and the issue disappears.
Scanner works on Chrome but not Safari iOS
Pro ships a jsQR fallback that loads automatically when the native BarcodeDetector API is missing. If it still fails, hard-refresh the page (the script may be cached at an older version). Worst case, use the manual code box — it works in every browser.
What's next
- Branded confirmation emails — make sure attendees actually receive the QR before they reach the door.
- Setting up WooCommerce ticketing — sell tickets through WooCommerce.
- Switching Stripe from test to live mode — go live without missing a payment.
