AutomationFlowsEmail & Gmail › Automate Verified Visitor Management with Email Verification, Badges & Slack…

Automate Verified Visitor Management with Email Verification, Badges & Slack…

Original n8n title: Automate Verified Visitor Management with Email Verification, Badges & Slack Alerts

ByJitesh Dugar @jiteshdugar on n8n.io

Transform your visitor management process with this fully automated, enterprise-grade workflow. The Verified Visitor Pass Generator eliminates manual data entry, prevents fake registrations through email verification, and creates professional branded visitor passes in under 30…

Webhook trigger★★★★☆ complexity22 nodesN8N Nodes HtmlcsstoimageGmailSlackGoogle SheetsN8N Nodes VerifiemailStop And Error
Email & Gmail Trigger: Webhook Nodes: 22 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #10443 — we link there as the canonical source.

This workflow follows the Gmail → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "",
  "name": "Verified Visitor Pass Generator",
  "tags": [],
  "nodes": [
    {
      "id": "c897caf3-b83b-46fd-9eb3-a73ea8b563a1",
      "name": "Set - Extract Form Data",
      "type": "n8n-nodes-base.set",
      "position": [
        192,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4276ef9c-3abd-4b5b-8187-56ac307c5a13",
              "name": "visitorName",
              "type": "string",
              "value": "={{ $json.body[0]['Full Name'].first + ' ' + $json.body[0]['Full Name'].last }}"
            },
            {
              "id": "5cb740d2-679e-4fc8-a6e1-264ee34ba06e",
              "name": "firstName",
              "type": "string",
              "value": "={{ $json.body[0]['Full Name'].first }}"
            },
            {
              "id": "c99fe4bc-fdc9-4290-9e0d-429917a0606c",
              "name": "lastName",
              "type": "string",
              "value": "={{ $json.body[0]['Full Name'].last }}"
            },
            {
              "id": "2b5e9fe9-cf86-4c9f-b85b-bb0a459c632d",
              "name": "visitorEmail",
              "type": "string",
              "value": "={{ $json.body[0].Email }}"
            },
            {
              "id": "ec0336a1-0421-4a51-964d-2a85b245de0a",
              "name": "visitDate",
              "type": "string",
              "value": "={{ $json.body[0]['Visit Date '].year }}-{{ $json.body[0]['Visit Date '].month.padStart(2, '0') }}-{{ $json.body[0]['Visit Date '].day.padStart(2, '0') }}"
            },
            {
              "id": "23e49d51-97c9-4ae7-b23c-73919c657d09",
              "name": "visitDateFormatted",
              "type": "string",
              "value": "={{ $json.body[0]['Visit Date '].month }}/{{ $json.body[0]['Visit Date '].day }}/{{ $json.body[0]['Visit Date '].year }}"
            },
            {
              "id": "c89c6db2-c36e-4ead-a06f-35d1d892f367",
              "name": "purpose",
              "type": "string",
              "value": "={{ $json.body[0]['Purpose of Visit'] }}"
            },
            {
              "id": "03695cab-73b4-4434-b12f-d1e73e2ad0fd",
              "name": "company",
              "type": "string",
              "value": "={{ $json.body[0]['Company/Organization'] }}"
            },
            {
              "id": "090d4bce-785d-4197-8786-f256e90bdf1c",
              "name": " photoUrl",
              "type": "string",
              "value": "={{ $json.body[0][\"Profile Photo\"] }}"
            },
            {
              "id": "001b90de-55f0-44fc-9e76-b86a667cac1d",
              "name": " submissionId",
              "type": "string",
              "value": "={{ $now.format('yyyyMMddHHmmss') }}"
            },
            {
              "id": "72a3157b-8e06-4765-bb21-351b140c3e3e",
              "name": " timestamp",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "01532eac-8645-4137-b17e-283a31800072",
      "name": "IF - Check Email Valid",
      "type": "n8n-nodes-base.if",
      "position": [
        944,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "email-valid-check",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.valid }}",
              "rightValue": "valid"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d2f63287-e0f0-41e2-bc7a-141a8fa05367",
      "name": "Function - Generate Visitor ID & QR",
      "type": "n8n-nodes-base.code",
      "position": [
        1360,
        288
      ],
      "parameters": {
        "jsCode": "// Get visitor data from the Set node\nconst visitorData = $('Set - Extract Form Data').item.json;\n\n// Generate unique visitor ID\nconst timestamp = Date.now();\nconst dateStr = new Date().toISOString().split('T')[0].replace(/-/g, '');\nconst visitorId = `VIS-${dateStr}-${timestamp.toString().slice(-6)}`;\n\n// Create QR code data with all visitor information\nconst qrCodeData = JSON.stringify({\n  id: visitorId,\n  name: visitorData.visitorName,\n  email: visitorData.visitorEmail,\n  date: visitorData.visitDate,\n  purpose: visitorData.purpose,\n  company: visitorData.company,\n  timestamp: new Date().toISOString(),\n  verified: true\n});\n\n// Simple format for basic QR readers (alternative)\nconst qrCodeSimple = `VISITOR|${visitorId}|${visitorData.visitorName}|${visitorData.visitDate}|${visitorData.company}`;\n\n// Generate QR code image URL\nconst qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(qrCodeSimple)}`;\n\n// Alternative high-quality QR code API\nconst qrCodeUrlAlt = `https://quickchart.io/qr?text=${encodeURIComponent(qrCodeSimple)}&size=300&margin=2`;\n\n// Return the generated data\nreturn {\n  json: {\n    visitorId: visitorId,\n    qrCodeData: qrCodeData,\n    qrCodeSimple: qrCodeSimple,\n    qrCodeUrl: qrCodeUrl,\n    qrCodeUrlAlt: qrCodeUrlAlt,\n    generatedAt: new Date().toISOString()\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "d1630c9e-05c5-43ae-9370-e22a778d86d5",
      "name": "HTML/CSS to Image",
      "type": "n8n-nodes-htmlcsstoimage.htmlCssToImage",
      "position": [
        1712,
        288
      ],
      "parameters": {
        "html_content": "=<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<style>\n  * { margin: 0; padding: 0; box-sizing: border-box; }\n  body {\n    font-family: 'Segoe UI', 'Roboto', 'Arial', sans-serif;\n    background: #f5f5f5;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    min-height: 100vh;\n    padding: 20px;\n  }\n  .badge-container {\n    width: 400px;\n    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n    border-radius: 20px;\n    padding: 40px 30px;\n    box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n    position: relative;\n    overflow: hidden;\n  }\n  .badge-container::before {\n    content: '';\n    position: absolute;\n    top: -50%;\n    right: -50%;\n    width: 200%;\n    height: 200%;\n    background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);\n    pointer-events: none;\n  }\n  .header {\n    text-align: center;\n    margin-bottom: 20px;\n    position: relative;\n    z-index: 1;\n  }\n  .logo {\n    width: 80px;\n    height: 80px;\n    background: white;\n    border-radius: 50%;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    margin-bottom: 10px;\n    box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n  }\n  .logo-text {\n    font-size: 24px;\n    font-weight: bold;\n    color: #667eea;\n  }\n  .badge-title {\n    color: white;\n    font-size: 14px;\n    text-transform: uppercase;\n    letter-spacing: 2px;\n    font-weight: 300;\n  }\n  .visitor-photo-container {\n    text-align: center;\n    margin: 25px 0;\n    position: relative;\n    z-index: 1;\n  }\n  .visitor-photo {\n    width: 140px;\n    height: 140px;\n    border-radius: 50%;\n    border: 5px solid white;\n    object-fit: cover;\n    box-shadow: 0 8px 25px rgba(0,0,0,0.3);\n    background: white;\n  }\n  .verified-badge {\n    position: absolute;\n    bottom: 5px;\n    right: calc(50% - 70px);\n    background: #27ae60;\n    color: white;\n    width: 35px;\n    height: 35px;\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 18px;\n    border: 3px solid white;\n    box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n  }\n  .visitor-name {\n    text-align: center;\n    font-size: 32px;\n    font-weight: bold;\n    color: white;\n    margin: 20px 0 10px;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    text-shadow: 0 2px 10px rgba(0,0,0,0.2);\n    position: relative;\n    z-index: 1;\n  }\n  .visitor-id {\n    text-align: center;\n    font-size: 12px;\n    color: rgba(255,255,255,0.8);\n    margin-bottom: 20px;\n    font-family: 'Courier New', monospace;\n    letter-spacing: 1px;\n    position: relative;\n    z-index: 1;\n  }\n  .details-section {\n    background: rgba(255,255,255,0.15);\n    backdrop-filter: blur(10px);\n    border-radius: 15px;\n    padding: 20px;\n    margin: 20px 0;\n    border: 1px solid rgba(255,255,255,0.2);\n    position: relative;\n    z-index: 1;\n  }\n  .detail-row {\n    display: flex;\n    align-items: center;\n    margin: 12px 0;\n    color: white;\n  }\n  .detail-icon {\n    font-size: 20px;\n    margin-right: 12px;\n    width: 25px;\n  }\n  .detail-label {\n    font-size: 11px;\n    text-transform: uppercase;\n    opacity: 0.8;\n    letter-spacing: 1px;\n    margin-bottom: 3px;\n  }\n  .detail-value {\n    font-size: 15px;\n    font-weight: 600;\n  }\n  .qr-section {\n    background: white;\n    padding: 20px;\n    border-radius: 15px;\n    text-align: center;\n    margin-top: 20px;\n    box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n    position: relative;\n    z-index: 1;\n  }\n  .qr-title {\n    font-size: 12px;\n    color: #666;\n    margin-bottom: 10px;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n  }\n  .qr-code {\n    width: 200px;\n    height: 200px;\n    margin: 0 auto;\n  }\n  .footer {\n    text-align: center;\n    margin-top: 20px;\n    padding-top: 15px;\n    border-top: 1px solid rgba(255,255,255,0.2);\n    color: white;\n    font-size: 11px;\n    opacity: 0.9;\n    position: relative;\n    z-index: 1;\n  }\n  .status-verified {\n    display: inline-block;\n    background: #27ae60;\n    color: white;\n    padding: 4px 12px;\n    border-radius: 20px;\n    font-size: 10px;\n    font-weight: bold;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    margin-top: 5px;\n  }\n</style>\n</head>\n<body>\n  <div class=\"badge-container\">\n    <div class=\"header\">\n      <div class=\"logo\">\n        <span class=\"logo-text\">MJ</span>\n      </div>\n      <div class=\"badge-title\">Visitor Pass</div>\n    </div>\n    \n    <div class=\"visitor-photo-container\">\n      <img src=\"{{ $('Set - Extract Form Data').item.json[' photoUrl'] }}\" class=\"visitor-photo\" alt=\"Visitor Photo\" onerror=\"this.src='https://ui-avatars.com/api/?name={{ encodeURIComponent($('Set - Extract Form Data').item.json.visitorName) }}&size=200&background=667eea&color=fff&bold=true'\">\n      <div class=\"verified-badge\">\u2713</div>\n    </div>\n    \n    <div class=\"visitor-name\">{{ $('Set - Extract Form Data').item.json.visitorName }}</div>\n    <div class=\"visitor-id\">ID: {{ $json.visitorId }}</div>\n    \n    <div class=\"details-section\">\n      <div class=\"detail-row\">\n        <span class=\"detail-icon\">\ud83d\udcc5</span>\n        <div>\n          <div class=\"detail-label\">Visit Date</div>\n          <div class=\"detail-value\">{{ $('Set - Extract Form Data').item.json.visitDateFormatted }}</div>\n        </div>\n      </div>\n      \n      <div class=\"detail-row\">\n        <span class=\"detail-icon\">\ud83c\udfaf</span>\n        <div>\n          <div class=\"detail-label\">Purpose</div>\n          <div class=\"detail-value\">{{ $('Set - Extract Form Data').item.json.purpose }}</div>\n        </div>\n      </div>\n      \n      <div class=\"detail-row\">\n        <span class=\"detail-icon\">\ud83c\udfe2</span>\n        <div>\n          <div class=\"detail-label\">Company</div>\n          <div class=\"detail-value\">{{ $('Set - Extract Form Data').item.json.company }}</div>\n        </div>\n      </div>\n    </div>\n    \n    <div class=\"qr-section\">\n      <div class=\"qr-title\">Scan for Entry</div>\n      <img src=\"{{ $json.qrCodeUrl }}\" class=\"qr-code\" alt=\"QR Code\">\n    </div>\n    \n    <div class=\"footer\">\n      <div class=\"status-verified\">\u2713 VERIFIED ENTRY</div>\n      <div style=\"margin-top:8px;\">MediaJade Coworking Space</div>\n      <div>{{ $('Set - Extract Form Data').item.json[' timestamp'] }}</div>\n    </div>\n  </div>\n</body>\n</html>"
      },
      "credentials": {
        "htmlcsstoimgApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "24b92189-7f95-46a8-a65b-426070b99316",
      "name": "Send a message1",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2208,
        0
      ],
      "parameters": {
        "sendTo": "={{ $('Set - Extract Form Data').item.json.visitorEmail }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n<style>\n  body { font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; }\n  .email-container { max-width: 600px; margin: 0 auto; background: #ffffff; }\n  .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px 20px; text-align: center; }\n  .header h1 { margin: 0; font-size: 28px; }\n  .header p { margin: 10px 0 0; opacity: 0.9; }\n  .content { padding: 40px 30px; }\n  .badge-preview { text-align: center; margin: 30px 0; }\n  .badge-preview img { max-width: 100%; height: auto; border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,0.2); }\n  .info-box { background: #f8f9fa; border-left: 4px solid #667eea; padding: 20px; margin: 25px 0; border-radius: 5px; }\n  .info-box h3 { margin: 0 0 15px; color: #667eea; font-size: 18px; }\n  .info-row { display: flex; margin: 10px 0; }\n  .info-label { font-weight: bold; min-width: 120px; color: #555; }\n  .info-value { color: #333; }\n  .instructions { background: #fff3cd; border: 1px solid #ffc107; padding: 20px; border-radius: 5px; margin: 25px 0; }\n  .instructions h3 { margin: 0 0 10px; color: #856404; }\n  .button { display: inline-block; padding: 15px 40px; background: #667eea; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; font-weight: bold; }\n  .footer { background: #f1f3f5; padding: 30px; text-align: center; color: #666; font-size: 14px; }\n</style>\n</head>\n<body>\n<div class=\"email-container\">\n  <div class=\"header\">\n    <h1>\u2705 Visitor Pass Verified & Issued</h1>\n    <p>Welcome to MediaJade Coworking Space</p>\n  </div>\n  \n  <div class=\"content\">\n    <p>Dear <strong>{{ $('Set - Extract Form Data').item.json.visitorName }}</strong>,</p>\n    \n    <p>Great news! Your visitor pass has been verified and is now ready to use. We look forward to welcoming you to our space.</p>\n    \n    <div class=\"info-box\">\n      <h3>\ud83d\udccb Your Visit Details</h3>\n      <div class=\"info-row\">\n        <span class=\"info-label\">Visitor ID:</span>\n        <span class=\"info-value\">{{ $('Function - Generate Visitor ID & QR').item.json.visitorId }}</span>\n      </div>\n      <div class=\"info-row\">\n        <span class=\"info-label\">Visit Date:</span>\n        <span class=\"info-value\">{{ $('Set - Extract Form Data').item.json.visitDateFormatted }}</span>\n      </div>\n      <div class=\"info-row\">\n        <span class=\"info-label\">Purpose:</span>\n        <span class=\"info-value\">{{ $('Set - Extract Form Data').item.json.purpose }}</span>\n      </div>\n      <div class=\"info-row\">\n        <span class=\"info-label\">Company:</span>\n        <span class=\"info-value\">{{ $('Set - Extract Form Data').item.json.company }}</span>\n      </div>\n    </div>\n    \n    <div class=\"badge-preview\">\n      <h3>Your Digital Visitor Pass</h3>\n      <img src=\"{{ $json.image_url }}\" alt=\"Your Visitor Pass\">\n      <p style=\"color: #666; font-size: 14px; margin-top: 10px;\">Please save this pass or show this email at reception</p>\n    </div>\n    \n    <div class=\"instructions\">\n      <h3>\ud83d\udcf1 How to Use Your Pass</h3>\n      <ol style=\"margin: 10px 0 0 20px; padding: 0;\">\n        <li><strong>Digital:</strong> Show this email on your phone at reception</li>\n        <li><strong>QR Code:</strong> Our staff will scan your QR code for instant verification</li>\n        <li><strong>ID Check:</strong> Please bring a valid photo ID for security purposes</li>\n        <li><strong>Arrival:</strong> Check in at the reception desk on arrival</li>\n      </ol>\n    </div>\n    \n    <div style=\"background: #e8f4fd; padding: 20px; border-radius: 5px; margin: 25px 0;\">\n      <h3 style=\"color: #0066cc; margin: 0 0 10px;\">\ud83c\udfe2 Location & Arrival</h3>\n      <p style=\"margin: 5px 0;\"><strong>Address:</strong> MediaJade Coworking, 123 Business Street</p>\n      <p style=\"margin: 5px 0;\"><strong>Reception Hours:</strong> Monday-Friday, 8:00 AM - 6:00 PM</p>\n      <p style=\"margin: 5px 0;\"><strong>Contact:</strong> +1 (555) 123-4567</p>\n    </div>\n    \n    <p><strong>Need to make changes?</strong> Please contact our reception team at least 24 hours before your visit.</p>\n    \n    <p style=\"margin-top: 30px;\">We're excited to host you!</p>\n    \n    <p>Best regards,<br>\n    <strong>Reception Team</strong><br>\n    MediaJade Coworking Space</p>\n  </div>\n  \n  <div class=\"footer\">\n    <p><strong>Contact Us</strong></p>\n    <p>\ud83d\udce7 reception@mediajade.com | \ud83d\udcde +1 (555) 123-4567</p>\n    <p style=\"margin-top: 20px; font-size: 12px;\">This is an automated message generated by our visitor management system.</p>\n  </div>\n</div>\n</body>\n</html>",
        "options": {},
        "subject": "=\ud83c\udfab Your Verified Visitor Pass - {{ $('Set - Extract Form Data').item.json.visitDateFormatted }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "8b759709-dbea-4680-932d-4bffd248e037",
      "name": "Slack - Notify Security Team",
      "type": "n8n-nodes-base.slack",
      "position": [
        2320,
        288
      ],
      "parameters": {
        "text": "=\ud83d\udfe2 *New Verified Visitor*\n\n\ud83d\udc64 *Name:* {{ $('Set - Extract Form Data').item.json.visitorName }}\n\ud83d\udce7 *Email:* {{ $('Set - Extract Form Data').item.json.visitorEmail }}\n\ud83d\udcc5 *Visit Date:* {{ $('Set - Extract Form Data').item.json.visitDate }}\n\ud83c\udfaf *Purpose:* {{ $('Set - Extract Form Data').item.json.purpose }}\n\ud83c\udfe2 *Company:* {{ $('Set - Extract Form Data').item.json.company }}\n\ud83c\udd94 *Visitor ID:* {{ $('Function - Generate Visitor ID & QR').item.json.visitorId }}\n\u2705 *Status:* Email Verified & Pass Sent\n\u23f0 *Submitted:* {{ $('Set - Extract Form Data').item.json[' timestamp'] }}\n\n\ud83d\udcce Badge Image: {{ $json.image_url }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR SLACK CHANNEL ID",
          "cachedResultName": "YOUR SLACK CHANNEL NAME"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8f13df6c-3418-464d-b333-4ff900c2ebc0",
      "name": "Google Sheets - Log Visitor",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2224,
        560
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $('Set - Extract Form Data').item.json.visitorEmail }}",
            "Status": "Pass Sent",
            "Company": "={{ $('Set - Extract Form Data').item.json.company }}",
            "Purpose": "={{ $('Set - Extract Form Data').item.json.purpose }}",
            "Full Name": "={{ $('Set - Extract Form Data').item.json.visitorName }}",
            "Timestamp": "={{ $('Set - Extract Form Data').item.json[\" timestamp\"] }}",
            "Visit Date": "={{ $('Set - Extract Form Data').item.json.visitDate }}",
            "Visitor ID": "={{ $('Function - Generate Visitor ID & QR').item.json.visitorId }}",
            "Email Verified": "Yes",
            "Badge Image URL": "={{ $json.image_url }}"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Visitor ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Visitor ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Full Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Visit Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Visit Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Purpose",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Purpose",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Verified",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email Verified",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Badge Image URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Badge Image URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR GOOGLE SHEETS DOCUMENT ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR GOOGLE SHEETS DOCUMENT ID/edit?usp=drivesdk",
          "cachedResultName": "Workshop Registrations & Certificates"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "0df8d27a-411a-4e4b-be7b-d40ea8c78691",
      "name": "Verifi Email",
      "type": "n8n-nodes-verifiemail.verifiEmail",
      "position": [
        592,
        384
      ],
      "parameters": {
        "email": "={{ $json.visitorEmail }}"
      },
      "credentials": {
        "verifiEmailApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d6dd5889-309a-4f37-a55a-b4c80425baa2",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -224,
        384
      ],
      "parameters": {
        "path": "visitor-registration",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "31b44373-0af2-46d4-8b0b-6fd85824bd12",
      "name": "Stop and Error",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        1360,
        528
      ],
      "parameters": {
        "errorMessage": "Invalid Email"
      },
      "typeVersion": 1
    },
    {
      "id": "922d05d1-426d-426b-918c-36065bc8b2b1",
      "name": "Sticky Note - Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -736
      ],
      "parameters": {
        "color": 4,
        "width": 347,
        "height": 368,
        "content": "## \ud83c\udfaf WORKFLOW OVERVIEW\n\n**Purpose:** Automated Verified Visitor Pass System for Coworking Spaces\n\n**Key Benefits:**\n- \u26a1 Instant visitor pass generation (30 seconds)\n- \ud83d\udd12 Email verification prevents fake entries\n- \ud83d\udcf1 Digital & printable passes\n- \ud83c\udfa8 Professional branded badges\n- \ud83d\udcca Complete audit trail\n- \ud83e\udd16 100% automated workflow\n\n**Processing Time:** ~30 seconds per visitor\n**Success Rate:** 99%+ with valid emails\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b3f56e5d-a276-4c20-aff6-f2ffe8cfd524",
      "name": "Sticky Note - Credentials",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -752,
        -352
      ],
      "parameters": {
        "color": 5,
        "width": 443,
        "height": 660,
        "content": "## \ud83d\udd10 CREDENTIALS SETUP GUIDE\n\n### Required Credentials (5 Total)\n\n### 1\ufe0f\u20e3 VerifiEmail API\n Go to: https://verifi.email\n\n### 2\ufe0f\u20e3 HTMLCSSToImage API\n Go to: https://htmlcsstoimg.com\n\n### 3\ufe0f\u20e3 Gmail OAuth2\n In n8n: Credentials \u2192 Add \u2192 Gmail OAuth2\n\n### 4\ufe0f\u20e3 Slack API\n1. Go to: https://api.slack.com/apps\n2. Create New App \u2192 From scratch\n3. Name: \"Visitor Alerts\"\n\n### 5\ufe0f\u20e3 Google Sheets OAuth2\n**Setup Steps:**\n1. Create spreadsheet: \"Visitor Log\"\n2. Add headers: Timestamp, Visitor ID, Full Name, Email, Visit Date, Purpose, Company, Email Verified, Badge Image URL, Status\n3. In n8n: Credentials \u2192 Add \u2192 Google Sheets OAuth2\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b24936a8-334b-4035-a367-fdc51a26e2b7",
      "name": "Sticky Note - Webhook",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        -16
      ],
      "parameters": {
        "color": 6,
        "width": 367,
        "height": 532,
        "content": "## \ud83d\udce5 STEP 1: WEBHOOK TRIGGER\n\n**Expected Input Format:**\n```json\n{\n  \"Full Name\": {\n    \"first\": \"John\",\n    \"last\": \"Doe\"\n  },\n  \"Email\": \"john@example.com\",\n  \"Profile Photo\": \"https://...\",\n  \"Visit Date \": {\n    \"month\": \"11\",\n    \"day\": \"05\",\n    \"year\": \"2025\"\n  },\n  \"Purpose of Visit\": \"Meeting\",\n  \"Company/Organization\": \"ABC Corp\"\n}\n```\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e0297444-b797-411b-9df5-b2c2ad9fe2dd",
      "name": "Sticky Note - Set Extract",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        112
      ],
      "parameters": {
        "color": 6,
        "width": 383,
        "height": 424,
        "content": "## \ud83d\udd04 STEP 2: EXTRACT & ORGANIZE DATA\n\n**What It Does:**\n- Extracts visitor information from nested JSON\n- Combines first and last name into full name\n- Formats visit date in multiple ways (ISO & display)\n- Adds submission timestamp\n- Creates unique submission ID\n- Normalizes all field names for easy reference\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a6716cea-e840-42d5-a632-860890132bab",
      "name": "Sticky Note - Verifi Email",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        496,
        112
      ],
      "parameters": {
        "color": 6,
        "width": 335,
        "height": 416,
        "content": "## \u2705 STEP 3: EMAIL VERIFICATION\n\n**What It Does:**\n- Verifies email format is correct\n- Checks if domain exists and has MX records\n- Validates mailbox actually exists\n- Detects disposable/temporary emails\n- Identifies spam/risky addresses\n- Returns verification status and details\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c1760877-16f2-4416-ba40-89288fd91ff1",
      "name": "Sticky Note - IF Node",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        144
      ],
      "parameters": {
        "color": 6,
        "width": 383,
        "height": 384,
        "content": "## \ud83d\udd00 STEP 4: VALIDATION DECISION POINT\n\n**What It Does:**\n- Checks if email verification passed\n- Splits workflow into two paths:\n  - \u2705 TRUE = Valid email \u2192 Continue to badge generation\n  - \u274c FALSE = Invalid email \u2192 Stop with error\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "373d6fcc-490c-4625-9606-4008585158af",
      "name": "Sticky Note - Function",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1248,
        48
      ],
      "parameters": {
        "color": 6,
        "width": 383,
        "height": 396,
        "content": "## \ud83c\udd94 STEP 5: GENERATE VISITOR ID & QR CODE\n\n**What It Does:**\n- Generates unique visitor ID with timestamp\n- Creates QR code data with full visitor info\n- Provides two QR formats (JSON & simple text)\n- Generates QR code image URLs\n- Adds verification timestamp\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7a69ca42-4c7a-4d27-a58a-a59ad8ebbab1",
      "name": "Sticky Note - HTML to Image",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1648,
        -160
      ],
      "parameters": {
        "color": 6,
        "width": 367,
        "height": 596,
        "content": "## \ud83c\udfa8 STEP 6: CREATE VISITOR BADGE IMAGE\n\n**HTML Template Structure:**\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502    [Logo] Visitor Pass      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502      [\u2713 Photo]              \u2502\n\u2502    VISITOR NAME             \u2502\n\u2502  ID: VIS-20251103-234567    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \ud83d\udcc5 Visit Date: 11/05/2025   \u2502\n\u2502 \ud83c\udfaf Purpose: Meeting         \u2502\n\u2502 \ud83c\udfe2 Company: ABC Corp        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502     [QR CODE IMAGE]         \u2502\n\u2502    Scan for Entry           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502  \u2713 VERIFIED ENTRY           \u2502\n\u2502  MediaJade Coworking        \u2502\n\u2502  2025-11-03T14:55:30Z       \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ae0d79a7-33ae-457b-81c0-bd3658dbd972",
      "name": "Sticky Note - Email",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        -240
      ],
      "parameters": {
        "color": 6,
        "width": 383,
        "height": 388,
        "content": "## \ud83d\udce7 STEP 7: EMAIL VISITOR PASS\n\n**What It Does:**\n- Sends professional HTML email\n- Includes visitor pass badge image\n- Provides visit details and instructions\n- Gives location and contact info\n- Confirms verification status\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0d44e4e6-add8-4e61-ac3a-aa0e6e1b0a6b",
      "name": "Sticky Note - Slack",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        192
      ],
      "parameters": {
        "color": 6,
        "width": 479,
        "height": 308,
        "content": "## \ud83d\udcac STEP 8: SLACK SECURITY ALERT\n\n**Why Slack Notifications:**\n- \u2705 Real-time alerts (instant)\n- \u2705 Mobile push notifications\n- \u2705 Team collaboration\n- \u2705 Searchable history\n- \u2705 No email clutter\n- \u2705 Easy to respond/discuss\n- \u2705 Audit trail\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "70256371-d8a1-4e0c-9118-30edcb8887ad",
      "name": "Sticky Note - Sheets",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        544
      ],
      "parameters": {
        "color": 6,
        "width": 351,
        "height": 712,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n## \ud83d\udcca STEP 9: LOG TO GOOGLE SHEETS\n\n**What It Does:**\n- Appends new row to spreadsheet\n- Records all visitor information\n- Logs badge image URL\n- Tracks verification status\n- Creates searchable audit trail\n\n**Spreadsheet Columns:**\n\n1. **Timestamp** \n2. **Visitor ID**\n3. **Full Name** \n4. **Email**\n5. **Visit Date**\n6. **Purpose**\n7. **Company**\n8. **Email Verified**\n9. **Badge Image URL** \n10. **Status**\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0d03ee1f-d600-40c3-b34d-e7be412996f8",
      "name": "Sticky Note - Stop Error",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1248,
        512
      ],
      "parameters": {
        "color": 6,
        "width": 335,
        "height": 448,
        "content": "\n\n\n\n\n\n\n\n\n\n\n## \u274c STEP 4B: INVALID EMAIL HANDLING\n\n**What It Does:**\n- Terminates workflow execution\n- Shows error message: \"Invalid Email\"\n- Prevents fake visitor entries\n- No badge created\n- No email sent\n- No resources wasted\n\n**Error Message:**\n\"Invalid Email\"\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Set - Extract Form Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verifi Email": {
      "main": [
        [
          {
            "node": "IF - Check Email Valid",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML/CSS to Image": {
      "main": [
        [
          {
            "node": "Send a message1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Slack - Notify Security Team",
            "type": "main",
            "index": 0
          },
          {
            "node": "Google Sheets - Log Visitor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Check Email Valid": {
      "main": [
        [
          {
            "node": "Function - Generate Visitor ID & QR",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Stop and Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set - Extract Form Data": {
      "main": [
        [
          {
            "node": "Verifi Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Function - Generate Visitor ID & QR": {
      "main": [
        [
          {
            "node": "HTML/CSS to Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Transform your visitor management process with this fully automated, enterprise-grade workflow. The Verified Visitor Pass Generator eliminates manual data entry, prevents fake registrations through email verification, and creates professional branded visitor passes in under 30…

Source: https://n8n.io/workflows/10443/ — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

Automate press credential verification and badge generation for journalists covering your events

Stop And Error, Gmail, Slack +3
Email & Gmail

Automated email verification and welcome email workflow that validates new user signups, prevents fake emails, and creates a seamless onboarding experience with real-time team notifications.

N8N Nodes Verifiemail, Slack, Google Sheets +2
Email & Gmail

Automatically generate, validate, and deliver professional course completion certificates with zero manual work — from webhook request to PDF delivery in seconds.

Gmail, Google Sheets, Error Trigger +4
Email & Gmail

A comprehensive n8n workflow template for automating e-commerce return processes with fraud prevention and professional document generation. E-commerce businesses preventing fraudulent returns Custome

N8N Nodes Verifiemail, Stop And Error, N8N Nodes Htmlcsstopdf +2
Email & Gmail

Transform your referral program into a fully automated, fraud-resistant system that delivers professional rewards to verified referrers. This workflow combines email validation, dynamic coupon generat

Gmail, Google Sheets, N8N Nodes Verifiemail +1