Ticketing Backend automates registration, QR-ticket generation, email delivery, and check-in validation using Google Sheets, Gmail, and a webhook scanner — reducing manual ticket prep from ~3 hours to under 5 minutes for 200 attendees.

POST /v1/register receives registration payload (nama, email, no_hp, jumlah_tiket, total_price, payment_method).POST /v1/registerPOST /v1/scanner| Requirement | Type | Purpose |
|---|---|---|
| n8n instance | Essential | Host the workflow and webhooks |
| Google account (Sheets + Gmail) | Essential | Store tickets & send emails |
| Google Sheet | Essential | Register & Tickets data store |
| Public webhook URL / reverse proxy | Essential | Expose /v1/register & /v1/scanner to scanners/clients |
| qrserver.com (public API) | Optional | Generate QR images (no credentials) |
Important: Make sure your n8n instance URL is publicly accessible or use a tunneling/reverse proxy so webhooks can receive POSTs.
/v1/register with valid fields to create a registration./v1/scanner with the barcode JSON payload to test check-in.| Node | Purpose | Key Configuration |
|---|---|---|
| REGISTER (Webhook) | Accepts registration POSTs | Path: /v1/register |
| Validate Input (Code) | Server-side validation | Validates nama, email, no_hp, jumlah_tiket, payment_method |
| Get Participant (Google Sheets) | Check duplicate email | Filters Register tab by Email |
| Store Data (Google Sheets) | Append registration | Tab: Register (gid=0) |
| START (Schedule Trigger) | Finds paid registrations | Runs every 1 minute |
| Get Rows (Google Sheets) | Reads Register rows | Reads full Register tab |
| Filter Paid Not Sent (Filter) | Finds rows with Payment Status=PAID & Email Sent=NO | Filter node conditions |
| Generate Ticket Data (Code) | Generate ticket IDs & QR payloads | Ticket ID format TL-YYYYMMDD-XXXX-N-HASH |
| Generate QR Code (HTTP Request) | Calls qrserver.com to build PNG | URL: https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=... |
| Build HTML Email (Code) | Builds ticket HTML & embeds Base64 QR | Template contains ticket details & QR |
| Send Email (Gmail) | Sends ticket email | To: recipient Email; Subject configurable |
| Update Sheet (Tickets) | Append ticket rows | Tab: Tickets (gid=2010454173) |
| Parse Data (Code) | Aggregates ticket IDs per email | Updates Register with combined ticket IDs |
| SCAN TICKET (Webhook) | Check-in endpoint | Path: /v1/scanner |
| Parse Barcode (Code) | Parses incoming scanner payload | Expects JSON in body.barcode |
| Get Tickets (Google Sheets) | Lookup ticket by Ticket ID | Filters Tickets tab by Ticket ID |
| Ticket Available? (If) | Validates existence & Checked In status | Branches to update or return error |
| Update Ticket Status (Google Sheets) | Mark Checked In = YES | Sets Checkin TIme to scannedAt |
| Checked IN / Already Checked IN (RespondToWebhook) | Respond payloads for scanner | JSON responses with status & metadata |
| Problem | Cause | Solution |
|---|---|---|
| Invalid QR / scanner returns "Invalid QR code format" | Scanner payload not sending barcode JSON or malformed JSON | Ensure scanner POST body contains valid JSON string under body.barcode; validate payload in Parse Barcode node |
| Ticket exists but cannot update | Google Sheets API auth / permission error | Reconnect Google Sheets OAuth2 credential; ensure the service account/user has edit access to the sheet |
| Emails not sent | Gmail OAuth2 credential missing or Gmail API quota reached | Reauthorize Gmail credential; consider switching to SendGrid/Mailgun for large volumes |
| Duplicate check-in allowed | Logic checking "Checked In" value mismatch (case/format) | Normalize the Checked In field values and use strict comparisons in Ticket Available? node |
| Slow generation for many tickets | Sequential QR calls and sends | Use parallel execution or a dedicated email service; increase worker resources for n8n instance |
Created by: Khmuhtadin
Category: Event Automation, Ticketing Backend
Tags: google-sheets, gmail, qr-code, webhook, ticketing
Need custom workflows or help adapting this for your event? Contact us
Note: Import the JSON into your n8n instance to get started.
My Social:
Threads LinkedIn Medium Workflow Collections portfolio


