The Conference Check-In System enables attendees to gain entry using personalized QR codes.
- Before the event, each attendee is emailed a unique QR code
- At the venue, volunteers scan QR codes with their phone camera
- The system validates against a Google Sheet database, updates their check-in status, and logs the time
- A GitHub Pages dashboard displays real-time check-ins and prevents duplicate entries
Central source of truth.
Columns used:
| Column | Field | Example |
|---|---|---|
| A | Name | John Doe |
| B | john@example.com | |
| C | Status | Sent / Error |
| D | Check-in Status | ✅ Checked in / blank |
| E | Check-in Time | 10:15:22 AM |
| F | Pass Type | VIP / Regular |
| G | Embed (QR content) | john-doe-vip-unique123 |
- Creates QR codes using the Embed field
- Sends via Gmail with plain text + HTML body
- Marks email as "Sent" once delivered
- Exposes a web endpoint
- Validates scanned QR against Embed column
- Updates Check-in Status + Time
- Prevents duplicates
- Returns JSON response
Example JSON Response:
{
"success": true,
"message": "✅ John Doe (VIP) checked in",
"time": "2025-09-06T10:15:22.000Z"
}- Hosted static site
- Uses html5-qrcode library
- On scan:
- Sends POST request to Apps Script endpoint
- Updates UI with check-in confirmation
- Adds entry to live log table
fetch("https://script.google.com/macros/s/<DEPLOYMENT_ID>/exec", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name })
});Function: generateQRImagesToDrive
- Iterates over attendee list
- Uses QuickChart.io QR API
- Sends QR to attendee's email
- Updates Column C (Status) with "Sent"
Key Variables:
const nameCol = 0; // A: Name
const emailCol = 1; // B: Email
const statusCol = 2; // C: Email sent status
const embedCol = 6; // G: Embed (QR content)Function: doPost(e)
- Validates scanned QR
- If valid → marks attendee as checked in
- If already checked in → returns "already checked in"
- If invalid → returns error
Deployment:
- Execute as: Me
- Access: Anyone
- URL format:
https://script.google.com/macros/s/<DEPLOYMENT_ID>/exec
File: index.html
- Loads camera scanner
- Displays confirmation or error
- Updates table log dynamically
Sample Flow:
- Volunteer scans QR
- Browser sends request to Apps Script
- JSON response is displayed on screen
- Log table updates in real-time
- Consolidate names & emails
- Add Embed column:
=Name & " - " & Pass Type - Copy & paste values (not formulas)
- Emails QR codes
- Updates Status column
- Deploy as web app
- Copy web app URL
- Update index.html with backend URL
- Push changes to GitHub
- Volunteers open GitHub Pages link
- Scan attendee QR codes
- Sheet + dashboard update live
| Error Type | Message Example |
|---|---|
| Invalid QR | ⚠ Invalid or empty QR code |
| Not Found | ❌ Name not found |
| Already Checked In | John Doe already checked in |
| Network Issue | ⚠ Network error |
| Email Failure | Error logged in Column C |
✅ Works on any smartphone browser
✅ Supports multiple scanners at once
✅ Live sheet prevents duplicate check-ins
✅ Easy to reuse for future events
- Admin dashboard with live stats (total attendees, % checked in)
- Manual override for failed scans
- Pass type filter (VIP / Regular)