Open the scanner once. Every attendee for your active events is cached to the device. Each scan resolves locally — instant, offline, no spinner. Check-ins queue in IndexedDB when the network dies and sync the moment it returns. The volunteer at Gate 2 never notices the outage.
online, the queue drains, each item POSTs to /checkin/{token}. Duplicate protection lives on the server.Real story from a college fest in Pune. Fest starts at 9 am, 3,200 pre-registered attendees, six volunteer scanners at three gates. Router at Gate 2 chokes at 9:07 am. Volunteers stare at the scanner spinner. Queue backs up 40-deep in under three minutes. Attendees start pushing past unchecked. Sponsor at the booth wants to know why nobody's coming in.
The organiser texts us. We push a fix in the next release: cache attendees on open, queue offline. Next event, same venue, same crappy Wi-Fi. Router dies at 9:11. Nobody notices for 22 minutes. When it comes back the badge at the top of the scanner reads "Syncing 47 offline check-ins" and clears in six seconds. Zero attendee complaints.
Table-stakes for anything at a venue you don't control. Bad conference centres, marriage halls with cinderblock walls, college auditoriums where the guest network is a router in a locked cabinet with 200 devices on it. Table-stakes.
already_in for the second — the second device sees a warning on next refresh. No double check-ins get written.