đź“‹ Check in participants via QR code with Google Sheets and Slack alerts

⚡ 18 views · 📋 Project Management

Description

Quick overview

This workflow creates a QR-driven check-in kiosk that logs attendance to Google Sheets, prevents duplicate scans with an n8n Data Table, calculates each participant’s progress toward a required attendance threshold, and alerts coordinators in Slack when certification becomes mathematically unreachable.

How it works

  1. Receives a check-in submission from an n8n Form where the participant enters their email and the session code is prefilled from the QR link.
  2. Normalizes the email, reads workflow settings (Sheet ID, tab names, Slack channel, threshold), and builds a composite check-in key from email + session code.
  3. Checks an n8n Data Table for the composite key and, if it already exists, shows an “Already checked in” completion screen without logging a duplicate.
  4. If it’s a first scan, looks up the participant in a Google Sheets roster and appends a timestamped check-in record to a Google Sheets “Check-Ins” tab, tagging unregistered attendees as WALK_IN.
  5. Stores the composite key in the n8n Data Table to dedupe future scans for the same email and session.
  6. Reads the cohort’s required sessions from a Google Sheets schedule tab, pulls the participant’s historical check-ins from the Data Table, and computes current and best-case attendance percentages against the threshold.
  7. If the threshold is unreachable even with perfect future attendance, posts an at-risk alert to a Slack channel, then shows a confirmation screen with the participant’s attendance summary.

Setup

  1. Connect Google Sheets OAuth credentials and set the registration spreadsheet ID plus the correct tab names for your roster, schedule, and check-ins sheets.
  2. Ensure your Google Sheets tabs include the expected columns (Roster: email, name, cohort; Schedule: cohort, session_code, session_date, required; Check-Ins: checked_in_at, email, name, cohort, session_code, status).
  3. Create (or keep) an n8n Data Table named session_checkin_dedupe with columns for checkin_key, email, session_code, and checked_in_at.
  4. Connect Slack credentials, set the target Slack channel ID, and invite the Slack app/bot to that channel.
  5. Publish the workflow and generate QR codes using the production form URL with ?session_code=YOUR_CODE appended so the hidden session code is populated.

Requirements

Customization

Additional info

Attendance history is read from the session_checkin_dedupe Data Table and not from the Check-Ins tab, so clearing that table resets every participant’s math while the Sheet log stays intact. That history is filtered by email alone, so any past scan whose code matches a required code for the cohort is counted, and session codes need to be unique across cohorts for the numbers to mean anything. Sessions still ahead are counted as strictly later than today, so a session running today is not treated as still reachable. The Slack alert fires on every scan while the threshold is unreachable rather than once per participant, so a coordinator running several sessions a day will see the same name more than once. Only the Slack node is set to continue on error, so a Google Sheets failure ends the execution with no completion screen on the participant’s phone, though the dedupe row is written after the Sheet append, which means that scan is not marked used and can be scanned again. There is no QR generation here and no undo path, so a mistaken check-in has to be removed from both the Check-Ins tab and the Data Table, and walk-ins are logged but never produce an alert because the unreachable check requires a roster match.

đź”— Nodes Used

Google Sheets, Slack, n8n Form Trigger, n8n Form, Data table

📥 Import

Download workflow.json and import into n8n: Workflow menu → Import from File

📖 Importing guide · 🔑 Credential setup